diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index e8842e81f24..d11cc95810b 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -27,7 +27,7 @@ if (Datum.is_processing) {\ PRINT_STACK_TRACE("Failed to start processing. [log_info_line(Datum)] is already being processed by [Datum.is_processing] but queue attempt occured on [#Processor]."); \ }\ } else {\ - Datum.is_processing = #Processor;\ + Datum.is_processing = Processor._internal_name;\ Processor.processing += Datum;\ } @@ -125,6 +125,9 @@ if(Datum.is_processing) {\ NEW_SS_GLOBAL(SS##X);\ PreInit();\ }\ +/datum/controller/subsystem/##X{\ + _internal_name = "SS" + #X;\ +}\ /datum/controller/subsystem/##X #define PROCESSING_SUBSYSTEM_DEF(X) var/global/datum/controller/subsystem/processing/##X/SS##X;\ @@ -137,4 +140,5 @@ if(Datum.is_processing) {\ processing = SS##X.processing; \ }\ }\ -/datum/controller/subsystem/processing/##X +/datum/controller/subsystem/processing/##X/_internal_name = "SS" + #X;\ +/datum/controller/subsystem/processing/##X \ No newline at end of file diff --git a/code/__defines/_byond_version_compat.dm b/code/__defines/_byond_version_compat.dm new file mode 100644 index 00000000000..72ad8942ae7 --- /dev/null +++ b/code/__defines/_byond_version_compat.dm @@ -0,0 +1,47 @@ +#define REQUIRED_DM_VERSION 514 + +#if DM_VERSION < REQUIRED_DM_VERSION +#warn Nebula is not tested on BYOND versions older than 514. The code may not compile, and if it does compile it may have severe problems. +#endif + +// 515 split call for external libraries into call_ext +#if DM_VERSION < 515 +#define LIBCALL call +#else +#define LIBCALL call_ext +#endif + +// So we want to have compile time guarantees these methods exist on local type, unfortunately 515 killed the .proc/procname and .verb/verbname syntax so we have to use nameof() +// For the record: GLOBAL_VERB_REF would be useless as verbs can't be global. + +#if DM_VERSION < 515 + +/// Call by name proc references, checks if the proc exists on either this type or as a global proc. +#define PROC_REF(X) (.proc/##X) +/// Call by name verb references, checks if the verb exists on either this type or as a global verb. +#define VERB_REF(X) (.verb/##X) + +/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc +#define TYPE_PROC_REF(TYPE, X) (##TYPE.proc/##X) +/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb +#define TYPE_VERB_REF(TYPE, X) (##TYPE.verb/##X) + +/// Call by name proc reference, checks if the proc is an existing global proc +#define GLOBAL_PROC_REF(X) (/proc/##X) + +#else + +/// Call by name proc references, checks if the proc exists on either this type or as a global proc. +#define PROC_REF(X) (nameof(.proc/##X)) +/// Call by name verb references, checks if the verb exists on either this type or as a global verb. +#define VERB_REF(X) (nameof(.verb/##X)) + +/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc +#define TYPE_PROC_REF(TYPE, X) (nameof(##TYPE.proc/##X)) +/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb +#define TYPE_VERB_REF(TYPE, X) (nameof(##TYPE.verb/##X)) + +/// Call by name proc reference, checks if the proc is an existing global proc +#define GLOBAL_PROC_REF(X) (/proc/##X) + +#endif \ No newline at end of file diff --git a/code/__defines/_compile_options.dm b/code/__defines/_compile_options.dm index a4788ec0da6..d2f61e13dca 100644 --- a/code/__defines/_compile_options.dm +++ b/code/__defines/_compile_options.dm @@ -1,9 +1,3 @@ // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary. // 1 will enable set background. 0 will disable set background. #define BACKGROUND_ENABLED 0 - -#define REQUIRED_DM_VERSION 514 - -#if DM_VERSION < REQUIRED_DM_VERSION -#warn Nebula is not tested on BYOND versions older than 514. The code may not compile, and if it does compile it may have severe problems. -#endif diff --git a/code/__defines/aspects.dm b/code/__defines/aspects.dm index e1498bae6d7..6e7619db774 100644 --- a/code/__defines/aspects.dm +++ b/code/__defines/aspects.dm @@ -51,4 +51,19 @@ model = MODEL_PATH; \ parent = /decl/aspect/prosthetic_limb/right_leg; \ aspect_cost = COST; \ +} \ +/decl/aspect/prosthetic_limb/head/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/aspect/prosthetic_limb/head; \ + aspect_cost = COST * 0.5; \ +} \ +/decl/aspect/prosthetic_limb/chest/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/aspect/prosthetic_limb/chest; \ + aspect_cost = COST * 0.5; \ +} \ +/decl/aspect/prosthetic_limb/groin/##MODEL_ID { \ + model = MODEL_PATH; \ + parent = /decl/aspect/prosthetic_limb/groin; \ + aspect_cost = COST * 0.5; \ } diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index 721851ffaf3..ea0ee8803cf 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -62,9 +62,12 @@ #define MAT_SOLVENT_MODERATE 2 #define MAT_SOLVENT_STRONG 3 -#define DIRTINESS_STERILE -2 -#define DIRTINESS_CLEAN -1 -#define DIRTINESS_NEUTRAL 0 +#define DIRTINESS_DECONTAMINATE -3 +#define DIRTINESS_STERILE -2 +#define DIRTINESS_CLEAN -1 +#define DIRTINESS_NEUTRAL 0 #define DEFAULT_GAS_ACCELERANT /decl/material/gas/hydrogen #define DEFAULT_GAS_OXIDIZER /decl/material/gas/oxygen + +#define CHEM_REACTION_FLAG_OVERFLOW_CONTAINER BITFLAG(0) diff --git a/code/__defines/colors.dm b/code/__defines/colors.dm index 6d7dc906014..599cbbe26a8 100644 --- a/code/__defines/colors.dm +++ b/code/__defines/colors.dm @@ -39,6 +39,7 @@ #define COLOR_GREEN_GRAY "#8daf6a" #define COLOR_DARK_GREEN_GRAY "#54654c" #define COLOR_BLUE_GRAY "#6a97b0" +#define COLOR_MID_BLUE_GRAY "#666699" #define COLOR_DARK_BLUE_GRAY "#3e4855" #define COLOR_SURGERY_BLUE "#e0f2f6" #define COLOR_SUN "#ec8b2f" @@ -92,6 +93,12 @@ #define COLOR_CRYSTAL "#00c8a5" #define COLOR_ASTEROID_ROCK "#735555" #define COLOR_DIAMOND "#d8d4ea" +#define COLOR_BLOOD_RED "#990000" +#define COLOR_PALE_GOLD "#cc9900" +#define COLOR_ROYAL_BLUE "#0033ff" +#define COLOR_VERDANT_GREEN "#287d00" +#define COLOR_SCIENCE_PURPLE "#6633cc" + #define PIPE_COLOR_GREY "#808080" #define PIPE_COLOR_RED "#ff0000" diff --git a/code/__defines/credits.dm b/code/__defines/credits.dm new file mode 100644 index 00000000000..8b70c447345 --- /dev/null +++ b/code/__defines/credits.dm @@ -0,0 +1,4 @@ +#define CREDIT_ROLL_SPEED 185 +#define CREDIT_SPAWN_SPEED 20 +#define CREDIT_ANIMATE_HEIGHT (14 * world.icon_size) +#define CREDIT_EASE_DURATION 22 diff --git a/code/__defines/damage.dm b/code/__defines/damage.dm new file mode 100644 index 00000000000..e3c45646c79 --- /dev/null +++ b/code/__defines/damage.dm @@ -0,0 +1,2 @@ +///The decimal precision for health values. Health will be rounded against this value. +#define HEALTH_ROUNDING 0.01 diff --git a/code/__defines/fires.dm b/code/__defines/fires.dm new file mode 100644 index 00000000000..fa8f4f4a4e1 --- /dev/null +++ b/code/__defines/fires.dm @@ -0,0 +1,4 @@ +#define FUEL_VALUE_RETARDANT -1 +#define FUEL_VALUE_NONE 0 +#define FUEL_VALUE_ACCELERANT 1 +#define FUEL_VALUE_VOLATILE 2 diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index 950e4dc9af1..cc9efae8d51 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -1,11 +1,11 @@ -#define CLOSET_HAS_LOCK 1 -#define CLOSET_CAN_BE_WELDED 2 +#define CLOSET_HAS_LOCK BITFLAG(0) +#define CLOSET_CAN_BE_WELDED BITFLAG(1) -#define CLOSET_STORAGE_MISC 1 -#define CLOSET_STORAGE_ITEMS 2 -#define CLOSET_STORAGE_MOBS 4 -#define CLOSET_STORAGE_STRUCTURES 8 -#define CLOSET_STORAGE_ALL (~0) +#define CLOSET_STORAGE_MISC BITFLAG(0) +#define CLOSET_STORAGE_ITEMS BITFLAG(1) +#define CLOSET_STORAGE_MOBS BITFLAG(2) +#define CLOSET_STORAGE_STRUCTURES BITFLAG(3) +#define CLOSET_STORAGE_ALL (~0) /* Bitflags for flag variables. These are used instead of separate boolean vars to reduce the overall number of variables, @@ -13,7 +13,7 @@ especially on common types like /atom or /atom/movable. - FLAG SETTING // When setting default flags on type definitions, they are combined with bitwise OR: -// atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_TEMP_CHANGE +// atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER // Be mindful of flags set on parent types, as setting flags on a child type will override the parent flags. // Flags are also set at runtime with bitwise OR: // atom_flags |= ATOM_FLAG_CLIMBABLE @@ -34,70 +34,72 @@ The latter will result in a linter warning and will not work correctly. */ // Atom-level flags (/atom/var/atom_flags) -#define ATOM_FLAG_CHECKS_BORDER BITFLAG(0) // If a dense atom (potentially) only blocks movements from a given direction, i.e. window panes -#define ATOM_FLAG_CLIMBABLE BITFLAG(1) // This object can be climbed on -#define ATOM_FLAG_NO_BLOOD BITFLAG(2) // Used for items if they don't want to get a blood overlay. -#define ATOM_FLAG_NO_REACT BITFLAG(3) // Reagents don't react inside this container. -#define ATOM_FLAG_OPEN_CONTAINER BITFLAG(4) // Is an open container for chemistry purposes. -#define ATOM_FLAG_INITIALIZED BITFLAG(5) // Has this atom been initialized -#define ATOM_FLAG_NO_TEMP_CHANGE BITFLAG(6) // Reagents do not cool or heat to ambient temperature in this container. -#define ATOM_FLAG_CAN_BE_PAINTED BITFLAG(7) // Can be painted using a paint sprayer or similar. -#define ATOM_FLAG_SHIELD_CONTENTS BITFLAG(8) // Protects contents from some global effects (Solar storms) -#define ATOM_FLAG_ADJACENT_EXCEPTION BITFLAG(9) // Skips adjacent checks for atoms that should always be reachable in window tiles -#define ATOM_FLAG_NO_DISSOLVE BITFLAG(10) // Bypasses solvent reactions in the container. -#define ATOM_FLAG_NO_PHASE_CHANGE BITFLAG(11) // Bypasses heating and cooling product reactions in the container. -#define ATOM_FLAG_BLOCK_DIAGONAL_FACING BITFLAG(12) // Atom cannot face non-cardinal directions. +#define ATOM_FLAG_CHECKS_BORDER BITFLAG(0) // If a dense atom (potentially) only blocks movements from a given direction, i.e. window panes +#define ATOM_FLAG_CLIMBABLE BITFLAG(1) // This object can be climbed on +#define ATOM_FLAG_NO_BLOOD BITFLAG(2) // Used for items if they don't want to get a blood overlay. +#define ATOM_FLAG_NO_REACT BITFLAG(3) // Reagents don't react inside this container. +#define ATOM_FLAG_OPEN_CONTAINER BITFLAG(4) // Is an open container for chemistry purposes. +#define ATOM_FLAG_INITIALIZED BITFLAG(5) // Has this atom been initialized +#define ATOM_FLAG_CAN_BE_PAINTED BITFLAG(6) // Can be painted using a paint sprayer or similar. +#define ATOM_FLAG_SHIELD_CONTENTS BITFLAG(7) // Protects contents from some global effects (Solar storms) +#define ATOM_FLAG_ADJACENT_EXCEPTION BITFLAG(8) // Skips adjacent checks for atoms that should always be reachable in window tiles +#define ATOM_FLAG_NO_DISSOLVE BITFLAG(9) // Bypasses solvent reactions in the container. +#define ATOM_FLAG_NO_PHASE_CHANGE BITFLAG(10) // Bypasses heating and cooling product reactions in the container. +#define ATOM_FLAG_BLOCK_DIAGONAL_FACING BITFLAG(11) // Atom cannot face non-cardinal directions. -#define ATOM_IS_OPEN_CONTAINER(A) (A.atom_flags & ATOM_FLAG_OPEN_CONTAINER) +#define ATOM_FLAG_NO_CHEM_CHANGE (ATOM_FLAG_NO_REACT | ATOM_FLAG_NO_DISSOLVE | ATOM_FLAG_NO_PHASE_CHANGE) + +#define ATOM_IS_OPEN_CONTAINER(A) (A.atom_flags & ATOM_FLAG_OPEN_CONTAINER) // Movable-level flags (/atom/movable/movable_flags) -#define MOVABLE_FLAG_PROXMOVE BITFLAG(0) // Does this object require proximity checking in Enter()? -#define MOVABLE_FLAG_Z_INTERACT BITFLAG(1) // Should attackby and attack_hand be relayed through ladders and open spaces? -#define MOVABLE_FLAG_ALWAYS_SHUTTLEMOVE BITFLAG(2) // Is this an effect that should move? -#define MOVABLE_FLAG_DEL_SHUTTLE BITFLAG(3) // Shuttle transistion will delete this. -#define MOVABLE_FLAG_WHEELED BITFLAG(4) // Movable has reduced stamina cost/speed reduction when pulled. +#define MOVABLE_FLAG_PROXMOVE BITFLAG(0) // Does this object require proximity checking in Enter()? +#define MOVABLE_FLAG_Z_INTERACT BITFLAG(1) // Should attackby and attack_hand be relayed through ladders and open spaces? +#define MOVABLE_FLAG_ALWAYS_SHUTTLEMOVE BITFLAG(2) // Is this an effect that should move? +#define MOVABLE_FLAG_DEL_SHUTTLE BITFLAG(3) // Shuttle transistion will delete this. +#define MOVABLE_FLAG_WHEELED BITFLAG(4) // Movable has reduced stamina cost/speed reduction when pulled. // Object-level flags (/obj/obj_flags) -#define OBJ_FLAG_ANCHORABLE BITFLAG(0) // This object can be stuck in place with a tool -#define OBJ_FLAG_CONDUCTIBLE BITFLAG(1) // Conducts electricity. (metal etc.) -#define OBJ_FLAG_ROTATABLE BITFLAG(2) // Can be rotated with alt-click -#define OBJ_FLAG_NOFALL BITFLAG(3) // Will prevent mobs from falling -#define OBJ_FLAG_MOVES_UNSUPPORTED BITFLAG(4) // Object moves with shuttle transition even if turf below is a background turf. -#define OBJ_FLAG_HOLLOW BITFLAG(5) // Modifies initial matter values to be lower than w_class normally sets. +#define OBJ_FLAG_ANCHORABLE BITFLAG(0) // This object can be stuck in place with a tool +#define OBJ_FLAG_CONDUCTIBLE BITFLAG(1) // Conducts electricity. (metal etc.) +#define OBJ_FLAG_ROTATABLE BITFLAG(2) // Can be rotated with alt-click +#define OBJ_FLAG_NOFALL BITFLAG(3) // Will prevent mobs from falling +#define OBJ_FLAG_MOVES_UNSUPPORTED BITFLAG(4) // Object moves with shuttle transition even if turf below is a background turf. +#define OBJ_FLAG_HOLLOW BITFLAG(5) // Modifies initial matter values to be lower than w_class normally sets. // Item-level flags (/obj/item/item_flags) -#define ITEM_FLAG_NO_BLUDGEON BITFLAG(0) // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. -#define ITEM_FLAG_NO_CONTAMINATION BITFLAG(1) // Does not get contaminated. -#define ITEM_FLAG_NO_PRINT BITFLAG(2) // This object does not leave the user's prints/fibres when using it -#define ITEM_FLAG_INVALID_FOR_CHAMELEON BITFLAG(3) // Chameleon items cannot mimick this. -#define ITEM_FLAG_THICKMATERIAL BITFLAG(4) // Prevents syringes, reagent pens, and hyposprays if equiped to slot_suit or slot_head_str. -#define ITEM_FLAG_AIRTIGHT BITFLAG(5) // Functions with internals. -#define ITEM_FLAG_NOSLIP BITFLAG(6) // Prevents from slipping on wet floors, in space, etc. -#define ITEM_FLAG_BLOCK_GAS_SMOKE_EFFECT BITFLAG(7) // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) -#define ITEM_FLAG_FLEXIBLEMATERIAL BITFLAG(8) // At the moment, masks with this flag will not prevent eating even if they are covering your face. -#define ITEM_FLAG_IS_BELT BITFLAG(9) // Items that can be worn on the belt slot, even with no undersuit equipped -#define ITEM_FLAG_SILENT BITFLAG(10) // sneaky shoes -#define ITEM_FLAG_NOCUFFS BITFLAG(11) // Gloves that have this flag prevent cuffs being applied -#define ITEM_FLAG_CAN_HIDE_IN_SHOES BITFLAG(12) // Items that can be hidden in shoes that permit it -#define ITEM_FLAG_PADDED BITFLAG(13) // When set on gloves, will act like pulling punches in unarmed combat. -#define ITEM_FLAG_CAN_TAPE BITFLAG(14) //Whether the item can be be taped onto something using tape +#define ITEM_FLAG_NO_BLUDGEON BITFLAG(0) // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. +#define ITEM_FLAG_NO_CONTAMINATION BITFLAG(1) // Does not get contaminated. +#define ITEM_FLAG_NO_PRINT BITFLAG(2) // This object does not leave the user's prints/fibres when using it +#define ITEM_FLAG_INVALID_FOR_CHAMELEON BITFLAG(3) // Chameleon items cannot mimick this. +#define ITEM_FLAG_THICKMATERIAL BITFLAG(4) // Prevents syringes, reagent pens, and hyposprays if equiped to slot_suit or slot_head_str. +#define ITEM_FLAG_AIRTIGHT BITFLAG(5) // Functions with internals. +#define ITEM_FLAG_NOSLIP BITFLAG(6) // Prevents from slipping on wet floors, in space, etc. +#define ITEM_FLAG_BLOCK_GAS_SMOKE_EFFECT BITFLAG(7) // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) +#define ITEM_FLAG_FLEXIBLEMATERIAL BITFLAG(8) // At the moment, masks with this flag will not prevent eating even if they are covering your face. +#define ITEM_FLAG_IS_BELT BITFLAG(9) // Items that can be worn on the belt slot, even with no undersuit equipped +#define ITEM_FLAG_SILENT BITFLAG(10) // sneaky shoes +#define ITEM_FLAG_NOCUFFS BITFLAG(11) // Gloves that have this flag prevent cuffs being applied +#define ITEM_FLAG_CAN_HIDE_IN_SHOES BITFLAG(12) // Items that can be hidden in shoes that permit it +#define ITEM_FLAG_PADDED BITFLAG(13) // When set on gloves, will act like pulling punches in unarmed combat. +#define ITEM_FLAG_CAN_TAPE BITFLAG(14) // Whether the item can be be taped onto something using tape +#define ITEM_FLAG_IS_WEAPON BITFLAG(15) // Item is considered a weapon. Currently only used for force-based worth calculation. // Flags for pass_flags (/atom/var/pass_flags) -#define PASS_FLAG_TABLE BITFLAG(0) -#define PASS_FLAG_GLASS BITFLAG(1) -#define PASS_FLAG_GRILLE BITFLAG(2) -#define PASS_FLAG_MOB BITFLAG(3) +#define PASS_FLAG_TABLE BITFLAG(0) +#define PASS_FLAG_GLASS BITFLAG(1) +#define PASS_FLAG_GRILLE BITFLAG(2) +#define PASS_FLAG_MOB BITFLAG(3) // Overmap sector flags (/obj/effect/overmap/visitable/var/sector_flags) -#define OVERMAP_SECTOR_BASE BITFLAG(0) // Whether or not this sector is a starting sector. Z levels contained in this sector are added to station_levels -#define OVERMAP_SECTOR_KNOWN BITFLAG(1) // Makes the sector show up on nav computers -#define OVERMAP_SECTOR_IN_SPACE BITFLAG(2) // If the sector can be accessed by drifting off the map edge -#define OVERMAP_SECTOR_UNTARGETABLE BITFLAG(3) // If the sector is untargetable by missiles. +#define OVERMAP_SECTOR_BASE BITFLAG(0) // Whether or not this sector is a starting sector. Z levels contained in this sector are added to station_levels +#define OVERMAP_SECTOR_KNOWN BITFLAG(1) // Makes the sector show up on nav computers +#define OVERMAP_SECTOR_IN_SPACE BITFLAG(2) // If the sector can be accessed by drifting off the map edge +#define OVERMAP_SECTOR_UNTARGETABLE BITFLAG(3) // If the sector is untargetable by missiles. // Flags for reagent presentation (/obj/item/chems/var/presentation_flags) -#define PRESENTATION_FLAG_NAME BITFLAG(0) // This chems subtype presents the name of its main reagent/cocktail. -#define PRESENTATION_FLAG_DESC BITFLAG(1) // This chems subtype presents the description of its main reagent/cocktail. +#define PRESENTATION_FLAG_NAME BITFLAG(0) // This chems subtype presents the name of its main reagent/cocktail. +#define PRESENTATION_FLAG_DESC BITFLAG(1) // This chems subtype presents the description of its main reagent/cocktail. // Decl-level flags (/decl/var/decl_flags) -#define DECL_FLAG_ALLOW_ABSTRACT_INIT BITFLAG(0) // Abstract subtypes without this set will CRASH() if fetched with GET_DECL(). -#define DECL_FLAG_MANDATORY_UID BITFLAG(1) // Requires uid to be non-null. \ No newline at end of file +#define DECL_FLAG_ALLOW_ABSTRACT_INIT BITFLAG(0) // Abstract subtypes without this set will CRASH() if fetched with GET_DECL(). +#define DECL_FLAG_MANDATORY_UID BITFLAG(1) // Requires uid to be non-null. \ No newline at end of file diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 6cb6f626c75..bbde90aa3bf 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -17,6 +17,7 @@ #define ACCESSORY_SLOT_ARMOR_M "Misc armor" #define ACCESSORY_SLOT_HELM_C "Helmet cover" #define ACCESSORY_SLOT_OVER "Over" +#define ACCESSORY_SLOT_SENSORS "Suit Sensors" // Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // WARNING: The following flags apply only to the external suit! @@ -155,14 +156,10 @@ #define THROWNOBJ_KNOCKBACK_DIVISOR 2 // Affects how much speed the mob is knocked back with. // Suit sensor levels -#define SUIT_SENSOR_OFF 0 -#define SUIT_SENSOR_BINARY 1 -#define SUIT_SENSOR_VITAL 2 -#define SUIT_SENSOR_TRACKING 3 - -#define SUIT_NO_SENSORS 0 -#define SUIT_HAS_SENSORS 1 -#define SUIT_LOCKED_SENSORS 2 +#define VITALS_SENSOR_OFF 0 +#define VITALS_SENSOR_BINARY 1 +#define VITALS_SENSOR_VITAL 2 +#define VITALS_SENSOR_TRACKING 3 // Hair Flags #define VERY_SHORT BITFLAG(0) diff --git a/code/__defines/mech.dm b/code/__defines/mech.dm new file mode 100644 index 00000000000..e01159f0fd0 --- /dev/null +++ b/code/__defines/mech.dm @@ -0,0 +1,39 @@ +#define HARDPOINT_BACK "back" +#define HARDPOINT_LEFT_HAND "left hand" +#define HARDPOINT_RIGHT_HAND "right hand" +#define HARDPOINT_LEFT_SHOULDER "left shoulder" +#define HARDPOINT_RIGHT_SHOULDER "right shoulder" +#define HARDPOINT_HEAD "head" + +// No software required: taser. light, radio. +#define MECH_SOFTWARE_UTILITY "utility equipment" // Plasma torch, clamp, drill. +#define MECH_SOFTWARE_MEDICAL "medical support systems" // Sleeper. +#define MECH_SOFTWARE_WEAPONS "standard weapon systems" // Ballistics and energy weapons. +#define MECH_SOFTWARE_ENGINEERING "advanced engineering systems" // RCD. + +// EMP damage points before various effects occur. +#define EMP_GUI_DISRUPT 5 // 1 ion rifle shot == 8. +#define EMP_MOVE_DISRUPT 10 // 2 shots. +#define EMP_ATTACK_DISRUPT 20 // 3 shots. + +//About components +#define MECH_COMPONENT_DAMAGE_UNDAMAGED 1 +#define MECH_COMPONENT_DAMAGE_DAMAGED 2 +#define MECH_COMPONENT_DAMAGE_DAMAGED_BAD 3 +#define MECH_COMPONENT_DAMAGE_DAMAGED_TOTAL 4 + +//Construction +#define FRAME_REINFORCED 1 +#define FRAME_REINFORCED_SECURE 2 +#define FRAME_REINFORCED_WELDED 3 + +#define FRAME_WIRED 1 +#define FRAME_WIRED_ADJUSTED 2 + +//POWER! +#define MECH_POWER_OFF 0 +#define MECH_POWER_TRANSITION 1 +#define MECH_POWER_ON 2 + +#define MECH_UI_STYLE(X) STYLE_SMALLFONTS_OUTLINE(X, 5, COLOR_BLACK, COLOR_WHITE) +#define MECH_BAR_CAP 12 diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 0135751ce4f..57d0754e384 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -22,6 +22,7 @@ #define LEVEL_EDGE_CON 3 // Invisibility constants. +#define INVISIBILITY_NONE 0 #define INVISIBILITY_LIGHTING 20 #define INVISIBILITY_LEVEL_ONE 35 #define INVISIBILITY_LEVEL_TWO 45 @@ -194,11 +195,6 @@ #define WRINKLES_WRINKLY 1 #define WRINKLES_NONE 2 -//detergent states for clothes -#define SMELL_DEFAULT 0 -#define SMELL_CLEAN 1 -#define SMELL_STINKY 2 - //Shuttle mission stages #define SHUTTLE_MISSION_PLANNED 1 #define SHUTTLE_MISSION_STARTED 2 @@ -312,4 +308,11 @@ #define DEFAULT_APPEARANCE_FLAGS (PIXEL_SCALE) ///Formats exceptions into a readable string with all the details. -#define EXCEPTION_TEXT(E) "'[E.name]' ('[E.type]'): '[E.file]':[E.line]:\n'[E.desc]'" \ No newline at end of file +#define EXCEPTION_TEXT(E) "'[E.name]' ('[E.type]'): '[E.file]':[E.line]:\n'[E.desc]'" + +#define LEVEL_BELOW_PLATING 1 +#define LEVEL_ABOVE_PLATING 2 + +// Defines for fluorescence (/atom/var/fluorescent) +#define FLUORESCENT_GLOWS 1 // Glows when under flourescent light +#define FLUORESCENT_GLOWING 2 // Currently glowing due to flourescent light \ No newline at end of file diff --git a/code/__defines/mob_status.dm b/code/__defines/mob_status.dm index 1e8ac3ef70c..42bc8854a7a 100644 --- a/code/__defines/mob_status.dm +++ b/code/__defines/mob_status.dm @@ -2,4 +2,4 @@ #define GET_STATUS(MOB, COND) (LAZYACCESS(MOB.status_counters, COND)) #define HAS_STATUS(MOB, COND) (GET_STATUS(MOB, COND) > 0) #define ADJ_STATUS(MOB, COND, AMT) (MOB.set_status(COND, PENDING_STATUS(MOB, COND) + AMT)) -#define SET_STATUS_MAX(MOB, COND, AMT) (MOB.set_status(COND, max(PENDING_STATUS(MOB, COND), AMT))) +#define SET_STATUS_MAX(MOB, COND, AMT) (MOB.set_status(COND, max(PENDING_STATUS(MOB, COND), AMT))) \ No newline at end of file diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 1e00a6617af..3c168317126 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -137,8 +137,8 @@ #define FLASH_PROTECTION_MODERATE 2 #define FLASH_PROTECTION_MAJOR 3 -#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) -#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) +#define ANIMAL_SPAWN_DELAY round(get_config_value(/decl/config/num/respawn_delay) / 6) +#define DRONE_SPAWN_DELAY round(get_config_value(/decl/config/num/respawn_delay) / 3) // Incapacitation flags, used by the mob/proc/incapacitated() proc #define INCAPACITATION_NONE 0 @@ -182,7 +182,6 @@ #define BP_ACETONE "acetone reactor" // Robo Organs. -#define BP_POSIBRAIN "posibrain" #define BP_VOICE "vocal synthesiser" #define BP_STACK "stack" #define BP_OPTICS "optics" @@ -298,20 +297,18 @@ #define MOB_FLAG_HOLY_BAD BITFLAG(0) // If this mob is allergic to holiness -#define MARKING_TARGET_SKIN 0 // Draw a /decl/sprite_accessory/marking to the mob's body, eg. tattoos -#define MARKING_TARGET_HAIR 1 // Draw a /decl/sprite_accessory/marking to the mob's hair, eg. ears & horns - #define DEXTERITY_NONE 0 #define DEXTERITY_SIMPLE_MACHINES BITFLAG(0) #define DEXTERITY_HOLD_ITEM BITFLAG(1) -#define DEXTERITY_EQUIP_ITEM BITFLAG(2) -#define DEXTERITY_KEYBOARDS BITFLAG(3) -#define DEXTERITY_TOUCHSCREENS BITFLAG(4) +#define DEXTERITY_WIELD_ITEM BITFLAG(2) +#define DEXTERITY_EQUIP_ITEM BITFLAG(3) +#define DEXTERITY_KEYBOARDS BITFLAG(4) +#define DEXTERITY_TOUCHSCREENS BITFLAG(5) // TODO: actually get grab code to check this one. -#define DEXTERITY_GRAPPLE BITFLAG(5) -#define DEXTERITY_WEAPONS BITFLAG(6) -#define DEXTERITY_COMPLEX_TOOLS BITFLAG(7) -#define DEXTERITY_BASE (DEXTERITY_SIMPLE_MACHINES|DEXTERITY_HOLD_ITEM|DEXTERITY_EQUIP_ITEM) +#define DEXTERITY_GRAPPLE BITFLAG(6) +#define DEXTERITY_WEAPONS BITFLAG(7) +#define DEXTERITY_COMPLEX_TOOLS BITFLAG(8) +#define DEXTERITY_BASE (DEXTERITY_SIMPLE_MACHINES|DEXTERITY_HOLD_ITEM|DEXTERITY_WIELD_ITEM|DEXTERITY_EQUIP_ITEM) #define DEXTERITY_FULL (DEXTERITY_BASE|DEXTERITY_KEYBOARDS|DEXTERITY_TOUCHSCREENS|DEXTERITY_GRAPPLE|DEXTERITY_WEAPONS|DEXTERITY_COMPLEX_TOOLS) // List of dexterity flags ordered by 'complexity' for use in brainloss dex malus checking. @@ -329,7 +326,7 @@ var/global/list/dexterity_levels = list( #define INJECTION_PORT 2 #define INJECTION_PORT_DELAY 3 SECONDS // used by injectors to apply delay due to searching for a port on the injectee's suit -#define ADJUSTED_GLIDE_SIZE(DELAY) (NONUNIT_CEILING((WORLD_ICON_SIZE / max((DELAY), world.tick_lag) * world.tick_lag) - world.tick_lag, 1) + (config.glide_size_delay)) +#define ADJUSTED_GLIDE_SIZE(DELAY) (NONUNIT_CEILING((WORLD_ICON_SIZE / max((DELAY), world.tick_lag) * world.tick_lag) - world.tick_lag, 1) + (get_config_value(/decl/config/num/movement_glide_size))) #define PREF_MEM_RECORD "memory" #define PREF_SEC_RECORD "sec_record" @@ -378,4 +375,13 @@ var/global/list/dexterity_levels = list( // Underlay defines; vestigal implementation currently. #define HU_TAIL_LAYER 1 -#define TOTAL_UNDER_LAYERS 1 \ No newline at end of file +#define TOTAL_UNDER_LAYERS 1 + +// Enum for result of an attempt to eat/eat from an item. +#define EATEN_INVALID 0 +#define EATEN_UNABLE 1 +#define EATEN_SUCCESS 2 + +// Enum for type of consumption, largely just cosmetic currently. +#define EATING_METHOD_EAT 0 +#define EATING_METHOD_DRINK 1 diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm index aaecaaaf4bf..48a9f0e0973 100644 --- a/code/__defines/qdel.dm +++ b/code/__defines/qdel.dm @@ -23,13 +23,13 @@ #define QDESTROYING(X) (isnull(X) || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) //Qdel helper macros. -#define QDEL_IN(item, time) if(!isnull(item)) {addtimer(CALLBACK(item, /datum/proc/qdel_self), time, TIMER_STOPPABLE)} -#define QDEL_IN_CLIENT_TIME(item, time) if(!isnull(item)) {addtimer(CALLBACK(item, /datum/proc/qdel_self), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)} +#define QDEL_IN(item, time) if(!isnull(item)) {addtimer(CALLBACK(item, TYPE_PROC_REF(/datum, qdel_self)), time, TIMER_STOPPABLE)} +#define QDEL_IN_CLIENT_TIME(item, time) if(!isnull(item)) {addtimer(CALLBACK(item, TYPE_PROC_REF(/datum, qdel_self)), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)} #define QDEL_NULL(item) if(item) {qdel(item); item = null} #define QDEL_NULL_SCREEN(item) if(client) { client.screen -= item; }; QDEL_NULL(item) #define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) }}; if(x) {x.Cut(); x = null } // Second x check to handle items that LAZYREMOVE on qdel. #define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } -#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/______qdel_list_wrapper, L), time, TIMER_STOPPABLE) +#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(______qdel_list_wrapper), L), time, TIMER_STOPPABLE) #define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); } #define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); } diff --git a/code/__defines/reactions.dm b/code/__defines/reactions.dm new file mode 100644 index 00000000000..5edc12eb62f --- /dev/null +++ b/code/__defines/reactions.dm @@ -0,0 +1,5 @@ +#define REACTION_TYPE_PHARMACEUTICAL 1 +#define REACTION_TYPE_ALLOYING 2 +#define REACTION_TYPE_COMPOUND 3 +#define REACTION_TYPE_SYNTHESIS 4 +#define REACTION_TYPE_RECIPE 5 \ No newline at end of file diff --git a/code/__defines/research.dm b/code/__defines/research.dm index 5c36a627958..88367d3ab86 100644 --- a/code/__defines/research.dm +++ b/code/__defines/research.dm @@ -5,10 +5,11 @@ #define GAS_WORTH_MULTIPLIER 1 //0.001 #define MATERIAL_WORTH_MULTIPLIER 1 //0.005 -#define REAGENT_UNITS_PER_MATERIAL_UNIT (REAGENT_UNITS_PER_MATERIAL_SHEET / SHEET_MATERIAL_AMOUNT) #define REAGENT_UNITS_PER_MATERIAL_SHEET 20 #define REAGENT_UNITS_PER_GAS_MOLE 10 +#define REAGENT_UNITS_PER_MATERIAL_UNIT (REAGENT_UNITS_PER_MATERIAL_SHEET / SHEET_MATERIAL_AMOUNT) #define MATERIAL_UNITS_TO_REAGENTS_UNITS(AMT) (AMT * REAGENT_UNITS_PER_MATERIAL_UNIT) +#define MOLES_PER_MATERIAL_UNIT(AMT) round(MATERIAL_UNITS_TO_REAGENTS_UNITS(AMT) / REAGENT_UNITS_PER_GAS_MOLE) #define MATTER_AMOUNT_PRIMARY SHEET_MATERIAL_AMOUNT #define MATTER_AMOUNT_SECONDARY (MATTER_AMOUNT_PRIMARY * 0.75) diff --git a/code/__defines/spawn.dm b/code/__defines/spawn.dm new file mode 100644 index 00000000000..c576e4f0ac4 --- /dev/null +++ b/code/__defines/spawn.dm @@ -0,0 +1,8 @@ +/// Allows the spawn point to be used for observers spawning. +#define SPAWN_FLAG_GHOSTS_CAN_SPAWN BITFLAG(0) +/// Allows admin prison releases to use this spawn point. +#define SPAWN_FLAG_PRISONERS_CAN_SPAWN BITFLAG(1) +/// Allows general job latejoining to use this spawn point. +#define SPAWN_FLAG_JOBS_CAN_SPAWN BITFLAG(2) +/// Allows persistence decls (currently just bookcases) to use this spawn point. +#define SPAWN_FLAG_PERSISTENCE_CAN_SPAWN BITFLAG(3) \ No newline at end of file diff --git a/code/__defines/structures.dm b/code/__defines/structures.dm new file mode 100644 index 00000000000..f91ed7aed08 --- /dev/null +++ b/code/__defines/structures.dm @@ -0,0 +1 @@ +#define STRUCTURE_FLAG_SURFACE BITFLAG(0) \ No newline at end of file diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 9a5bcfc4c76..df952f9e044 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -29,6 +29,7 @@ #define SS_PRIORITY_RADIATION 20 // Radiation processing and cache updates. #define SS_PRIORITY_OPEN_SPACE 20 // Open turf updates. #define SS_PRIORITY_AIRFLOW 15 // Object movement from ZAS airflow. +#define SS_PRIORITY_FLUIDS 11 // Liquid flows. #define SS_PRIORITY_VOTE 10 // Vote management. #define SS_PRIORITY_INACTIVITY 10 // Idle kicking. #define SS_PRIORITY_SUPPLY 10 // Supply point accumulation. diff --git a/code/__defines/temperature.dm b/code/__defines/temperature.dm index 822c9c20172..4fcf9be4dfb 100644 --- a/code/__defines/temperature.dm +++ b/code/__defines/temperature.dm @@ -1,7 +1,9 @@ -#define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A && !(A.atom_flags & ATOM_FLAG_NO_TEMP_CHANGE)) +#define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A?.simulated) #define ATOM_SHOULD_TEMPERATURE_ENQUEUE(A) (ATOM_IS_TEMPERATURE_SENSITIVE(A) && !QDELETED(A)) #define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 #define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 +#define MIN_TEMPERATURE_COEFFICIENT 1 +#define MAX_TEMPERATURE_COEFFICIENT 10 #define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ _atom.temperature = _temp; \ @@ -35,5 +37,5 @@ for(var/thing in atom) var/atom/A = thing QUEUE_TEMPERATURE_ATOM(A) - else + else if(atom) QUEUE_TEMPERATURE_ATOM(atom) diff --git a/code/__defines/tools.dm b/code/__defines/tools.dm index 9553d3fa83f..31f2f62419d 100644 --- a/code/__defines/tools.dm +++ b/code/__defines/tools.dm @@ -11,15 +11,15 @@ #define TOOL_PEN /decl/tool_archetype/pen // Surgical tools. -#define TOOL_SCALPEL /decl/tool_archetype/scalpel -#define TOOL_RETRACTOR /decl/tool_archetype/retractor -#define TOOL_HEMOSTAT /decl/tool_archetype/hemostat -#define TOOL_SAW /decl/tool_archetype/saw -#define TOOL_CAUTERY /decl/tool_archetype/cautery -#define TOOL_SUTURES /decl/tool_archetype/sutures -#define TOOL_BONE_GEL /decl/tool_archetype/bone_gel -#define TOOL_BONE_SETTER /decl/tool_archetype/bone_setter -#define TOOL_DRILL /decl/tool_archetype/surgical_drill +#define TOOL_SCALPEL /decl/tool_archetype/scalpel +#define TOOL_RETRACTOR /decl/tool_archetype/retractor +#define TOOL_HEMOSTAT /decl/tool_archetype/hemostat +#define TOOL_SAW /decl/tool_archetype/saw +#define TOOL_CAUTERY /decl/tool_archetype/cautery +#define TOOL_SUTURES /decl/tool_archetype/sutures +#define TOOL_BONE_GEL /decl/tool_archetype/bone_gel +#define TOOL_BONE_SETTER /decl/tool_archetype/bone_setter +#define TOOL_SURGICAL_DRILL /decl/tool_archetype/surgical_drill // Tool qualities (positive multplier) #define TOOL_QUALITY_WORST 0.1 diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm index 2747a4a6987..1e85f023d18 100644 --- a/code/__defines/turfs.dm +++ b/code/__defines/turfs.dm @@ -39,8 +39,8 @@ #define EXT_EDGE_VOLCANIC (12 * EXT_LAYER_CONSTANT) #define EXT_EDGE_DIRT (20 * EXT_LAYER_CONSTANT) #define EXT_EDGE_BARREN (21 * EXT_LAYER_CONSTANT) -#define EXT_EDGE_MUD (21 * EXT_LAYER_CONSTANT) -#define EXT_EDGE_MUD_DARK (22 * EXT_LAYER_CONSTANT) +#define EXT_EDGE_CLAY (21 * EXT_LAYER_CONSTANT) +#define EXT_EDGE_MUD (22 * EXT_LAYER_CONSTANT) #define EXT_EDGE_SAND (30 * EXT_LAYER_CONSTANT) #define EXT_EDGE_CHLORINE_SAND (31 * EXT_LAYER_CONSTANT) #define EXT_EDGE_WATER (40 * EXT_LAYER_CONSTANT) diff --git a/code/_global_vars/lists/clothing.dm b/code/_global_vars/lists/clothing.dm index 9087a3f054c..4ee24c9b08f 100644 --- a/code/_global_vars/lists/clothing.dm +++ b/code/_global_vars/lists/clothing.dm @@ -28,67 +28,6 @@ var/global/list/airtight_slots = list( slot_head_str ) -var/global/list/equipped_slots = list( - slot_belt_str, - slot_l_ear_str, - slot_r_ear_str, - slot_glasses_str, - slot_gloves_str, - slot_head_str, - slot_shoes_str, - slot_wear_id_str, - slot_wear_suit_str, - slot_w_uniform_str -) - -//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. -var/global/list/slot_equipment_priority = list( - slot_back_str, - slot_wear_id_str, - slot_w_uniform_str, - slot_wear_suit_str, - slot_wear_mask_str, - slot_head_str, - slot_shoes_str, - slot_gloves_str, - slot_l_ear_str, - slot_r_ear_str, - slot_glasses_str, - slot_belt_str, - slot_s_store_str, - slot_tie_str, - slot_l_store_str, - slot_r_store_str -) - -var/global/list/carried_slots = list( - slot_l_store_str, - slot_r_store_str, - slot_handcuffed_str, - slot_s_store_str -) - -var/global/list/persistent_inventory_slots = list( - slot_s_store_str, - slot_wear_id_str, - slot_belt_str, - slot_back_str, - slot_l_store_str, - slot_r_store_str -) - -var/global/list/hidden_inventory_slots = list( - slot_head_str, - slot_shoes_str, - slot_l_ear_str, - slot_r_ear_str, - slot_gloves_str, - slot_glasses_str, - slot_w_uniform_str, - slot_wear_suit_str, - slot_wear_mask_str -) - var/global/list/abstract_inventory_slots = list( slot_in_backpack_str, slot_tie_str, @@ -96,3 +35,7 @@ var/global/list/abstract_inventory_slots = list( slot_underpants_str, slot_socks_str ) + +var/global/list/vitals_sensor_equip_slots = list( + slot_w_uniform_str +) diff --git a/code/_global_vars/lists/flavor.dm b/code/_global_vars/lists/flavor.dm index 28bf458706f..ccf00b40b7e 100644 --- a/code/_global_vars/lists/flavor.dm +++ b/code/_global_vars/lists/flavor.dm @@ -130,7 +130,8 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) var/name = special_name_mappings[coil_type] || capitalize(copytext_after_last("[coil_type]", "/")) var/obj/item/stack/cable_coil/C = coil_type + if(!initial(C.can_have_color)) + continue var/color = initial(C.color) - .[name] = color . = sortTim(., /proc/cmp_text_asc) diff --git a/code/_global_vars/logging.dm b/code/_global_vars/logging.dm index 120f43d48bb..43ea604377c 100644 --- a/code/_global_vars/logging.dm +++ b/code/_global_vars/logging.dm @@ -1,11 +1,3 @@ -var/global/list/combatlog = list() -var/global/list/IClog = list() -var/global/list/OOClog = list() -var/global/list/adminlog = list() - -var/global/datum/configuration/config = null -var/global/list/jobMax = list() - var/global/diary = null GLOBAL_PROTECTED_UNTYPED(log_directory, null) diff --git a/code/_helpers/animations.dm b/code/_helpers/animations.dm index 65932553d9a..b6fcccda02d 100644 --- a/code/_helpers/animations.dm +++ b/code/_helpers/animations.dm @@ -5,7 +5,7 @@ /proc/fade_out(image/I, list/show_to) animate(I, alpha = 0, time = 0.5 SECONDS, easing = EASE_IN) - addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_images_from_clients, I, show_to), 0.5 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(remove_images_from_clients), I, show_to), 0.5 SECONDS) /proc/animate_speech_bubble(image/I, list/show_to, duration) if(!I) @@ -17,7 +17,7 @@ for(var/client/C in show_to) C.images += I animate(I, transform = 0, alpha = 255, time = 0.2 SECONDS, easing = EASE_IN) - addtimer(CALLBACK(GLOBAL_PROC, .proc/fade_out, I, show_to), (duration - 0.5 SECONDS)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(fade_out), I, show_to), (duration - 0.5 SECONDS)) /proc/animate_receive_damage(atom/A) var/pixel_x_diff = rand(-2,2) @@ -53,7 +53,7 @@ /proc/flick_overlay(image/I, list/show_to, duration) for(var/client/C in show_to) C.images += I - addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_images_from_clients, I, show_to), duration) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(remove_images_from_clients), I, show_to), duration) /atom/movable/proc/do_attack_effect(atom/A, effect) //Simple effects for telegraphing or marking attack locations if (effect) @@ -98,4 +98,23 @@ for(var/i in 2 to segments) //2 because 1 is covered above animate(transform = matrices[i], time = speed) //doesn't have an object argument because this is "Stacking" with the animate call above - //3 billion% intentional \ No newline at end of file + //3 billion% intentional + +// This proc is used to move an atom to a target loc and then interpolite to give the illusion of sliding from start to end. +/proc/do_visual_slide(var/atom/movable/sliding, var/turf/from, var/from_pixel_x, var/from_pixel_y, var/turf/target, var/target_pixel_x, var/target_pixel_y, var/center_of_mass) + set waitfor = FALSE + var/start_pixel_x = sliding.pixel_x - ((target.x-from.x) * world.icon_size) + var/start_pixel_y = sliding.pixel_y - ((target.y-from.y) * world.icon_size) + // Clear our glide so we don't do an animation when dropped into the target turf. + var/old_animate_movement = sliding.animate_movement + sliding.animate_movement = NO_STEPS + sleep(2 * world.tick_lag) // Due to BYOND being byond, animate_movement has to be set for at least 2 ticks before gliding will be disabled. + sliding.forceMove(target) + // Reset our glide_size now that movement has completed. + sliding.animate_movement = old_animate_movement + sliding.pixel_x = start_pixel_x + sliding.pixel_y = start_pixel_y + if(center_of_mass) + target_pixel_x -= center_of_mass["x"] + target_pixel_y -= center_of_mass["y"] + animate(sliding, pixel_x = target_pixel_x, pixel_y = target_pixel_y, time = 1 SECOND) diff --git a/code/_helpers/atom_movables.dm b/code/_helpers/atom_movables.dm index 87ed5bc08a1..4c8e774e71b 100644 --- a/code/_helpers/atom_movables.dm +++ b/code/_helpers/atom_movables.dm @@ -44,12 +44,3 @@ ..() if(density && prob(50)) do_simple_ranged_interaction() - -/atom/movable/proc/can_be_injected_by(var/atom/injector) - if(!Adjacent(get_turf(injector))) - return FALSE - if(!reagents) - return FALSE - if(!REAGENTS_FREE_SPACE(reagents)) - return FALSE - return TRUE diff --git a/code/_helpers/auxtools.dm b/code/_helpers/auxtools.dm index a7345891c7a..26ac67f7b50 100644 --- a/code/_helpers/auxtools.dm +++ b/code/_helpers/auxtools.dm @@ -11,11 +11,11 @@ var/global/auxtools_debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") /hook/startup/proc/auxtools_init() if (global.auxtools_debug_server) - call(global.auxtools_debug_server, "auxtools_init")() + LIBCALL(global.auxtools_debug_server, "auxtools_init")() enable_debugging() return TRUE /hook/shutdown/proc/auxtools_shutdown() if (global.auxtools_debug_server) - call(global.auxtools_debug_server, "auxtools_shutdown")() + LIBCALL(global.auxtools_debug_server, "auxtools_shutdown")() return TRUE diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index eb12c9a557d..be876f23e92 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -133,3 +133,9 @@ /proc/cmp_gripper_asc(datum/inventory_slot/gripper/a, datum/inventory_slot/gripper/b) return a.hand_sort_priority - b.hand_sort_priority + +/proc/cmp_decl_uid_asc(decl/a, decl/b) + return sorttext(b.uid, a.uid) + +/proc/cmp_inventory_slot_desc(datum/inventory_slot/a, datum/inventory_slot/b) + return b.quick_equip_priority - a.quick_equip_priority diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 9c75d53f886..6b5d751581e 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -305,14 +305,6 @@ i++ return candidates -/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) - if(!isobj(O)) O = new /obj/screen/text() - O.maptext = maptext - O.maptext_height = maptext_height - O.maptext_width = maptext_width - O.screen_loc = screen_loc - return O - /datum/projectile_data var/src_x var/src_y @@ -449,7 +441,7 @@ /proc/SecondsToTicks(var/seconds) return seconds * 10 -/proc/round_is_spooky(var/spookiness_threshold = config.cult_ghostwriter_req_cultists) +/proc/round_is_spooky(var/spookiness_threshold = get_config_value(/decl/config/num/cult_ghostwriter_req_cultists)) var/decl/special_role/cult = GET_DECL(/decl/special_role/cultist) return (cult.current_antagonists.len > spookiness_threshold) diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 3125a02423f..7c29332f3d4 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -900,16 +900,20 @@ The _flatIcons list is a cache for generated icon files. // - Collecting list of atoms to render - var/list/render_atoms = list() + // This is a workaround for the lighting planemaster not being factored in. + // If it's ever removed, or if a better way is found, please replace this. + var/list/render_lighting = list() for(var/turf/T as anything in render_turfs) render_atoms.Add(T) for(var/atom/A as anything in T) - // In some cases we want to filter lighting overlays. - if(istype(A, /atom/movable/lighting_overlay) && show_lighting) - render_atoms.Add(A) + // We need to handle lighting separately if we're including it, and if not, skip it entirely. + if(istype(A, /atom/movable/lighting_overlay)) + if(show_lighting) + render_lighting.Add(A) continue - if(!A.alpha || A.invisibility) + if(!A.alpha || (A.invisibility > SEE_INVISIBLE_LIVING)) continue render_atoms.Add(A) @@ -932,4 +936,12 @@ The _flatIcons list is a cache for generated icon files. var/y_offset = (A.y - target_y) * world.icon_size capture.Blend(atom_icon, blendMode2iconMode(A.blend_mode), A.pixel_x + x_offset, A.pixel_y + y_offset) + // TODO: for custom exposure/flash/etc simulation on the camera, you could set the alpha on the overlay copy icons here + if(show_lighting) + for(var/atom/movable/lighting_overlay/lighting_overlay as anything in render_lighting) + var/icon/lighting_overlay_icon = getFlatIcon(lighting_overlay) + var/x_offset = (lighting_overlay.x - target_x) * world.icon_size + var/y_offset = (lighting_overlay.y - target_y) * world.icon_size + capture.Blend(lighting_overlay_icon, ICON_MULTIPLY, lighting_overlay.pixel_x + x_offset, lighting_overlay.pixel_y + y_offset) + return capture diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index 85f2387558b..75f6b2f4433 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -76,18 +76,22 @@ return counting_english_list(input, output_icons, determiners, nothing_text, and_text, comma_text, final_comma_text) //Checks for specific types in a list -/proc/is_type_in_list(var/atom/A, var/list/L) - for(var/type in L) - if(istype(A, type)) - return 1 - return 0 +/proc/is_type_in_list(datum/thing, list/type_list) + if(!length(type_list) || !istype(thing)) + return FALSE + for(var/check_type in type_list) + if(istype(thing, check_type)) + return TRUE + return FALSE //Checks for specific paths in a list -/proc/is_path_in_list(var/path, var/list/L) - for(var/type in L) - if(ispath(path, type)) - return 1 - return 0 +/proc/is_path_in_list(var/check_path, list/type_list) + if(!length(type_list) || !ispath(check_path)) + return FALSE + for(var/check_type in type_list) + if(ispath(check_path, check_type)) + return TRUE + return FALSE //returns a new list with only atoms that are in typecache L /proc/typecache_filter_list(list/atoms, list/typecache) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index b67971ebb86..2ac38629b6a 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -33,11 +33,11 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" /proc/log_admin(text) global.admin_log.Add(text) - if (config.log_admin) + if (get_config_value(/decl/config/toggle/log_admin)) game_log("ADMIN", text) /proc/log_debug(text) - if (config.log_debug) + if (get_config_value(/decl/config/toggle/log_debug)) game_log("DEBUG", text) to_debug_listeners(text) @@ -58,47 +58,47 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" to_chat(C, "[prefix]: [text]") /proc/log_game(text) - if (config.log_game) + if (get_config_value(/decl/config/toggle/log_game)) game_log("GAME", text) /proc/log_vote(text) - if (config.log_vote) + if (get_config_value(/decl/config/toggle/log_vote)) game_log("VOTE", text) /proc/log_access(text) - if (config.log_access) + if (get_config_value(/decl/config/toggle/log_access)) game_log("ACCESS", text) /proc/log_say(text) - if (config.log_say) + if (get_config_value(/decl/config/toggle/log_say)) game_log("SAY", text) /proc/log_ooc(text) - if (config.log_ooc) + if (get_config_value(/decl/config/toggle/log_ooc)) game_log("OOC", text) /proc/log_whisper(text) - if (config.log_whisper) + if (get_config_value(/decl/config/toggle/log_whisper)) game_log("WHISPER", text) /proc/log_emote(text) - if (config.log_emote) + if (get_config_value(/decl/config/toggle/log_emotes)) game_log("EMOTE", text) /proc/log_attack(text) - if (config.log_attack) + if (get_config_value(/decl/config/toggle/log_attack)) game_log("ATTACK", text) /proc/log_adminsay(text) - if (config.log_adminchat) + if (get_config_value(/decl/config/toggle/log_adminchat)) game_log("ADMINSAY", text) /proc/log_adminwarn(text) - if (config.log_adminwarn) + if (get_config_value(/decl/config/toggle/log_adminwarn)) game_log("ADMINWARN", text) /proc/log_pda(text) - if (config.log_pda) + if (get_config_value(/decl/config/toggle/log_pda)) game_log("PDA", text) /proc/log_misc(text) @@ -114,7 +114,7 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" //This replaces world.log so it displays both in DD and the file /proc/log_world(text) to_world_log(text) //this comes before the config check because it can't possibly runtime - if(config.log_world_output) + if(get_config_value(/decl/config/toggle/log_world_output)) game_log("DD_OUTPUT", text) //pretty print a direction bitflag, can be useful for debugging. diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index 9d714318131..fe8247f9e9b 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -311,3 +311,15 @@ var/global/list/bodypart_coverage_cache = list() /proc/get_sorted_mob_list() . = sortTim(SSmobs.mob_list.Copy(), /proc/cmp_name_asc) . = sortTim(., /proc/cmp_mob_sortvalue_asc) + +/proc/transfer_key_from_mob_to_mob(var/mob/from_mob, var/mob/to_mob) + if(!from_mob || !from_mob.key || !to_mob) + return FALSE + var/initial_key = from_mob.key + if(to_mob.key) + to_mob.ghostize() + if(from_mob.mind) + from_mob.mind.transfer_to(to_mob) + if(initial_key && to_mob.key != initial_key) + to_mob.key = initial_key + return to_mob.key == initial_key diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm index 0e50a77eac0..26e4dbd4793 100644 --- a/code/_helpers/names.dm +++ b/code/_helpers/names.dm @@ -52,7 +52,7 @@ var/global/religion_name = null /proc/station_name() if(!global.using_map) - return config.server_name + return get_config_value(/decl/config/text/server_name) if (global.using_map.station_name) return global.using_map.station_name @@ -90,8 +90,9 @@ var/global/religion_name = null if(5) global.using_map.station_name += pick(global.numbers_as_words) - if (config && config.server_name) - world.name = "[config.server_name]: [name]" + var/config_server_name = get_config_value(/decl/config/text/server_name) + if (config_server_name) + world.name = "[config_server_name]: [name]" else world.name = global.using_map.station_name @@ -100,8 +101,9 @@ var/global/religion_name = null /proc/world_name(var/name) global.using_map.station_name = name - if (config && config.server_name) - world.name = "[config.server_name]: [name]" + var/config_server_name = get_config_value(/decl/config/text/server_name) + if (config_server_name) + world.name = "[config_server_name]: [name]" else world.name = name @@ -138,9 +140,11 @@ var/global/syndicate_name = null return name -//Traitors and traitor silicons will get these. Revs will not. -var/global/syndicate_code_phrase//Code phrase for traitors. -var/global/syndicate_code_response//Code response for traitors. +// Traitors and traitor silicons will get these. Revs will not. +/// Code phrase for traitors. +var/global/syndicate_code_phrase +/// Code response for traitors. +var/global/syndicate_code_response /* Should be expanded. diff --git a/code/_helpers/profiling.dm b/code/_helpers/profiling.dm index 54f0400edf0..ac6b571adce 100644 --- a/code/_helpers/profiling.dm +++ b/code/_helpers/profiling.dm @@ -107,7 +107,7 @@ if(UNIX) lib = "libprof.so" else CRASH("unsupported platform") - var/init = call(lib, "init")() + var/init = LIBCALL(lib, "init")() if("0" != init) CRASH("[lib] init error: [init]") /world/New() diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 3c08e8309ad..f5ec555c9f1 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -275,10 +275,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Ensure the frequency is within bounds of what it should be sending/recieving at /proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) - f = round(f) - f = max(low, f) - f = min(high, f) - return f + return clamp(round(f), low, high) //Turns 1479 into 147.9 /proc/format_frequency(var/f) @@ -462,6 +459,10 @@ Turf and target are seperate in case you want to teleport some distance from a t cant_pass = 1 return cant_pass +/proc/get_step_resolving_mimic(var/atom/source, var/direction) + var/turf/turf = get_step(get_turf(source), direction) + return turf?.resolve_to_actual_turf() + /proc/get_step_towards2(var/atom/ref , var/atom/trg) var/base_dir = get_dir(ref, get_step_towards(ref,trg)) var/turf/temp = get_step_towards(ref,trg) @@ -594,6 +595,7 @@ Turf and target are seperate in case you want to teleport some distance from a t var/old_icon1 = T.icon var/old_overlays = T.overlays.Copy() var/old_underlays = T.underlays.Copy() + var/old_decals = T.decals?.Copy() if(platingRequired) if(istype(B, get_base_turf_by_area(B))) @@ -604,8 +606,10 @@ Turf and target are seperate in case you want to teleport some distance from a t X.set_dir(old_dir1) X.icon_state = old_icon_state1 X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + X.decals = old_decals X.overlays = old_overlays X.underlays = old_underlays + X.update_icon() // necessary to update decals properly var/list/objs = new/list() var/list/newobjs = new/list() diff --git a/code/_macros.dm b/code/_macros.dm index bcbd7efd3f8..0ac36021a18 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -24,7 +24,7 @@ #define isatom(A) isloc(A) -#define isbrain(A) istype(A, /mob/living/carbon/brain) +#define isbrain(A) istype(A, /mob/living/brain) #define iscarbon(A) istype(A, /mob/living/carbon) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index f9c1669eb2d..abb55bfe116 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -79,7 +79,7 @@ it functions and re-insert it above. */ /mob/living/silicon/ai/UnarmedAttack(atom/A) - A.attack_ai(src) + return A.attack_ai(src) /mob/living/silicon/ai/RangedAttack(atom/A, var/params) A.attack_ai(src) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index b7ec77eacc7..86877e2c1d6 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -114,8 +114,9 @@ //Atoms on your person // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth. var/sdepth = A.storage_depth(src) + var/can_wield_item = check_dexterity(DEXTERITY_WIELD_ITEM, silent = TRUE) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) - if(W) + if(W && can_wield_item) var/resolved = W.resolve_attackby(A, src, params) if(!resolved && A && W) W.afterattack(A, src, 1, params) // 1 indicates adjacency @@ -135,7 +136,7 @@ sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) if(A.Adjacent(src)) // see adjacent.dm - if(W) + if(W && can_wield_item) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = W.resolve_attackby(A,src, params) if(!resolved && A && W) @@ -160,7 +161,7 @@ next_move = max(world.time + timeout, next_move) /mob/proc/canClick() - if(config.no_click_cooldown || next_move <= world.time) + if(get_config_value(/decl/config/toggle/no_click_cooldown) || next_move <= world.time) return 1 return 0 @@ -178,20 +179,32 @@ proximity_flag is not currently passed to attack_hand, and is instead used in human click code to allow glove touches only at melee range. + + Returns TRUE if no further processing is desired, FALSE otherwise. */ /mob/proc/UnarmedAttack(var/atom/A, var/proximity_flag) return /mob/living/UnarmedAttack(var/atom/A, var/proximity_flag) - if(GAME_STATE < RUNLEVEL_GAME) to_chat(src, "You cannot attack people before the game has started.") - return 0 + return TRUE - if(stat) - return 0 + if(stat || try_maneuver(A)) + return TRUE - return 1 + // Special glove functions: + // If the gloves do anything, have them return 1 to stop + // normal attack_hand() here. + var/obj/item/clothing/gloves/G = get_equipped_item(slot_gloves_str) // not typecast specifically enough in defines + if(istype(G) && G.Touch(A,1)) + return TRUE + + // Pick up items. + if(check_dexterity(DEXTERITY_HOLD_ITEM, silent = TRUE)) + return A.attack_hand(src) + + return FALSE /* Ranged unarmed attack: @@ -204,6 +217,9 @@ /mob/proc/RangedAttack(var/atom/A, var/params) return FALSE +/mob/living/RangedAttack(var/atom/A, var/params) + return try_maneuver(A) + /* Restrained ClickOn @@ -332,46 +348,3 @@ if(facing_dir) facing_dir = direction facedir(direction) - -var/global/list/click_catchers -/proc/get_click_catchers() - if(!global.click_catchers) - global.click_catchers = list() - var/ox = -(round(config.max_client_view_x*0.5)) - for(var/i = 0 to config.max_client_view_x) - var/oy = -(round(config.max_client_view_y*0.5)) - var/tx = ox + i - for(var/j = 0 to config.max_client_view_y) - var/ty = oy + j - var/obj/screen/click_catcher/CC = new - CC.screen_loc = "CENTER[tx < 0 ? tx : "+[tx]"],CENTER[ty < 0 ? ty : "+[ty]"]" - CC.x_offset = tx - CC.y_offset = ty - global.click_catchers += CC - return global.click_catchers - -/obj/screen/click_catcher - icon = 'icons/mob/screen_gen.dmi' - icon_state = "click_catcher" - plane = CLICKCATCHER_PLANE - mouse_opacity = MOUSE_OPACITY_PRIORITY - screen_loc = "CENTER-7,CENTER-7" - var/x_offset = 0 - var/y_offset = 0 - -/obj/screen/click_catcher/Destroy() - SHOULD_CALL_PARENT(FALSE) - return QDEL_HINT_LETMELIVE - -/obj/screen/click_catcher/Click(location, control, params) - var/list/modifiers = params2list(params) - if(modifiers["middle"] && iscarbon(usr)) - var/mob/living/carbon/C = usr - C.swap_hand() - else - var/turf/origin = get_turf(usr) - if(isturf(origin)) - var/turf/clicked = locate(origin.x + x_offset, origin.y + y_offset, origin.z) - if(clicked) - clicked.Click(location, control, params) - . = 1 diff --git a/code/_onclick/click_handling.dm b/code/_onclick/click_handling.dm index 4914613c94c..08d1ec3b579 100644 --- a/code/_onclick/click_handling.dm +++ b/code/_onclick/click_handling.dm @@ -13,10 +13,6 @@ if(!click_handlers) { \ /mob/Destroy() QDEL_NULL(status_markers) QDEL_NULL_LIST(click_handlers) - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable?.hat) - hattable.hat.dropInto(get_turf(src)) - hattable.hat = null . = ..() var/global/const/CLICK_HANDLER_NONE = BITFLAG(0) @@ -32,11 +28,11 @@ var/global/const/CLICK_HANDLER_ALL = (CLICK_HANDLER_NONE|CLICK_ ..() src.user = user if(flags & (CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT)) - events_repository.register(/decl/observ/logged_out, user, src, /datum/click_handler/proc/OnMobLogout) + events_repository.register(/decl/observ/logged_out, user, src, TYPE_PROC_REF(/datum/click_handler, OnMobLogout)) /datum/click_handler/Destroy() if(flags & (CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT)) - events_repository.unregister(/decl/observ/logged_out, user, src, /datum/click_handler/proc/OnMobLogout) + events_repository.unregister(/decl/observ/logged_out, user, src, TYPE_PROC_REF(/datum/click_handler, OnMobLogout)) user = null . = ..() diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index e7dfe6206f5..24024e5c003 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -72,7 +72,8 @@ return // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) - if(A == loc || (A in loc) || (A in contents)) + var/can_wield_item = check_dexterity(DEXTERITY_WIELD_ITEM, silent = TRUE) + if(can_wield_item && (A == loc || (A in loc) || (A in contents))) // No adjacency checks var/resolved = W.resolve_attackby(A, src, params) @@ -84,7 +85,7 @@ return var/sdepth = A.storage_depth_turf() - if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) + if(can_wield_item && (isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))) if(A.Adjacent(src)) // see adjacent.dm var/resolved = W.resolve_attackby(A, src, params) @@ -170,11 +171,10 @@ change attack_robot() above to the proper function */ /mob/living/silicon/robot/UnarmedAttack(atom/A) - A.attack_robot(src) + return A.attack_robot(src) /mob/living/silicon/robot/RangedAttack(atom/A, var/params) - A.attack_robot(src) - return TRUE + return A.attack_robot(src) /atom/proc/attack_robot(mob/user) return attack_ai(user) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 7dd9ce3d50d..2a58fec94dc 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -4,38 +4,38 @@ almost anything into a trash can. */ -/atom/MouseDrop(atom/over) +/atom/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) SHOULD_CALL_PARENT(TRUE) - if(!can_mouse_drop(over, usr) || !handle_mouse_drop(over, usr)) + if(!can_mouse_drop(over_object, usr, params = params) || !handle_mouse_drop(over_object, usr, params)) . = ..() -/atom/proc/handle_mouse_drop(var/atom/over, var/mob/user) - . = over.receive_mouse_drop(src, user) +/atom/proc/handle_mouse_drop(atom/over, mob/user, params) + . = over?.receive_mouse_drop(src, user, params) // Can the user drop something onto this atom? -/atom/proc/user_can_mousedrop_onto(var/mob/user, var/atom/being_dropped, var/incapacitation_flags) - return !user.incapacitated(incapacitation_flags) && check_mousedrop_interactivity(user) && user.check_dexterity(DEXTERITY_HOLD_ITEM) +/atom/proc/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params) + return !user.incapacitated(incapacitation_flags) && check_mousedrop_interactivity(user, params) && user.check_dexterity(DEXTERITY_EQUIP_ITEM, silent = TRUE) -/atom/proc/check_mousedrop_interactivity(var/mob/user) +/atom/proc/check_mousedrop_interactivity(mob/user, params) return CanPhysicallyInteract(user) // This proc checks if an atom can be mousedropped onto the target by the user. -/atom/proc/can_mouse_drop(var/atom/over, var/mob/user = usr, var/incapacitation_flags = INCAPACITATION_DEFAULT) +/atom/proc/can_mouse_drop(var/atom/over, var/mob/user = usr, var/incapacitation_flags = INCAPACITATION_DEFAULT, var/params) SHOULD_CALL_PARENT(TRUE) if(!istype(user) || !istype(over) ||QDELETED(user) || QDELETED(over) || QDELETED(src)) return FALSE - if(!over.user_can_mousedrop_onto(user, src, incapacitation_flags)) + if(!over.user_can_mousedrop_onto(user, src, incapacitation_flags, params)) return FALSE - if(!check_mousedrop_adjacency(over, user)) + if(!check_mousedrop_adjacency(over, user, params)) return FALSE return TRUE -/atom/proc/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (Adjacent(user) && over.Adjacent(user)) +/atom/proc/check_mousedrop_adjacency(atom/over, mob/user, params) + . = (Adjacent(user) && ((over in user?.client?.screen) || over.Adjacent(user))) // Receive a mouse drop. // Returns false if the atom is valid for dropping further up the chain, true if the drop has been handled. -/atom/proc/receive_mouse_drop(var/atom/dropping, var/mob/user) +/atom/proc/receive_mouse_drop(atom/dropping, mob/user, params) var/mob/living/H = user if(istype(H) && !H.anchored && can_climb(H) && dropping == user) do_climb(dropping) diff --git a/code/_onclick/ghost.dm b/code/_onclick/ghost.dm index 8a93cd5118f..da5d187674d 100644 --- a/code/_onclick/ghost.dm +++ b/code/_onclick/ghost.dm @@ -28,7 +28,7 @@ if(!canClick()) return setClickCooldown(DEFAULT_QUICK_COOLDOWN) - // You are responsible for checking config.ghost_interaction when you override this function + // You are responsible for checking ghost_interaction when you override this function // Not all of them require checking, see below var/list/modifiers = params2list(params) if(modifiers["alt"]) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 705994a1400..f13491832f4 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -163,3 +163,6 @@ #define ui_pai_shell "TOP,LEFT+2:6" #define ui_pai_light "TOP,LEFT+3:6" #define ui_pai_rest "TOP,LEFT+4:6" + +// storage menu +#define ui_storage_default "LEFT+7,BOTTOM+7 to LEFT+10,BOTTOM+8" diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 895f2fae9ac..547c81a2f75 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -119,83 +119,6 @@ /datum/action/proc/UpdateDesc() return desc -/obj/screen/action_button - var/datum/action/owner - screen_loc = "LEFT,TOP" - -/obj/screen/action_button/Click(location,control,params) - if(owner && usr && usr.next_move < world.time) - owner.Trigger() - return TRUE - return FALSE - -/obj/screen/action_button/proc/UpdateIcon() - if(!owner) - return - icon = owner.button_icon - icon_state = owner.background_icon_state - - overlays.Cut() - var/image/img - if(owner.action_type == AB_ITEM && owner.target) - var/obj/item/I = owner.target - img = image(I.icon, src , I.icon_state) - else if(owner.button_icon && owner.button_icon_state) - img = image(owner.button_icon,src,owner.button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - overlays += img - - if(!owner.IsAvailable()) - color = rgb(128,0,0,128) - else - color = rgb(255,255,255,255) - -/obj/screen/action_button/MouseEntered(location, control, params) - openToolTip(user = usr, tip_src = src, params = params, title = name, content = desc) - ..() - -/obj/screen/action_button/MouseDown() - closeToolTip(usr) - ..() - -/obj/screen/action_button/MouseExited() - closeToolTip(usr) - ..() - -//Hide/Show Action Buttons ... Button -/obj/screen/action_button/hide_toggle - name = "Hide Buttons" - icon = 'icons/obj/action_buttons/actions.dmi' - icon_state = "bg_default" - var/hidden = 0 - -/obj/screen/action_button/hide_toggle/Click() - usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden - - hidden = usr.hud_used.action_buttons_hidden - if(hidden) - name = "Show Buttons" - else - name = "Hide Buttons" - UpdateIcon() - usr.update_action_buttons() - - -/obj/screen/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user) - if(isalien(user)) - icon_state = "bg_alien" - else - icon_state = "bg_default" - UpdateIcon() - return - -/obj/screen/action_button/hide_toggle/UpdateIcon() - overlays.Cut() - var/image/img = image(icon,src,hidden?"show":"hide") - overlays += img - return - //This is the proc used to update all the action buttons. Properly defined in /mob/living/ /mob/proc/update_action_buttons() return diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 6084471660b..65c8e9d6091 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -2,17 +2,7 @@ hud_type = /datum/hud/ai /datum/hud/ai/FinalizeInstantiation() - adding = list() var/list/ai_hud_data = decls_repository.get_decls_of_subtype(/decl/ai_hud) for(var/elem_type in ai_hud_data) - var/decl/ai_hud/ai_hud = ai_hud_data[elem_type] - adding += new /obj/screen/ai_button(null, - ai_hud.screen_loc, - ai_hud.name, - ai_hud.icon_state, - ai_hud.proc_path, - ai_hud.input_procs, - ai_hud.input_args - ) - if(mymob?.client) - mymob.client.screen = list(adding) + adding += new /obj/screen/ai_button(null, mymob, null, null, null, ai_hud_data[elem_type]) + ..() diff --git a/code/_onclick/hud/ai_hud.dm b/code/_onclick/hud/ai_hud.dm index fa4e2200bb6..b8edcf540c4 100644 --- a/code/_onclick/hud/ai_hud.dm +++ b/code/_onclick/hud/ai_hud.dm @@ -11,70 +11,70 @@ screen_loc = ui_ai_core name = "AI Core" icon_state = "ai_core" - proc_path = /mob/living/silicon/ai/proc/core + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, core) /decl/ai_hud/ai_announcement screen_loc = ui_ai_announcement name = "AI Announcement" icon_state = "announcement" - proc_path = /mob/living/silicon/ai/proc/ai_announcement + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_announcement) /decl/ai_hud/ai_cam_track screen_loc = ui_ai_cam_track name = "Track With Camera" icon_state = "track" - proc_path = /mob/living/silicon/ai/proc/ai_camera_track + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_camera_track) input_procs = list(/mob/living/silicon/ai/proc/trackable_mobs = (AI_BUTTON_PROC_BELONGS_TO_CALLER|AI_BUTTON_INPUT_REQUIRES_SELECTION)) /decl/ai_hud/ai_cam_light screen_loc = ui_ai_cam_light name = "Toggle Camera Lights" icon_state = "camera_light" - proc_path = /mob/living/silicon/ai/proc/toggle_camera_light + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, toggle_camera_light) /decl/ai_hud/ai_cam_change_channel screen_loc = ui_ai_cam_change_channel name = "Jump to Camera Channel" icon_state = "camera" - proc_path = /mob/living/silicon/ai/proc/ai_channel_change + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_channel_change) input_procs = list(/mob/living/silicon/ai/proc/get_camera_channel_list = (AI_BUTTON_PROC_BELONGS_TO_CALLER|AI_BUTTON_INPUT_REQUIRES_SELECTION)) /decl/ai_hud/ai_sensor screen_loc = ui_ai_sensor name = "Set Sensor Mode" icon_state = "ai_sensor" - proc_path = /mob/living/silicon/ai/proc/sensor_mode + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, sensor_mode) /decl/ai_hud/ai_manifest screen_loc = ui_ai_crew_manifest name = "Show Crew Manifest" icon_state = "manifest" - proc_path = /mob/living/silicon/ai/proc/run_program + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, run_program) input_args = list("crewmanifest") /decl/ai_hud/ai_take_image screen_loc = ui_ai_take_image name = "Toggle Camera Mode" icon_state = "take_picture" - proc_path = /mob/living/silicon/ai/proc/ai_take_image + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_take_image) /decl/ai_hud/ai_view_images screen_loc = ui_ai_view_images name = "View Images" icon_state = "view_images" - proc_path = /mob/living/silicon/ai/proc/ai_view_images + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_view_images) /decl/ai_hud/ai_laws screen_loc = ui_ai_state_laws name = "State Laws" icon_state = "state_laws" - proc_path = /mob/living/silicon/ai/proc/ai_checklaws + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_checklaws) /decl/ai_hud/ai_call_shuttle screen_loc = ui_ai_call_shuttle name = "Call Shuttle" icon_state = "call_shuttle" - proc_path = /mob/living/silicon/ai/proc/ai_call_shuttle + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_call_shuttle) /decl/ai_hud/ai_up screen_loc = ui_ai_up @@ -92,53 +92,53 @@ screen_loc = ui_ai_color name = "Change Floor Color" icon_state = "ai_floor" - proc_path = /mob/living/silicon/ai/proc/change_floor + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, change_floor) /decl/ai_hud/ai_hologram screen_loc = ui_ai_holo_change name = "Change Hologram" icon_state = "ai_holo_change" - proc_path = /mob/living/silicon/ai/proc/ai_hologram_change + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_hologram_change) /decl/ai_hud/ai_crew_monitor screen_loc = ui_ai_crew_mon name = "Crew Monitor" icon_state = "crew_monitor" - proc_path = /mob/living/silicon/ai/proc/run_program + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, run_program) input_args = list("sensormonitor") /decl/ai_hud/ai_power_override screen_loc = ui_ai_power_override name = "Toggle Power Override" icon_state = "ai_p_override" - proc_path = /mob/living/silicon/ai/proc/ai_power_override + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_power_override) /decl/ai_hud/ai_shutdown screen_loc = ui_ai_shutdown name = "Shutdown" icon_state = "ai_shutdown" - proc_path = /mob/living/silicon/ai/proc/ai_shutdown + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_shutdown) /decl/ai_hud/ai_move_hologram screen_loc = ui_ai_holo_mov name = "Toggle Hologram Movement" icon_state = "ai_holo_mov" - proc_path = /mob/living/silicon/ai/proc/toggle_hologram_movement + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, toggle_hologram_movement) /decl/ai_hud/ai_core_icon screen_loc = ui_ai_core_icon name = "Pick Icon" icon_state = "ai_core_pick" - proc_path = /mob/living/silicon/ai/proc/pick_icon + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, pick_icon) /decl/ai_hud/ai_status screen_loc = ui_ai_status name = "Pick Status" icon_state = "ai_status" - proc_path = /mob/living/silicon/ai/proc/ai_statuschange + proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_statuschange) /decl/ai_hud/ai_inbuilt_comp screen_loc = ui_ai_crew_rec name = "Inbuilt Computer" icon_state = "ai_crew_rec" - proc_path = /mob/living/silicon/proc/access_computer + proc_path = TYPE_PROC_REF(/mob/living/silicon, access_computer) diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm index 129d39f259a..c3a5acd4a3b 100644 --- a/code/_onclick/hud/animal.dm +++ b/code/_onclick/hud/animal.dm @@ -3,6 +3,7 @@ hud_type = /datum/hud/animal /datum/hud/animal/FinalizeInstantiation() - mymob.client.screen = list() - action_intent = new /obj/screen/intent() - mymob.client.screen |= action_intent \ No newline at end of file + action_intent = new(null, mymob) + adding += action_intent + ..() + diff --git a/code/_onclick/hud/deity.dm b/code/_onclick/hud/deity.dm index 7e3f682c4e3..5c9f2152f12 100644 --- a/code/_onclick/hud/deity.dm +++ b/code/_onclick/hud/deity.dm @@ -2,56 +2,8 @@ hud_type = /datum/hud/deity /datum/hud/deity/FinalizeInstantiation() - src.adding = list() - src.other = list() - - var/obj/screen/intent/deity/D = new() - - src.adding += D - action_intent = D - - mymob.client.screen = list() - mymob.client.screen += src.adding - D.sync_to_mob(mymob) - - -/obj/screen/intent/deity - var/list/desc_screens = list() - screen_loc = "RIGHT-5:122,BOTTOM:8" - -/obj/screen/intent/deity/Initialize() - . = ..() - overlays += image('icons/mob/screen_phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1) - -/obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/D = mob - for(var/i in 1 to D.control_types.len) - var/obj/screen/S = new() - S.SetName(null) //Don't want them to be able to actually right click it. - S.mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - S.icon_state = "blank" - desc_screens[D.control_types[i]] = S - S.maptext_width = 128 - S.screen_loc = screen_loc - //This sets it up right. Trust me. - S.maptext_y = 33/2*i - i*i/2 - 10 - D.client.screen += S - S.maptext_x = -125 - - update_text() - -/obj/screen/intent/deity/proc/update_text() - if(!isdeity(usr)) - return - var/mob/living/deity/D = usr - for(var/i in D.control_types) - var/obj/screen/S = desc_screens[i] - var/datum/phenomena/P = D.intent_phenomenas[intent][i] - if(P) - S.maptext = "[P.name]" - else - S.maptext = null - -/obj/screen/intent/deity/Click(var/location, var/control, var/params) + action_intent = new /obj/screen/intent/deity(null, mymob) + adding += action_intent ..() - update_text() \ No newline at end of file + var/obj/screen/intent/deity/D = action_intent + D.sync_to_mob(mymob) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index cf42a0e99ab..9efc84cdfd6 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -16,7 +16,7 @@ return null if(!screen) - screen = new type() + screen = new type(null, src) screen.icon_state = "[initial(screen.icon_state)][severity]" screen.severity = severity @@ -70,100 +70,3 @@ screen.transform = M client.screen |= screen -/obj/screen/fullscreen - icon = 'icons/mob/screen_full.dmi' - icon_state = "default" - screen_loc = ui_center_fullscreen - plane = FULLSCREEN_PLANE - layer = FULLSCREEN_LAYER - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - var/severity = 0 - var/allstate = 0 //shows if it should show up for dead people too - -/obj/screen/fullscreen/Destroy() - severity = 0 - return ..() - -/obj/screen/fullscreen/brute - icon_state = "brutedamageoverlay" - layer = DAMAGE_LAYER - -/obj/screen/fullscreen/oxy - icon_state = "oxydamageoverlay" - layer = DAMAGE_LAYER - -/obj/screen/fullscreen/crit - icon_state = "passage" - layer = CRIT_LAYER - -/obj/screen/fullscreen/blind - icon_state = "blackimageoverlay" - layer = BLIND_LAYER - -/obj/screen/fullscreen/blackout - icon = 'icons/mob/screen1.dmi' - icon_state = "black" - screen_loc = ui_entire_screen - layer = BLIND_LAYER - -/obj/screen/fullscreen/impaired - icon_state = "impairedoverlay" - layer = IMPAIRED_LAYER - -/obj/screen/fullscreen/blurry - icon = 'icons/mob/screen1.dmi' - screen_loc = ui_entire_screen - icon_state = "blurry" - alpha = 100 - -/obj/screen/fullscreen/flash - icon = 'icons/mob/screen1.dmi' - screen_loc = ui_entire_screen - icon_state = "flash" - -/obj/screen/fullscreen/flash/noise - icon_state = "noise" - -/obj/screen/fullscreen/high - icon = 'icons/mob/screen1.dmi' - screen_loc = ui_entire_screen - icon_state = "druggy" - alpha = 180 - blend_mode = BLEND_MULTIPLY - -/obj/screen/fullscreen/noise - icon = 'icons/effects/static.dmi' - icon_state = "1 light" - screen_loc = ui_entire_screen - alpha = 127 - -/obj/screen/fullscreen/fadeout - icon = 'icons/mob/screen1.dmi' - icon_state = "black" - screen_loc = ui_entire_screen - alpha = 0 - allstate = 1 - -/obj/screen/fullscreen/fadeout/Initialize() - . = ..() - animate(src, alpha = 255, time = 10) - -/obj/screen/fullscreen/scanline - icon = 'icons/effects/static.dmi' - icon_state = "scanlines" - screen_loc = ui_entire_screen - alpha = 50 - -/obj/screen/fullscreen/fishbed - icon_state = "fishbed" - allstate = 1 - -/obj/screen/fullscreen/pain - icon_state = "brutedamageoverlay6" - alpha = 0 - -/obj/screen/fullscreen/blueprints - icon = 'icons/effects/blueprints.dmi' - icon_state = "base" - screen_loc = ui_entire_screen - alpha = 100 diff --git a/code/_onclick/hud/global_hud.dm b/code/_onclick/hud/global_hud.dm index 8bcfb40027f..9073d9aab6d 100644 --- a/code/_onclick/hud/global_hud.dm +++ b/code/_onclick/hud/global_hud.dm @@ -10,38 +10,22 @@ var/global/datum/global_hud/hud return global.hud /datum/global_hud - var/obj/screen/nvg - var/obj/screen/thermal - var/obj/screen/meson - var/obj/screen/science - var/obj/screen/holomap + var/obj/screen/global_hud/nvg + var/obj/screen/global_hud/thermal + var/obj/screen/global_hud/meson + var/obj/screen/global_hud/science + var/obj/screen/global_holomap/holomap // makes custom colored overlay, can also generate scanline /datum/global_hud/proc/setup_overlay(icon_state, color) - var/obj/screen/screen = new /obj/screen() - screen.screen_loc = ui_entire_screen - screen.icon = 'icons/effects/hud_full.dmi' + var/obj/screen/global_hud/screen = new(null) screen.icon_state = icon_state - screen.plane = FULLSCREEN_PLANE - screen.layer = FULLSCREEN_LAYER - screen.mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - screen.alpha = 125 - screen.blend_mode = BLEND_MULTIPLY screen.color = color return screen /datum/global_hud/New() - nvg = setup_overlay("scanline", "#06ff00") + nvg = setup_overlay("scanline", "#06ff00") thermal = setup_overlay("scanline", "#ff0000") - meson = setup_overlay("scanline", "#9fd800") + meson = setup_overlay("scanline", "#9fd800") science = setup_overlay("scanline", "#d600d6") - - //Holomap screen object is invisible and work - //By setting it as n images location, without icon changes - //Make it part of global hud since it's inmutable - holomap = new /obj/screen() - holomap.name = "holomap" - holomap.icon = null - holomap.layer = HUD_BASE_LAYER - holomap.screen_loc = UI_HOLOMAP - holomap.mouse_opacity = MOUSE_OPACITY_UNCLICKABLE \ No newline at end of file + holomap = new(null) diff --git a/code/_onclick/hud/gun_mode.dm b/code/_onclick/hud/gun_mode.dm deleted file mode 100644 index ab5cecbff9c..00000000000 --- a/code/_onclick/hud/gun_mode.dm +++ /dev/null @@ -1,66 +0,0 @@ -/obj/screen/gun - name = "gun" - icon = 'icons/mob/screen1.dmi' - master = null - dir = SOUTH - -/obj/screen/gun/Click(location, control, params) - if(!usr) - return - return 1 - -/obj/screen/gun/move - name = "Allow Movement" - icon_state = "no_walk1" - screen_loc = ui_gun2 - -/obj/screen/gun/move/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_permission(TARGET_CAN_MOVE) - return 1 - return 0 - -/obj/screen/gun/item - name = "Allow Item Use" - icon_state = "no_item1" - screen_loc = ui_gun1 - -/obj/screen/gun/item/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_permission(TARGET_CAN_CLICK) - return 1 - return 0 - -/obj/screen/gun/mode - name = "Toggle Gun Mode" - icon_state = "gun0" - screen_loc = ui_gun_select - -/obj/screen/gun/mode/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_active() - return 1 - return 0 - -/obj/screen/gun/radio - name = "Disallow Radio Use" - icon_state = "no_radio1" - screen_loc = ui_gun4 - -/obj/screen/gun/radio/Click(location, control, params) - if(..()) - var/mob/living/user = usr - if(istype(user)) - if(!user.aiming) user.aiming = new(user) - user.aiming.toggle_permission(TARGET_CAN_RADIO) - return 1 - return 0 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index d9e9493c513..b5b67503230 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -25,15 +25,15 @@ var/show_intent_icons = FALSE var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/obj/screen/lingchemdisplay var/list/hand_hud_objects var/list/swaphand_hud_objects - var/obj/screen/action_intent - var/obj/screen/move_intent + var/obj/screen/intent/action_intent + var/obj/screen/movement/move_intent var/obj/screen/stamina/stamina_bar - var/list/adding - var/list/other + var/list/adding = list() + var/list/other = list() + var/list/hud_elements = list() var/list/obj/screen/hotkeybuttons var/obj/screen/action_button/hide_toggle/hide_actions_toggle @@ -47,7 +47,6 @@ /datum/hud/Destroy() . = ..() stamina_bar = null - lingchemdisplay = null action_intent = null move_intent = null adding = null @@ -59,10 +58,10 @@ /datum/hud/proc/update_stamina() if(mymob && stamina_bar) - stamina_bar.invisibility = INVISIBILITY_MAXIMUM + stamina_bar.set_invisibility(INVISIBILITY_MAXIMUM) var/stamina = mymob.get_stamina() if(stamina < 100) - stamina_bar.invisibility = 0 + stamina_bar.set_invisibility(INVISIBILITY_NONE) stamina_bar.icon_state = "prog_bar_[FLOOR(stamina/5)*5][(stamina >= 5) && (stamina <= 25) ? "_fail" : null]" /datum/hud/proc/hide_inventory() @@ -99,6 +98,7 @@ continue // We're not showing anything, hide it. + gear.reconsider_client_screen_presence(mymob?.client, slot) if(!show_hud) inv_slot.hide_slot() else @@ -111,7 +111,22 @@ return FALSE /datum/hud/proc/FinalizeInstantiation() - return + SHOULD_CALL_PARENT(TRUE) + BuildInventoryUI() + BuildHandsUI() + if(mymob.client) + mymob.client.screen = list() + if(length(hand_hud_objects)) + mymob.client.screen |= hand_hud_objects + if(length(swaphand_hud_objects)) + mymob.client.screen |= swaphand_hud_objects + if(length(hud_elements)) + mymob.client.screen |= hud_elements + if(length(adding)) + mymob.client.screen |= adding + if(length(hotkeybuttons)) + mymob.client.screen |= hotkeybuttons + hide_inventory() /datum/hud/proc/get_ui_style() return ui_style2icon(mymob?.client?.prefs?.UI_style) || 'icons/mob/screen/white.dmi' @@ -137,7 +152,7 @@ gripper_datums += mymob.get_inventory_slot_datum(hand_tag) gripper_datums = sortTim(gripper_datums, /proc/cmp_gripper_asc) - for(var/datum/inventory_slot/inv_slot in gripper_datums) + for(var/datum/inventory_slot/gripper/inv_slot in gripper_datums) // Re-order the held slot list so it aligns with the display order. var/hand_tag = inv_slot.slot_id @@ -149,23 +164,24 @@ if(existing_box.slot_id == hand_tag) inv_box = existing_box break + if(!inv_box) - inv_box = new /obj/screen/inventory() + inv_box = new /obj/screen/inventory(null, mymob, ui_style, ui_color, ui_alpha) + else + inv_box.icon = ui_style + inv_box.color = ui_color + inv_box.alpha = ui_alpha + inv_box.SetName(hand_tag) - inv_box.icon = ui_style inv_box.icon_state = "hand_base" inv_box.cut_overlays() - inv_box.add_overlay("hand_[hand_tag]") + inv_box.add_overlay("hand_[inv_slot.hand_overlay || hand_tag]", TRUE) if(inv_slot.ui_label) - inv_box.add_overlay("hand_[inv_slot.ui_label]") - if(mymob.get_active_held_item_slot() == hand_tag) - inv_box.add_overlay("hand_selected") - inv_box.compile_overlays() + inv_box.add_overlay("hand_[inv_slot.ui_label]", TRUE) + inv_box.update_icon() inv_box.slot_id = hand_tag - inv_box.color = ui_color - inv_box.alpha = ui_alpha inv_box.appearance_flags |= KEEP_TOGETHER LAZYDISTINCTADD(hand_hud_objects, inv_box) @@ -195,8 +211,8 @@ inv_box = sublist[2] inv_box.screen_loc = "CENTER:[world.icon_size/2],BOTTOM:[hand_y_offset]" hand_y_offset += world.icon_size - if(mymob.client) - mymob.client.screen |= inv_box + if(mymob.client) + mymob.client.screen |= hand_hud_objects // Make sure all held items are on the screen and set to the correct screen loc. var/datum/inventory_slot/inv_slot @@ -236,10 +252,7 @@ if(gear_slot in held_slots) continue - inv_box = new /obj/screen/inventory() - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha + inv_box = new /obj/screen/inventory(null, mymob, ui_style, ui_color, ui_alpha) var/datum/inventory_slot/inv_slot = inventory_slots[gear_slot] inv_box.SetName(inv_slot.slot_name) @@ -257,51 +270,29 @@ adding += inv_box if(has_hidden_gear) - var/obj/screen/using = new /obj/screen() - using.SetName("toggle") - using.icon = ui_style - using.icon_state = "other" - using.screen_loc = ui_inventory - using.color = ui_color - using.alpha = ui_alpha - adding += using + adding += new /obj/screen/toggle(null, mymob, ui_style, ui_color, ui_alpha) /datum/hud/proc/BuildHandsUI() + var/list/held_slots = mymob.get_held_item_slots() + if(length(held_slots) <= 0) + return + var/ui_style = get_ui_style() var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - var/obj/screen/using - // Swap hand and quick equip screen elems. - using = new /obj/screen() - using.SetName("equip") - using.icon = ui_style - using.icon_state = "act_equip" - using.color = ui_color - using.alpha = ui_alpha + var/obj/screen/using = new /obj/screen/equip(null, mymob, ui_style, ui_color, ui_alpha) src.adding += using LAZYADD(swaphand_hud_objects, using) - var/list/held_slots = mymob.get_held_item_slots() if(length(held_slots) > 1) - using = new /obj/screen/inventory() - using.SetName("hand") - using.icon = ui_style - using.icon_state = "hand1" - using.color = ui_color - using.alpha = ui_alpha + using = new /obj/screen/inventory/swaphand(null, mymob, ui_style, ui_color, ui_alpha) src.adding += using LAZYADD(swaphand_hud_objects, using) - - using = new /obj/screen/inventory() - using.SetName("hand") - using.icon = ui_style - using.icon_state = "hand2" - using.color = ui_color - using.alpha = ui_alpha + using = new /obj/screen/inventory/swaphand/right(null, mymob, ui_style, ui_color, ui_alpha) src.adding += using LAZYADD(swaphand_hud_objects, using) @@ -321,8 +312,6 @@ return if(!client) return - if(client.view != world.view) - return if(hud_used.hud_shown) hud_used.hud_shown = 0 if(src.hud_used.adding) @@ -427,10 +416,3 @@ /mob/new_player/add_click_catcher() return - -/obj/screen/stamina - name = "stamina" - icon = 'icons/effects/progressbar.dmi' - icon_state = "prog_bar_100" - invisibility = INVISIBILITY_MAXIMUM - screen_loc = ui_stamina diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index a40889dc4d6..2726224fa69 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -12,208 +12,96 @@ if(hud_data.icon) ui_style = hud_data.icon - adding = list() - other = list() - src.hotkeybuttons = list() //These can be disabled for hotkey usersx + hotkeybuttons = list() //These can be disabled for hotkey usersx - var/list/hud_elements = list() - var/obj/screen/using - - stamina_bar = new + stamina_bar = new(null, mymob) adding += stamina_bar - BuildInventoryUI() - // Draw the attack intent dialogue. if(hud_data.has_a_intent) - using = new /obj/screen/intent() - src.adding += using - action_intent = using - hud_elements |= using + action_intent = new(null, mymob) + src.adding += action_intent + hud_elements |= action_intent if(hud_data.has_m_intent) - using = new /obj/screen/movement() - using.SetName("movement method") - using.icon = ui_style - using.icon_state = mymob.move_intent.hud_icon_state - using.screen_loc = ui_movi - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - move_intent = using + move_intent = new(null, mymob, ui_style, ui_color, ui_alpha) + move_intent.icon_state = mymob.move_intent.hud_icon_state + src.adding += move_intent if(hud_data.has_drop) - using = new /obj/screen() - using.SetName("drop") - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.color = ui_color - using.alpha = ui_alpha - src.hotkeybuttons += using - - if(hud_data.has_hands) - BuildHandsUI() + src.hotkeybuttons += new /obj/screen/drop(null, mymob, ui_style, ui_color, ui_alpha) if(hud_data.has_resist) - using = new /obj/screen() - using.SetName("resist") - using.icon = ui_style - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.color = ui_color - using.alpha = ui_alpha - src.hotkeybuttons += using + src.hotkeybuttons += new /obj/screen/resist(null, mymob, ui_style, ui_color, ui_alpha) + + mymob.maneuver_icon = new(null, mymob, ui_style, ui_color, ui_alpha) + src.hotkeybuttons += mymob.maneuver_icon + hud_elements |= mymob.maneuver_icon if(hud_data.has_throw) - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.SetName("throw") - mymob.throw_icon.screen_loc = ui_drop_throw - mymob.throw_icon.color = ui_color - mymob.throw_icon.alpha = ui_alpha + mymob.throw_icon = new(null, mymob, ui_style, ui_color, ui_alpha) src.hotkeybuttons += mymob.throw_icon hud_elements |= mymob.throw_icon if(hud_data.has_internals) - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.SetName("internal") - mymob.internals.screen_loc = ui_internal + mymob.internals = new(null, mymob, ui_style) hud_elements |= mymob.internals if(hud_data.has_warnings) - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.SetName("health") - mymob.healths.screen_loc = ui_health + mymob.healths = new(null, mymob, ui_style) hud_elements |= mymob.healths - mymob.oxygen = new /obj/screen/oxygen() - mymob.oxygen.icon = 'icons/mob/status_indicators.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.SetName("oxygen") - mymob.oxygen.screen_loc = ui_temp + mymob.oxygen = new(null, mymob) hud_elements |= mymob.oxygen - mymob.toxin = new /obj/screen/toxins() - mymob.toxin.icon = 'icons/mob/status_indicators.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.SetName("toxin") - mymob.toxin.screen_loc = ui_temp + mymob.toxin = new(null, mymob) hud_elements |= mymob.toxin - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.SetName("fire") - mymob.fire.screen_loc = ui_fire + mymob.fire = new(null, mymob, ui_style) hud_elements |= mymob.fire if(hud_data.has_pressure) - mymob.pressure = new /obj/screen/pressure() - mymob.pressure.icon = 'icons/mob/status_indicators.dmi' - mymob.pressure.icon_state = "pressure0" - mymob.pressure.SetName("pressure") - mymob.pressure.screen_loc = ui_temp + mymob.pressure = new(null, mymob) hud_elements |= mymob.pressure if(hud_data.has_bodytemp) - mymob.bodytemp = new /obj/screen/bodytemp() - mymob.bodytemp.icon = 'icons/mob/status_indicators.dmi' - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.SetName("body temperature") - mymob.bodytemp.screen_loc = ui_temp + mymob.bodytemp = new(null, mymob) hud_elements |= mymob.bodytemp if(target.isSynthetic()) - target.cells = new /obj/screen() - target.cells.icon = 'icons/mob/screen1_robot.dmi' - target.cells.icon_state = "charge-empty" - target.cells.SetName("cell") - target.cells.screen_loc = ui_nutrition + target.cells = new(null, mymob) hud_elements |= target.cells else if(hud_data.has_nutrition) - mymob.nutrition_icon = new /obj/screen/food() - mymob.nutrition_icon.icon = 'icons/mob/status_hunger.dmi' - mymob.nutrition_icon.pixel_w = 8 - mymob.nutrition_icon.icon_state = "nutrition1" - mymob.nutrition_icon.SetName("nutrition") - mymob.nutrition_icon.screen_loc = ui_nutrition_small + mymob.nutrition_icon = new(null, mymob) hud_elements |= mymob.nutrition_icon - mymob.hydration_icon = new /obj/screen/drink() - mymob.hydration_icon.icon = 'icons/mob/status_hunger.dmi' - mymob.hydration_icon.icon_state = "hydration1" - mymob.hydration_icon.SetName("hydration") - mymob.hydration_icon.screen_loc = ui_nutrition_small + mymob.hydration_icon = new(null, mymob) hud_elements |= mymob.hydration_icon if(hud_data.has_up_hint) - mymob.up_hint = new /obj/screen() - mymob.up_hint.icon = ui_style - mymob.up_hint.icon_state = "uphint0" - mymob.up_hint.SetName("up hint") - mymob.up_hint.screen_loc = ui_up_hint + mymob.up_hint = new(null, mymob, ui_style) hud_elements |= mymob.up_hint - mymob.pain = new /obj/screen/fullscreen/pain( null ) + mymob.pain = new(null, mymob) hud_elements |= mymob.pain - mymob.zone_sel = new - mymob.zone_sel.icon = ui_style - mymob.zone_sel.color = ui_color - mymob.zone_sel.alpha = ui_alpha + mymob.zone_sel = new(null, mymob, ui_style, ui_color, ui_alpha) mymob.zone_sel.update_icon() hud_elements |= mymob.zone_sel - target.attack_selector = new - target.attack_selector.set_owner(target) - target.attack_selector.icon = ui_style - target.attack_selector.color = ui_color - target.attack_selector.alpha = ui_alpha - target.attack_selector.update_icon() + target.attack_selector = new(null, mymob, ui_style, ui_color, ui_alpha) hud_elements |= target.attack_selector //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - mymob.gun_setting_icon.icon = ui_style - mymob.gun_setting_icon.color = ui_color - mymob.gun_setting_icon.alpha = ui_alpha + mymob.gun_setting_icon = new(null, mymob, ui_style, ui_color, ui_alpha) hud_elements |= mymob.gun_setting_icon - mymob.item_use_icon = new /obj/screen/gun/item(null) - mymob.item_use_icon.icon = ui_style - mymob.item_use_icon.color = ui_color - mymob.item_use_icon.alpha = ui_alpha - - mymob.gun_move_icon = new /obj/screen/gun/move(null) - mymob.gun_move_icon.icon = ui_style - mymob.gun_move_icon.color = ui_color - mymob.gun_move_icon.alpha = ui_alpha - - mymob.radio_use_icon = new /obj/screen/gun/radio(null) - mymob.radio_use_icon.icon = ui_style - mymob.radio_use_icon.color = ui_color - mymob.radio_use_icon.alpha = ui_alpha - - mymob.client.screen = list() - if(length(hand_hud_objects)) - mymob.client.screen += hand_hud_objects - if(length(swaphand_hud_objects)) - mymob.client.screen += swaphand_hud_objects - if(length(hud_elements)) - mymob.client.screen += hud_elements - mymob.client.screen += src.adding + src.hotkeybuttons - - hide_inventory() + mymob.item_use_icon = new(null, mymob, ui_style, ui_color, ui_alpha) + mymob.gun_move_icon = new(null, mymob, ui_style, ui_color, ui_alpha) + mymob.radio_use_icon = new(null, mymob, ui_style, ui_color, ui_alpha) - hidden_inventory_update() - persistant_inventory_update() + ..() /mob/living/carbon/human/verb/toggle_hotkey_verbs() set category = "OOC" @@ -226,88 +114,3 @@ else client.screen -= hud_used.hotkeybuttons hud_used.hotkey_ui_hidden = 1 - -// Yes, these use icon state. Yes, these are terrible. The alternative is duplicating -// a bunch of fairly blobby logic for every click override on these objects. - -/obj/screen/food/Click(var/location, var/control, var/params) - if(istype(usr) && usr.nutrition_icon == src) - switch(icon_state) - if("nutrition0") - to_chat(usr, SPAN_WARNING("You are completely stuffed.")) - if("nutrition1") - to_chat(usr, SPAN_NOTICE("You are not hungry.")) - if("nutrition2") - to_chat(usr, SPAN_NOTICE("You are a bit peckish.")) - if("nutrition3") - to_chat(usr, SPAN_WARNING("You are quite hungry.")) - if("nutrition4") - to_chat(usr, SPAN_DANGER("You are starving!")) - -/obj/screen/drink/Click(var/location, var/control, var/params) - if(istype(usr) && usr.hydration_icon == src) - switch(icon_state) - if("hydration0") - to_chat(usr, SPAN_WARNING("You are overhydrated.")) - if("hydration1") - to_chat(usr, SPAN_NOTICE("You are not thirsty.")) - if("hydration2") - to_chat(usr, SPAN_NOTICE("You are a bit thirsty.")) - if("hydration3") - to_chat(usr, SPAN_WARNING("You are quite thirsty.")) - if("hydration4") - to_chat(usr, SPAN_DANGER("You are dying of thirst!")) - -/obj/screen/bodytemp/Click(var/location, var/control, var/params) - if(istype(usr) && usr.bodytemp == src) - switch(icon_state) - if("temp4") - to_chat(usr, SPAN_DANGER("You are being cooked alive!")) - if("temp3") - to_chat(usr, SPAN_DANGER("Your body is burning up!")) - if("temp2") - to_chat(usr, SPAN_DANGER("You are overheating.")) - if("temp1") - to_chat(usr, SPAN_WARNING("You are uncomfortably hot.")) - if("temp-4") - to_chat(usr, SPAN_DANGER("You are being frozen solid!")) - if("temp-3") - to_chat(usr, SPAN_DANGER("You are freezing cold!")) - if("temp-2") - to_chat(usr, SPAN_WARNING("You are dangerously chilled!")) - if("temp-1") - to_chat(usr, SPAN_NOTICE("You are uncomfortably cold.")) - else - to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) - -/obj/screen/pressure/Click(var/location, var/control, var/params) - if(istype(usr) && usr.pressure == src) - switch(icon_state) - if("pressure2") - to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) - if("pressure1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously high.")) - if("pressure-1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously low.")) - if("pressure-2") - to_chat(usr, SPAN_DANGER("There is nearly no air pressure here!")) - else - to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) - -/obj/screen/toxins/Click(var/location, var/control, var/params) - if(istype(usr) && usr.toxin == src) - if(icon_state == "tox0") - to_chat(usr, SPAN_NOTICE("The air is clear of toxins.")) - else - to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) - -/obj/screen/oxygen/Click(var/location, var/control, var/params) - if(istype(usr) && usr.oxygen == src) - if(icon_state == "oxy0") - to_chat(usr, SPAN_NOTICE("You are breathing easy.")) - else - to_chat(usr, SPAN_DANGER("You cannot breathe!")) - -/obj/screen/movement/Click(var/location, var/control, var/params) - if(istype(usr)) - usr.set_next_usable_move_intent() \ No newline at end of file diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 584c7b7dd0e..9c5eec19f88 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -24,23 +24,11 @@ if(isconstruct(mymob)) var/mob/living/simple_animal/construct/construct = mymob constructtype = construct.hud_construct_type - if(constructtype) - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_construct.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.SetName("fire") - mymob.fire.screen_loc = ui_construct_fire - - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen1_construct.dmi' + mymob.fire = new /obj/screen/construct_fire(null, mymob) + mymob.healths = new /obj/screen/construct_health(null, mymob) mymob.healths.icon_state = "[constructtype]_health0" - mymob.healths.SetName("health") - mymob.healths.screen_loc = ui_construct_health - - mymob.zone_sel = new - mymob.zone_sel.icon = 'icons/mob/screen1_construct.dmi' - mymob.zone_sel.update_icon() + mymob.zone_sel = new(null, mymob, 'icons/mob/screen1_construct.dmi') - mymob.client.screen = list() - mymob.client.screen += list(mymob.fire, mymob.healths, mymob.zone_sel) + adding += list(mymob.fire, mymob.healths, mymob.zone_sel) + ..() diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm index 8f305d4153c..e73430b5524 100644 --- a/code/_onclick/hud/pai.dm +++ b/code/_onclick/hud/pai.dm @@ -1,94 +1,9 @@ /datum/hud/pai/FinalizeInstantiation() - adding = list() - var/obj/screen/using + for(var/hud_type in subtypesof(/obj/screen/pai)) + var/obj/screen/pai/hud_elem = hud_type + if(TYPE_IS_ABSTRACT(hud_elem)) + continue + adding += new hud_elem(null, mymob) - using = new /obj/screen/pai/software() - using.SetName("Software Interface") - adding += using - - using = new /obj/screen/pai/subsystems() - using.SetName("Subsystems") - adding += using - - using = new /obj/screen/pai/shell() - using.SetName("Toggle Chassis") - adding += using - - using = new /obj/screen/pai/rest() - using.SetName("Rest") - adding += using - - using = new /obj/screen/pai/light() - using.SetName("Toggle Light") - adding += using - - mymob.client.screen = list() - mymob.client.screen += adding + ..() hide_inventory() - -/obj/screen/pai - icon = 'icons/mob/screen/pai.dmi' - -/obj/screen/pai/Click() - if(!isobserver(usr) && (!usr.incapacitated() || usr.resting)) - OnClick() - -/obj/screen/pai/proc/OnClick() - -/obj/screen/pai/software - name = "Software Interface" - icon_state = "pai" - screen_loc = ui_pai_software - -/obj/screen/pai/software/OnClick() - var/mob/living/silicon/pai/pAI = usr - pAI.paiInterface() - -/obj/screen/pai/shell - name = "Toggle Chassis" - icon_state = "pai_holoform" - screen_loc = ui_pai_shell - -/obj/screen/pai/shell/OnClick() - var/mob/living/silicon/pai/pAI = usr - if(pAI.is_in_card) - pAI.unfold() - else - pAI.fold() - -/obj/screen/pai/chassis - name = "Holochassis Appearance Composite" - icon_state = "pai_holoform" - -/obj/screen/pai/rest - name = "Rest" - icon_state = "pai_rest" - screen_loc = ui_pai_rest - -/obj/screen/pai/rest/OnClick() - var/mob/living/silicon/pai/pAI = usr - pAI.lay_down() - -/obj/screen/pai/light - name = "Toggle Integrated Lights" - icon_state = "light" - screen_loc = ui_pai_light - -/obj/screen/pai/light/OnClick() - var/mob/living/silicon/pai/pAI = usr - pAI.toggle_integrated_light() - -/obj/screen/pai/subsystems - name = "SubSystems" - icon_state = "subsystems" - screen_loc = ui_pai_subsystems - -/obj/screen/pai/subsystems/OnClick() - var/mob/living/silicon/pai/pAI = usr - var/ss_name = input(usr, "Activates the given subsystem", "Subsystems", "") in pAI.silicon_subsystems_by_name - if (!ss_name) - return - - var/stat_silicon_subsystem/SSS = pAI.silicon_subsystems_by_name[ss_name] - if(istype(SSS)) - SSS.Click() diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 49fe49e32da..bd34ec4aaee 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -3,57 +3,6 @@ var/global/list/radial_menus = list() -/obj/screen/radial/Destroy() - parent = null - return ..() - -/obj/screen/radial - icon = 'icons/screen/radial.dmi' - layer = HUD_ABOVE_ITEM_LAYER - plane = HUD_PLANE - var/datum/radial_menu/parent - -/obj/screen/radial/slice - icon_state = "radial_slice" - var/choice - var/next_page = FALSE - var/tooltips = FALSE - -/obj/screen/radial/slice/MouseEntered(location, control, params) - . = ..() - icon_state = "radial_slice_focus" - if(tooltips) - openToolTip(usr, src, params, title = name) - -/obj/screen/radial/slice/MouseExited(location, control, params) - . = ..() - icon_state = "radial_slice" - if(tooltips) - closeToolTip(usr) - -/obj/screen/radial/slice/Click(location, control, params) - if(parent && usr.client == parent.current_user) - if(next_page) - parent.next_page() - else - parent.element_chosen(choice,usr) - -/obj/screen/radial/center - name = "Close Menu" - icon_state = "radial_center" - -/obj/screen/radial/center/MouseEntered(location, control, params) - . = ..() - icon_state = "radial_center_focus" - -/obj/screen/radial/center/MouseExited(location, control, params) - . = ..() - icon_state = "radial_center" - -/obj/screen/radial/center/Click(location, control, params) - if(usr.client == parent.current_user) - parent.finished = TRUE - /datum/radial_menu var/list/choices = list() //List of choice id's var/list/choices_icons = list() //choice_id -> icon diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 592f98912e5..8f01871138e 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -2,28 +2,12 @@ A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked */ -/obj/screen/radial/persistent/center - name = "Close Menu" - icon_state = "radial_center" - -/obj/screen/radial/persistent/center/Click(location, control, params) - if(usr.client == parent.current_user) - parent.element_chosen(null,usr) - -/obj/screen/radial/persistent/center/MouseEntered(location, control, params) - . = ..() - icon_state = "radial_center_focus" - -/obj/screen/radial/persistent/center/MouseExited(location, control, params) - . = ..() - icon_state = "radial_center" - /datum/radial_menu/persistent var/uniqueid var/datum/callback/select_proc_callback /datum/radial_menu/persistent/New() - close_button = new /obj/screen/radial/persistent/center + close_button = new /obj/screen/radial/persistent/center(null) close_button.parent = src /datum/radial_menu/persistent/element_chosen(choice_id,mob/user) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index fe5be57d956..b5b7de283c2 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,172 +1,56 @@ var/global/obj/screen/robot_inventory -/obj/screen/robot_drop_grab - name = "drop grab" - icon = 'icons/mob/screen1_robot.dmi' - icon_state = "drop_grab" - screen_loc = ui_borg_drop_grab - invisibility = INVISIBILITY_MAXIMUM - alpha = 0 - -/obj/screen/robot_drop_grab/Click(location, control, params) - . = ..() - if(isrobot(usr) && !usr.incapacitated()) - var/mob/living/silicon/robot/R = usr - R.drop_item() - invisibility = INVISIBILITY_MAXIMUM - alpha = 0 - /mob/living/silicon/robot hud_type = /datum/hud/robot /datum/hud/robot/FinalizeInstantiation() - if(!isrobot(mymob)) - return - var/mob/living/silicon/robot/R = mymob - - adding = list() - other = list() - - var/obj/screen/using + if(!istype(R)) + ..() + return //Radio - using = new /obj/screen() - using.SetName("radio") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "radio" - using.screen_loc = ui_movi - adding += using + adding += new /obj/screen/robot_radio(null, mymob) //Module select - - using = new /obj/screen() - using.SetName("module1") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv1" - using.screen_loc = ui_inv1 - adding += using - R.inv1 = using - - using = new /obj/screen() - using.SetName("module2") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv2" - using.screen_loc = ui_inv2 - adding += using - R.inv2 = using - - using = new /obj/screen() - using.SetName("module3") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "inv3" - using.screen_loc = ui_inv3 - adding += using - R.inv3 = using - + R.inv1 = new(null, mymob) + R.inv2 = new(null, mymob) + R.inv3 = new(null, mymob) + adding += R.inv1 + adding += R.inv2 + adding += R.inv3 //End of module select // Drop UI - R.ui_drop_grab = new + R.ui_drop_grab = new(null, mymob) adding += R.ui_drop_grab //Intent - using = new /obj/screen() - using.SetName("act_intent") - using.set_dir(SOUTHWEST) - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = R.a_intent - using.screen_loc = ui_acti - adding += using - action_intent = using - - //Cell - R.cells = new /obj/screen() - R.cells.icon = 'icons/mob/screen1_robot.dmi' - R.cells.icon_state = "charge-empty" - R.cells.SetName("cell") - R.cells.screen_loc = ui_toxin - - //Health - R.healths = new /obj/screen() - R.healths.icon = 'icons/mob/screen1_robot.dmi' - R.healths.icon_state = "health0" - R.healths.SetName("health") - R.healths.screen_loc = ui_borg_health - - //Installed Module - R.hands = new /obj/screen() - R.hands.icon = 'icons/mob/screen1_robot.dmi' - R.hands.icon_state = "nomod" - R.hands.SetName("module") - R.hands.screen_loc = ui_borg_module - - //Module Panel - using = new /obj/screen() - using.SetName("panel") - using.icon = 'icons/mob/screen1_robot.dmi' - using.icon_state = "panel" - using.screen_loc = ui_borg_panel - adding += using - - //Store - R.throw_icon = new /obj/screen() - R.throw_icon.icon = 'icons/mob/screen1_robot.dmi' - R.throw_icon.icon_state = "store" - R.throw_icon.SetName("store") - R.throw_icon.screen_loc = ui_borg_store - - //Inventory - robot_inventory = new /obj/screen() - robot_inventory.SetName("inventory") - robot_inventory.icon = 'icons/mob/screen1_robot.dmi' - robot_inventory.icon_state = "inventory" - robot_inventory.screen_loc = ui_borg_inventory - - //Temp - R.bodytemp = new /obj/screen() - R.bodytemp.icon = 'icons/mob/status_indicators.dmi' - R.bodytemp.icon_state = "temp0" - R.bodytemp.SetName("body temperature") - R.bodytemp.screen_loc = ui_temp - - - R.oxygen = new /obj/screen() - R.oxygen.icon = 'icons/mob/screen1_robot.dmi' - R.oxygen.icon_state = "oxy0" - R.oxygen.SetName("oxygen") - R.oxygen.screen_loc = ui_oxygen - - R.fire = new /obj/screen() - R.fire.icon = 'icons/mob/screen1_robot.dmi' - R.fire.icon_state = "fire0" - R.fire.SetName("fire") - R.fire.screen_loc = ui_fire - - R.up_hint = new /obj/screen() - R.up_hint.icon = 'icons/mob/screen1_robot.dmi' - R.up_hint.icon_state = "uphint0" - R.up_hint.SetName("up hint") - R.up_hint.screen_loc = ui_up_hint - - R.zone_sel = new - R.zone_sel.icon = 'icons/mob/screen1_robot.dmi' - R.zone_sel.update_icon() - - //Handle the gun settings buttons - R.gun_setting_icon = new /obj/screen/gun/mode(null) - R.item_use_icon = new /obj/screen/gun/item(null) - R.gun_move_icon = new /obj/screen/gun/move(null) - R.radio_use_icon = new /obj/screen/gun/radio(null) - - R.client.screen = list() - R.client.screen += list(R.throw_icon, R.zone_sel, R.oxygen, R.fire, R.up_hint, R.hands, R.healths, R.cells, robot_inventory, R.gun_setting_icon) - R.client.screen += adding + other + action_intent = new /obj/screen/intent/robot(null, mymob) + action_intent.icon_state = R.a_intent + adding += action_intent + + adding += new /obj/screen/robot_panel( null, mymob) + R.cells = new /obj/screen/robot_charge( null, mymob) + R.healths = new /obj/screen/robot_health( null, mymob) + R.hands = new /obj/screen/robot_module_select(null, mymob) + R.throw_icon = new /obj/screen/robot_store( null, mymob) + robot_inventory = new /obj/screen/robot_inventory( null, mymob) + R.bodytemp = new /obj/screen/bodytemp( null, mymob) + R.oxygen = new /obj/screen/robot_oxygen( null, mymob) + R.fire = new /obj/screen/robot_fire( null, mymob) + R.up_hint = new /obj/screen/up_hint( null, mymob, 'icons/mob/screen1_robot.dmi') + R.zone_sel = new( null, mymob, 'icons/mob/screen1_robot.dmi') + R.gun_setting_icon = new /obj/screen/gun/mode( null, mymob) + R.item_use_icon = new /obj/screen/gun/item( null, mymob) + R.gun_move_icon = new /obj/screen/gun/move( null, mymob) + R.radio_use_icon = new /obj/screen/gun/radio( null, mymob) + + + + hud_elements = list(R.throw_icon, R.zone_sel, R.oxygen, R.fire, R.up_hint, R.hands, R.healths, R.cells, robot_inventory, R.gun_setting_icon) + ..() /datum/hud/proc/toggle_show_robot_modules() if(!isrobot(mymob)) @@ -187,8 +71,6 @@ var/global/obj/screen/robot_inventory if(R.shown_robot_modules) if(R.active_storage) R.active_storage.close(R) //Closes the inventory ui. - //Modules display is shown - //R.client.screen += robot_inventory //"store" icon if(!R.module) to_chat(usr, "No module selected") diff --git a/code/_onclick/hud/screen/_screen.dm b/code/_onclick/hud/screen/_screen.dm new file mode 100644 index 00000000000..a1ab688c521 --- /dev/null +++ b/code/_onclick/hud/screen/_screen.dm @@ -0,0 +1,143 @@ +/* + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/obj/screen + name = "" + icon = 'icons/mob/screen1.dmi' + plane = HUD_PLANE + layer = HUD_BASE_LAYER + appearance_flags = NO_CLIENT_COLOR + abstract_type = /obj/screen + is_spawnable_type = FALSE + simulated = FALSE + + /// The mob that owns this screen object, if any. + var/weakref/owner_ref + /// Whether or not this screen element requires an owner. + var/requires_owner = TRUE + /// Global screens are not qdeled when the holding mob is destroyed. + var/is_global_screen = FALSE + /// A set of flags to check for when the user clicks this element. + var/user_incapacitation_flags = INCAPACITATION_DEFAULT + +/obj/screen/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) + + if(ismob(_owner)) + owner_ref = weakref(_owner) + + // Validate ownership. + if(requires_owner) + if(!owner_ref) + PRINT_STACK_TRACE("ERROR: [type]'s Initialize() was not given an owner argument.") + return INITIALIZE_HINT_QDEL + else if(owner_ref) + PRINT_STACK_TRACE("ERROR: [type]'s Initialize() was given an owner argument.") + return INITIALIZE_HINT_QDEL + + if(!isnull(ui_style)) + icon = ui_style + if(!isnull(ui_color)) + color = ui_color + if(!isnull(ui_alpha)) + alpha = ui_alpha + return ..() + +/obj/screen/Destroy() + if(owner_ref) + var/mob/owner = owner_ref.resolve() + if(istype(owner) && owner?.client?.screen) + owner.client.screen -= src + return ..() + +/obj/screen/proc/handle_click(mob/user, params) + if(!user) + return TRUE + switch(name) + if("toggle") + if(user.hud_used.inventory_shown) + user.client.screen -= user.hud_used.other + user.hud_used.hide_inventory() + else + user.client.screen += user.hud_used.other + user.hud_used.show_inventory() + if("equip") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.quick_equip() + if("resist") + if(isliving(user)) + var/mob/living/L = user + L.resist() + if("Reset Machine") + user.unset_machine() + if("up hint") + if(isliving(user)) + var/mob/living/L = user + L.lookup() + if("internal") + if(isliving(user)) + var/mob/living/M = user + M.ui_toggle_internals() + if("act_intent") + user.a_intent_change("right") + if("throw") + if(!user.stat && isturf(user.loc) && !user.restrained()) + user.toggle_throw_mode() + if("drop") + if(user.client) + user.client.drop_item() + if("module") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.pick_module() + if("inventory") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(R.module) + R.hud_used.toggle_show_robot_modules() + return TRUE + to_chat(R, "You haven't selected a module yet.") + if("radio") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.radio_menu() + if("panel") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.installed_modules() + if("store") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(R.module) + R.uneq_active() + R.hud_used.update_robot_modules_display() + else + to_chat(R, "You haven't selected a module yet.") + if("module1") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.toggle_module(1) + if("module2") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.toggle_module(2) + if("module3") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.toggle_module(3) + else + return FALSE + return TRUE + +/obj/screen/Click(location, control, params) + if(ismob(usr) && usr.client && usr.canClick() && (!user_incapacitation_flags || !usr.incapacitated(user_incapacitation_flags))) + return handle_click(usr, params) + return FALSE + +/obj/screen/receive_mouse_drop(atom/dropping, mob/user) + return TRUE + +/obj/screen/check_mousedrop_interactivity(var/mob/user) + return user.client && (src in user.client.screen) diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/screen/screen_abilities.dm similarity index 81% rename from code/_onclick/hud/ability_screen_objects.dm rename to code/_onclick/hud/screen/screen_abilities.dm index 8dcbdfa1ffb..60ca68a97e3 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/screen/screen_abilities.dm @@ -1,54 +1,47 @@ /obj/screen/ability_master - name = "Abilities" - icon = 'icons/mob/screen_spells.dmi' - icon_state = "grey_spell_ready" + name = "Abilities" + icon = 'icons/mob/screen_spells.dmi' + icon_state = "grey_spell_ready" + screen_loc = ui_ability_master var/list/obj/screen/ability/ability_objects = list() var/list/obj/screen/ability/spell_objects = list() - var/showing = 0 // If we're 'open' or not. - + var/showing = FALSE // If we're 'open' or not. var/const/abilities_per_row = 7 var/open_state = "master_open" // What the button looks like when it's 'open', showing the other buttons. var/closed_state = "master_closed" // Button when it's 'closed', hiding everything else. - screen_loc = ui_ability_master - - var/mob/my_mob = null // The mob that possesses this hud object. - -/obj/screen/ability_master/Initialize(mapload, owner) +/obj/screen/ability_master/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) . = ..() - if(owner) - my_mob = owner - update_abilities(0, owner) - else - . = INITIALIZE_HINT_QDEL - CRASH("ERROR: ability_master's Initialize() was not given an owner argument. This is a bug.") + if(. != INITIALIZE_HINT_QDEL) + update_abilities(0, _owner) /obj/screen/ability_master/Destroy() - . = ..() - remove_all_abilities() //Get rid of the ability objects. + // Get rid of the ability objects. + remove_all_abilities() ability_objects.Cut() - if(my_mob) // After that, remove ourselves from the mob seeing us, so we can qdel cleanly. - my_mob.ability_master = null - if(my_mob.client && my_mob.client.screen) - my_mob.client.screen -= src - my_mob = null + // After that, remove ourselves from the mob seeing us, so we can qdel cleanly. + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && owner.ability_master == src) + owner.ability_master = null + return ..() -/obj/screen/ability_master/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/screen/ability_master/handle_mouse_drop(atom/over, mob/user, params) if(showing) return FALSE . = ..() -/obj/screen/ability_master/Click() - if(!ability_objects.len) // If we're empty for some reason. - return - - toggle_open() +/obj/screen/ability_master/handle_click(mob/user, params) + if(length(ability_objects)) // If we're empty for some reason. + toggle_open() /obj/screen/ability_master/proc/toggle_open(var/forced_state = 0) + var/mob/owner = owner_ref?.resolve() + if(!istype(owner) || QDELETED(owner)) + return if(showing && (forced_state != 2)) // We are closing the ability master, hide the abilities. - for(var/obj/screen/ability/O in ability_objects) - if(my_mob && my_mob.client) - my_mob.client.screen -= O + if(owner?.client) + for(var/obj/screen/ability/O in ability_objects) + owner.client.screen -= O // O.handle_icon_updates = 0 showing = 0 overlays.len = 0 @@ -62,12 +55,18 @@ update_icon() /obj/screen/ability_master/proc/open_ability_master() + + var/client/owner_client + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && !QDELETED(owner)) + owner_client = owner.client + for(var/i = 1 to length(ability_objects)) var/obj/screen/ability/A = ability_objects[i] var/row = round(i/abilities_per_row) A.screen_loc = "RIGHT-[(i-(row*abilities_per_row))+2]:16,TOP-[row+1]:16" - if(my_mob && my_mob.client) - my_mob.client.screen += A + if(owner_client) + owner_client.screen += A /obj/screen/ability_master/proc/update_abilities(forced = 0, mob/user) update_icon() @@ -82,19 +81,21 @@ /obj/screen/ability_master/on_update_icon() if(ability_objects.len) - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) else - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) /obj/screen/ability_master/proc/add_ability(var/name_given) - if(!name) return + if(!name_given) + return var/obj/screen/ability/new_button = new /obj/screen/ability new_button.ability_master = src new_button.SetName(name_given) new_button.ability_icon_state = name_given new_button.update_icon(1) ability_objects.Add(new_button) - if(my_mob.client) + var/mob/living/owner = owner_ref?.resolve() + if(istype(owner) && !QDELETED(owner) && owner.client) toggle_open(2) //forces the icons to refresh on screen /obj/screen/ability_master/proc/remove_ability(var/obj/screen/ability/ability) @@ -149,10 +150,6 @@ var/spell/S = screen.spell M.learned_spells |= S -/mob/Initialize() - . = ..() - ability_master = new /obj/screen/ability_master(null,src) - ///////////ACTUAL ABILITIES//////////// //This is what you click to do things// /////////////////////////////////////// @@ -160,6 +157,7 @@ icon = 'icons/mob/screen_spells.dmi' icon_state = "grey_spell_base" maptext_x = 3 + requires_owner = FALSE var/background_base_state = "grey" var/ability_icon_state = null var/obj/screen/ability_master/ability_master @@ -167,8 +165,9 @@ /obj/screen/ability/Destroy() if(ability_master) ability_master.ability_objects -= src - if(ability_master.my_mob && ability_master.my_mob.client) - ability_master.my_mob.client.screen -= src + var/mob/owner = ability_master.owner_ref?.resolve() + if(istype(owner) && owner.client) + owner.client.screen -= src if(ability_master && !ability_master.ability_objects.len) ability_master.update_icon() // qdel(ability_master) @@ -181,10 +180,7 @@ overlays += ability_icon_state -/obj/screen/ability/Click() - if(!usr) - return - +/obj/screen/ability/handle_click(mob/user, params) activate() // Makes the ability be triggered. The subclasses of this are responsible for carrying it out in whatever way it needs to. @@ -196,21 +192,6 @@ /obj/screen/ability/proc/can_activate() return 1 -/client/verb/activate_ability(var/slot as num) - set name = ".activate_ability" -// set hidden = 1 - if(!mob) - return // Paranoid. - if(isnull(slot) || !isnum(slot)) - to_chat(src,".activate_ability requires a number as input, corrisponding to the slot you wish to use.") - return // Bad input. - if(!mob.ability_master) - return // No abilities. - if(slot > mob.ability_master.ability_objects.len || slot <= 0) - return // Out of bounds. - var/obj/screen/ability/A = mob.ability_master.ability_objects[slot] - A.activate() - //////////Verb Abilities////////// //Buttons to trigger verbs/procs// ////////////////////////////////// @@ -240,7 +221,8 @@ if(arguments) A.arguments_to_use = arguments ability_objects.Add(A) - if(my_mob.client) + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && owner.client) toggle_open(2) //forces the icons to refresh on screen /////////Obj Abilities//////// @@ -270,7 +252,8 @@ A.ability_icon_state = ability_icon_given A.SetName(object_given.name) ability_objects.Add(A) - if(my_mob.client) + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && !QDELETED(owner) && owner.client) toggle_open(2) //forces the icons to refresh on screen // Wizard @@ -295,7 +278,7 @@ if(get_ability_by_spell(spell)) return - var/obj/screen/ability/spell/A = new() + var/obj/screen/ability/spell/A = new(null) A.ability_master = src A.spell = spell A.SetName(spell.name) @@ -310,7 +293,8 @@ A.update_charge(1) spell_objects.Add(A) ability_objects.Add(A) - if(my_mob.client) + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && !QDELETED(owner) && owner.client) toggle_open(2) //forces the icons to refresh on screen /obj/screen/ability_master/proc/update_spells(var/forced = 0) diff --git a/code/_onclick/hud/screen/screen_action_button.dm b/code/_onclick/hud/screen/screen_action_button.dm new file mode 100644 index 00000000000..b154e373160 --- /dev/null +++ b/code/_onclick/hud/screen/screen_action_button.dm @@ -0,0 +1,78 @@ +/obj/screen/action_button + screen_loc = "LEFT,TOP" + var/datum/action/action + +/obj/screen/action_button/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, _action) + action = _action + return ..() + +/obj/screen/action_button/handle_click(mob/user, params) + if(action && user.next_move < world.time) + action.Trigger() + return TRUE + return FALSE + +/obj/screen/action_button/on_update_icon() + if(!action) + return + icon = action.button_icon + icon_state = action.background_icon_state + + cut_overlays() + var/image/img + if(action.action_type == AB_ITEM && action.target) + var/obj/item/I = action.target + img = image(I.icon, src , I.icon_state) + else if(action.button_icon && action.button_icon_state) + img = image(action.button_icon,src,action.button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + add_overlay(img) + compile_overlays() + + if(!action.IsAvailable()) + color = rgb(128,0,0,128) + else + color = rgb(255,255,255,255) + +/obj/screen/action_button/MouseEntered(location, control, params) + openToolTip(user = usr, tip_src = src, params = params, title = name, content = desc) + ..() + +/obj/screen/action_button/MouseDown() + closeToolTip(usr) + ..() + +/obj/screen/action_button/MouseExited() + closeToolTip(usr) + ..() + +//Hide/Show Action Buttons ... Button +/obj/screen/action_button/hide_toggle + name = "Hide Buttons" + icon = 'icons/obj/action_buttons/actions.dmi' + icon_state = "bg_default" + var/hidden = FALSE + +/obj/screen/action_button/hide_toggle/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) + . = ..() + if(isalien(_owner)) + icon_state = "bg_alien" + else + icon_state = "bg_default" + update_icon() + +/obj/screen/action_button/hide_toggle/handle_click(mob/user, params) + user.hud_used.action_buttons_hidden = !user.hud_used.action_buttons_hidden + hidden = user.hud_used.action_buttons_hidden + if(hidden) + name = "Show Buttons" + else + name = "Hide Buttons" + update_icon() + user.update_action_buttons() + +/obj/screen/action_button/hide_toggle/on_update_icon() + cut_overlays() + add_overlay(hidden ? "show" : "hide") + compile_overlays() diff --git a/code/_onclick/hud/ai_screen_objects.dm b/code/_onclick/hud/screen/screen_ai_button.dm similarity index 73% rename from code/_onclick/hud/ai_screen_objects.dm rename to code/_onclick/hud/screen/screen_ai_button.dm index cbbff7d5d96..4406fe2dd08 100644 --- a/code/_onclick/hud/ai_screen_objects.dm +++ b/code/_onclick/hud/screen/screen_ai_button.dm @@ -6,7 +6,7 @@ var/list/template_icon = list(null, "template") var/image/template_undelay -/obj/screen/ai_button/Click() +/obj/screen/ai_button/handle_click(mob/user, params) if(!isAI(usr)) return TRUE var/mob/living/silicon/ai/A = usr @@ -38,19 +38,17 @@ call(A, ai_verb)(arglist(input_arguments)) return TRUE -/obj/screen/ai_button/Initialize(maploading, screen_loc, name, icon_state, ai_verb, list/input_procs = null, list/input_args = null) +/obj/screen/ai_button/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, decl/ai_hud/ai_hud_data) . = ..() - if(!LAZYLEN(template_icon)) - template_icon = list(icon) - src.name = name - src.icon_state = icon_state - src.screen_loc = screen_loc - src.ai_verb = ai_verb - if(input_procs) - src.input_procs = input_procs.Copy() - if(input_args) - src.input_args = input_args.Copy() + name = ai_hud_data.name + icon_state = ai_hud_data.icon_state + screen_loc = ai_hud_data.screen_loc + ai_verb = ai_hud_data.proc_path + input_procs = ai_hud_data.input_procs?.Copy() + input_args = ai_hud_data.input_args?.Copy() + if(!LAZYLEN(template_icon)) + template_icon = list(icon) template_undelay = image(template_icon[1], template_icon[2]) - underlays += template_undelay \ No newline at end of file + underlays += template_undelay diff --git a/code/_onclick/hud/screen/screen_attack_selector.dm b/code/_onclick/hud/screen/screen_attack_selector.dm new file mode 100644 index 00000000000..5aa2c0dbbbd --- /dev/null +++ b/code/_onclick/hud/screen/screen_attack_selector.dm @@ -0,0 +1,33 @@ +/obj/screen/default_attack_selector + name = "default attack selector" + icon_state = "attack_none" + screen_loc = ui_attack_selector + +/obj/screen/default_attack_selector/Destroy() + var/mob/living/carbon/human/owner = owner_ref?.resolve() + if(istype(owner) && owner.attack_selector == src) + owner.attack_selector = null + . = ..() + +/obj/screen/default_attack_selector/handle_click(mob/user, params) + + var/mob/living/carbon/human/owner = owner_ref?.resolve() + if(user != owner) + return FALSE + + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + to_chat(owner, SPAN_NOTICE("Your current default attack is [owner.default_attack?.name || "unset"].")) + if(owner.default_attack) + var/summary = owner.default_attack.summarize() + if(summary) + to_chat(owner, SPAN_NOTICE(summary)) + return + + owner.set_default_unarmed_attack(src) + return TRUE + +/obj/screen/default_attack_selector/on_update_icon() + var/mob/living/carbon/human/owner = owner_ref?.resolve() + var/decl/natural_attack/attack = istype(owner) && owner.default_attack + icon_state = attack?.selector_icon_state || "attack_none" diff --git a/code/_onclick/hud/screen/screen_cataloguer.dm b/code/_onclick/hud/screen/screen_cataloguer.dm new file mode 100644 index 00000000000..ed78c9edff2 --- /dev/null +++ b/code/_onclick/hud/screen/screen_cataloguer.dm @@ -0,0 +1,82 @@ +/obj/screen/scan_radius + name = null + plane = HUD_PLANE + layer = UNDER_HUD_LAYER + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + screen_loc = "CENTER,CENTER" + icon = 'icons/screen/scanner.dmi' + icon_state = "blank" + alpha = 180 + requires_owner = FALSE + var/scan_range + var/image/holder_image + +/obj/screen/scan_radius/proc/set_radius(var/new_range) + if(new_range != scan_range) + scan_range = max(1, new_range) + update_icon() + +/obj/screen/scan_radius/proc/fade_out(var/mob/user, var/fade_time) + set waitfor = FALSE + animate(src, alpha = 0, time = fade_time) + if(fade_time > 0) + sleep(fade_time) + if(user?.client && holder_image) + user.client.images -= holder_image + +/obj/screen/scan_radius/Destroy() + if(holder_image) + holder_image.vis_contents.Cut() + QDEL_NULL(holder_image) + return ..() + +/obj/screen/scan_radius/on_update_icon() + cut_overlays() + if(scan_range <= 1) + add_overlay("single") + else + var/pixel_bound = (world.icon_size * scan_range) + + var/image/I = image(icon, "bottomleft") + I.pixel_x = -(pixel_bound) + I.pixel_y = -(pixel_bound) + add_overlay(I) + + I = image(icon, "bottomright") + I.pixel_x = pixel_bound + I.pixel_y = -(pixel_bound) + add_overlay(I) + + I = image(icon, "topleft") + I.pixel_x = -(pixel_bound) + I.pixel_y = pixel_bound + add_overlay(I) + + I = image(icon, "topright") + I.pixel_x = pixel_bound + I.pixel_y = pixel_bound + add_overlay(I) + + var/offset_scan_range = scan_range-1 + for(var/i = -(offset_scan_range) to offset_scan_range) + I = image(icon, "left") + I.pixel_x = -(pixel_bound) + I.pixel_y = world.icon_size * i + add_overlay(I) + + I = image(icon, "right") + I.pixel_x = pixel_bound + I.pixel_y = world.icon_size * i + add_overlay(I) + + I = image(icon, "bottom") + I.pixel_x = world.icon_size * i + I.pixel_y = -(pixel_bound) + add_overlay(I) + + I = image(icon, "top") + I.pixel_x = world.icon_size * i + I.pixel_y = pixel_bound + add_overlay(I) + + compile_overlays() diff --git a/code/_onclick/hud/screen/screen_cinematic.dm b/code/_onclick/hud/screen/screen_cinematic.dm new file mode 100644 index 00000000000..7f013eb9b63 --- /dev/null +++ b/code/_onclick/hud/screen/screen_cinematic.dm @@ -0,0 +1,7 @@ +/obj/screen/cinematic + icon = 'icons/effects/station_explosion.dmi' + icon_state = "station_intact" + plane = HUD_PLANE + layer = HUD_ABOVE_ITEM_LAYER + mouse_opacity = MOUSE_OPACITY_PRIORITY + screen_loc = "LEFT+1,BOTTOM" diff --git a/code/_onclick/hud/screen/screen_click_catcher.dm b/code/_onclick/hud/screen/screen_click_catcher.dm new file mode 100644 index 00000000000..4584120a02a --- /dev/null +++ b/code/_onclick/hud/screen/screen_click_catcher.dm @@ -0,0 +1,46 @@ +var/global/list/click_catchers +/proc/get_click_catchers() + if(!global.click_catchers) + var/client_max_x = get_config_value(/decl/config/num/clients/max_client_view_x) + var/client_max_y = get_config_value(/decl/config/num/clients/max_client_view_y) + global.click_catchers = list() + var/ox = -(round(client_max_x*0.5)) + for(var/i = 0 to client_max_x) + var/oy = -(round(client_max_y*0.5)) + var/tx = ox + i + for(var/j = 0 to client_max_y) + var/ty = oy + j + var/obj/screen/click_catcher/CC = new + CC.screen_loc = "CENTER[tx < 0 ? tx : "+[tx]"],CENTER[ty < 0 ? ty : "+[ty]"]" + CC.x_offset = tx + CC.y_offset = ty + global.click_catchers += CC + return global.click_catchers + +/obj/screen/click_catcher + icon = 'icons/mob/screen_gen.dmi' + icon_state = "click_catcher" + plane = CLICKCATCHER_PLANE + mouse_opacity = MOUSE_OPACITY_PRIORITY + screen_loc = "CENTER-7,CENTER-7" + requires_owner = FALSE + is_global_screen = TRUE + var/x_offset = 0 + var/y_offset = 0 + +/obj/screen/click_catcher/Destroy() + SHOULD_CALL_PARENT(FALSE) + return QDEL_HINT_LETMELIVE + +/obj/screen/click_catcher/Click(location, control, params) + var/list/modifiers = params2list(params) + if(modifiers["middle"] && iscarbon(usr)) + var/mob/living/carbon/C = usr + C.swap_hand() + else + var/turf/origin = get_turf(usr) + if(isturf(origin)) + var/turf/clicked = locate(origin.x + x_offset, origin.y + y_offset, origin.z) + if(clicked) + clicked.Click(location, control, params) + . = 1 diff --git a/code/_onclick/hud/screen/screen_constructs.dm b/code/_onclick/hud/screen/screen_constructs.dm new file mode 100644 index 00000000000..a733f1aebe0 --- /dev/null +++ b/code/_onclick/hud/screen/screen_constructs.dm @@ -0,0 +1,10 @@ +/obj/screen/construct_fire + name = "fire" + icon = 'icons/mob/screen1_construct.dmi' + icon_state = "fire0" + screen_loc = ui_construct_fire + +/obj/screen/construct_health + name = "health" + icon = 'icons/mob/screen1_construct.dmi' + screen_loc = ui_construct_health diff --git a/code/_onclick/hud/screen/screen_credits.dm b/code/_onclick/hud/screen/screen_credits.dm new file mode 100644 index 00000000000..53efb504ab1 --- /dev/null +++ b/code/_onclick/hud/screen/screen_credits.dm @@ -0,0 +1,35 @@ + +/obj/screen/credit + icon_state = "blank" + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + alpha = 0 + screen_loc = "CENTER-7,BOTTOM+1" + plane = HUD_PLANE + layer = HUD_ABOVE_ITEM_LAYER + maptext_height = WORLD_ICON_SIZE * 2 + maptext_width = WORLD_ICON_SIZE * 14 + var/client/parent + var/matrix/target + +/obj/screen/credit/proc/rollem() + var/matrix/M = matrix(transform) + M.Translate(0, CREDIT_ANIMATE_HEIGHT) + animate(src, transform = M, time = CREDIT_ROLL_SPEED) + target = M + animate(src, alpha = 255, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL) + spawn(CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION) + if(!QDELETED(src)) + animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) + sleep(CREDIT_EASE_DURATION) + qdel(src) + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && owner.client) + owner.client.screen += src + +/obj/screen/credit/Destroy() + var/client/P = parent + if(istype(P)) + P.screen -= src + LAZYREMOVE(P.credits, src) + parent = null + return ..() diff --git a/code/_onclick/hud/screen/screen_drop.dm b/code/_onclick/hud/screen/screen_drop.dm new file mode 100644 index 00000000000..085922329c7 --- /dev/null +++ b/code/_onclick/hud/screen/screen_drop.dm @@ -0,0 +1,8 @@ +/obj/screen/drop + name = "drop" + icon_state = "act_drop" + screen_loc = ui_drop_throw + +/obj/screen/drop/handle_click(mob/user, params) + if(user.client) + user.client.drop_item() diff --git a/code/_onclick/hud/screen/screen_equip.dm b/code/_onclick/hud/screen/screen_equip.dm new file mode 100644 index 00000000000..49386fa267f --- /dev/null +++ b/code/_onclick/hud/screen/screen_equip.dm @@ -0,0 +1,8 @@ +/obj/screen/equip + name = "equip" + icon_state = "act_equip" + +/obj/screen/equip/handle_click(mob/user, params) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.quick_equip() diff --git a/code/modules/mechs/interface/screen_objects.dm b/code/_onclick/hud/screen/screen_exosuit.dm similarity index 51% rename from code/modules/mechs/interface/screen_objects.dm rename to code/_onclick/hud/screen/screen_exosuit.dm index f8b87ba090e..0eca9ca3005 100644 --- a/code/modules/mechs/interface/screen_objects.dm +++ b/code/_onclick/hud/screen/screen_exosuit.dm @@ -1,38 +1,42 @@ -// Screen objects hereon out. -#define MECH_UI_STYLE(X) STYLE_SMALLFONTS_OUTLINE(X, 5, COLOR_BLACK, COLOR_WHITE) - /obj/screen/exosuit name = "hardpoint" icon = 'icons/mecha/mech_hud.dmi' icon_state = "base" - var/mob/living/exosuit/owner + var/initial_maptext var/height = 14 -/obj/screen/exosuit/radio - name = "radio" - maptext_x = 5 - maptext_y = 12 - -/obj/screen/exosuit/radio/Initialize() +/obj/screen/exosuit/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) . = ..() - maptext = MECH_UI_STYLE("RADIO") + var/mob/living/exosuit/newowner = get_owning_exosuit() + if(!istype(newowner)) + return INITIALIZE_HINT_QDEL + if(initial_maptext) + maptext = MECH_UI_STYLE(initial_maptext) -/obj/screen/exosuit/radio/Click() - if(..()) - if(owner.radio) - owner.radio.attack_self(usr) - else - to_chat(usr, SPAN_WARNING("There is no radio installed.")) +/obj/screen/exosuit/handle_click(mob/user, params) + var/mob/living/exosuit/owner = get_owning_exosuit() + return owner && (user == owner || user.loc == owner) -/obj/screen/exosuit/Initialize() - . = ..() - var/mob/living/exosuit/newowner = loc - if(!istype(newowner)) - return qdel(src) - owner = newowner +/obj/screen/exosuit/proc/get_owning_exosuit() + var/mob/living/exosuit/owner = owner_ref?.resolve() + if(istype(owner) && !QDELETED(owner)) + return owner -/obj/screen/exosuit/Click() - return (owner && (!usr.incapacitated() && usr.canClick() && (usr == owner || usr.loc == owner))) +/obj/screen/exosuit/radio + name = "radio" + maptext_x = 5 + maptext_y = 12 + initial_maptext = "RADIO" + +/obj/screen/exosuit/radio/handle_click(mob/user, params) + if(!..()) + return FALSE + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner.radio) + owner.radio.attack_self(user) + else + to_chat(user, SPAN_WARNING("There is no radio installed.")) + return TRUE /obj/screen/exosuit/hardpoint name = "hardpoint" @@ -53,7 +57,8 @@ /obj/screen/exosuit/hardpoint/proc/update_system_info() // No point drawing it if we have no item to use or nobody to see it. - if(!holding || !owner) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(!holding || !istype(owner)) return var/has_pilot_with_client = owner.client @@ -89,9 +94,9 @@ if(prob(10)) value = -1 else - value = rand(1,BAR_CAP) + value = rand(1,MECH_BAR_CAP) else - value = round(value * BAR_CAP) + value = round(value * MECH_BAR_CAP) // Draw background. if(!global.default_hardpoint_background) @@ -111,10 +116,10 @@ global.hardpoint_error_icon.pixel_x = 34 new_overlays += global.hardpoint_error_icon else - value = min(value, BAR_CAP) + value = min(value, MECH_BAR_CAP) // Draw statbar. if(!LAZYLEN(global.hardpoint_bar_cache)) - for(var/i=0;i5) @@ -128,63 +133,62 @@ new_overlays += global.hardpoint_bar_cache[i] overlays = new_overlays -/obj/screen/exosuit/hardpoint/Initialize(mapload, var/newtag) +/obj/screen/exosuit/hardpoint/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, newtag) . = ..() hardpoint_tag = newtag name = "hardpoint ([hardpoint_tag])" -/obj/screen/exosuit/hardpoint/Click(var/location, var/control, var/params) - - if(!(..())) - return - - if(!owner?.hatch_closed) - to_chat(usr, SPAN_WARNING("Error: Hardpoint interface disabled while [owner.body.hatch_descriptor] is open.")) - return +/obj/screen/exosuit/hardpoint/handle_click(mob/user, params) + if(!..()) + return FALSE + var/mob/living/exosuit/owner = get_owning_exosuit() + if(!owner.hatch_closed) + to_chat(user, SPAN_WARNING("Error: Hardpoint interface disabled while [owner.body.hatch_descriptor] is open.")) + return TRUE var/modifiers = params2list(params) if(modifiers["ctrl"]) if(owner.hardpoints_locked) - to_chat(usr, SPAN_WARNING("Hardpoint ejection system is locked.")) - return + to_chat(user, SPAN_WARNING("Hardpoint ejection system is locked.")) + return TRUE if(owner.remove_system(hardpoint_tag)) - to_chat(usr, SPAN_NOTICE("You disengage and discard the system mounted to your [hardpoint_tag] hardpoint.")) + to_chat(user, SPAN_NOTICE("You disengage and discard the system mounted to your [hardpoint_tag] hardpoint.")) else - to_chat(usr, SPAN_DANGER("You fail to remove the system mounted to your [hardpoint_tag] hardpoint.")) - return + to_chat(user, SPAN_DANGER("You fail to remove the system mounted to your [hardpoint_tag] hardpoint.")) + return TRUE if(owner.selected_hardpoint == hardpoint_tag) icon_state = "hardpoint" owner.clear_selected_hardpoint() - else - if(owner.set_hardpoint(hardpoint_tag)) - icon_state = "hardpoint_selected" + else if(owner.set_hardpoint(hardpoint_tag)) + icon_state = "hardpoint_selected" + return TRUE /obj/screen/exosuit/eject name = "eject" maptext_x = 5 maptext_y = 12 + initial_maptext = "EJECT" -/obj/screen/exosuit/eject/Initialize() - . = ..() - maptext = MECH_UI_STYLE("EJECT") - -/obj/screen/exosuit/eject/Click() - if(..()) - owner.eject(usr) +/obj/screen/exosuit/eject/handle_click(mob/user, params) + if(!..()) + return FALSE + var/mob/living/exosuit/owner = get_owning_exosuit() + owner.eject(user) + return TRUE /obj/screen/exosuit/rename name = "rename" maptext_x = 1 maptext_y = 12 + initial_maptext = "RENAME" -/obj/screen/exosuit/rename/Initialize() - . = ..() - maptext = MECH_UI_STYLE("RENAME") - -/obj/screen/exosuit/rename/Click() - if(..()) - owner.rename(usr) +/obj/screen/exosuit/rename/handle_click(mob/user, params) + if(!..()) + return FALSE + var/mob/living/exosuit/owner = get_owning_exosuit() + owner.rename(user) + return TRUE /obj/screen/exosuit/power name = "power" @@ -198,7 +202,7 @@ var/uitext = "" var/toggled = FALSE -/obj/screen/exosuit/toggle/Initialize() +/obj/screen/exosuit/toggle/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) . = ..() queue_icon_update() @@ -207,10 +211,13 @@ icon_state = "[initial(icon_state)][toggled ? "_enabled" : ""]" maptext = "[MECH_UI_STYLE(uitext)]" -/obj/screen/exosuit/toggle/Click() - if(..()) toggled() +/obj/screen/exosuit/toggle/handle_click(mob/user, params) + if(..()) + toggled(user) + return TRUE + return FALSE -/obj/screen/exosuit/toggle/proc/toggled() +/obj/screen/exosuit/toggle/proc/toggled(mob/user) toggled = !toggled queue_icon_update() return toggled @@ -223,12 +230,16 @@ height = 12 uitext = "POWER" -/obj/screen/exosuit/toggle/power_control/toggled() +/obj/screen/exosuit/toggle/power_control/toggled(mob/user) . = ..() - owner.toggle_power(usr) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + owner.toggle_power(user) /obj/screen/exosuit/toggle/power_control/on_update_icon() - toggled = (owner.power == MECH_POWER_ON) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(istype(owner)) + toggled = (owner.power == MECH_POWER_ON) . = ..() /obj/screen/exosuit/toggle/air @@ -239,9 +250,11 @@ height = 12 uitext = "AIR" -/obj/screen/exosuit/toggle/air/toggled() - owner.use_air = ..() - to_chat(usr, SPAN_NOTICE("Auxiliary atmospheric system [owner.use_air ? "enabled" : "disabled"].")) +/obj/screen/exosuit/toggle/air/toggled(mob/user) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + owner.use_air = ..() + to_chat(user, SPAN_NOTICE("Auxiliary atmospheric system [owner.use_air ? "enabled" : "disabled"].")) /obj/screen/exosuit/toggle/maint name = "toggle maintenance protocol" @@ -251,9 +264,11 @@ height = 12 uitext = "MAINT" -/obj/screen/exosuit/toggle/maint/toggled() - owner.maintenance_protocols = ..() - to_chat(usr, SPAN_NOTICE("Maintenance protocols [owner.maintenance_protocols ? "enabled" : "disabled"].")) +/obj/screen/exosuit/toggle/maint/toggled(mob/user) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + owner.maintenance_protocols = ..() + to_chat(user, SPAN_NOTICE("Maintenance protocols [owner.maintenance_protocols ? "enabled" : "disabled"].")) /obj/screen/exosuit/toggle/hardpoint name = "toggle hardpoint lock" @@ -261,9 +276,11 @@ maptext_y = 12 uitext = "GEAR" -/obj/screen/exosuit/toggle/hardpoint/toggled() - owner.hardpoints_locked = ..() - to_chat(usr, SPAN_NOTICE("Hardpoint system access is now [owner.hardpoints_locked ? "disabled" : "enabled"].")) +/obj/screen/exosuit/toggle/hardpoint/toggled(mob/user) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + owner.hardpoints_locked = ..() + to_chat(user, SPAN_NOTICE("Hardpoint system access is now [owner.hardpoints_locked ? "disabled" : "enabled"].")) /obj/screen/exosuit/toggle/hatch name = "toggle hatch lock" @@ -271,52 +288,41 @@ maptext_y = 12 uitext = "LOCK" -/obj/screen/exosuit/toggle/hatch/toggled() - if(!owner.hatch_locked && !owner.hatch_closed) - to_chat(usr, SPAN_WARNING("You cannot lock the hatch while it is open.")) - return - owner.hatch_locked = ..() - to_chat(usr, SPAN_NOTICE("The [owner.body.hatch_descriptor] is [owner.hatch_locked ? "now" : "no longer" ] locked.")) +/obj/screen/exosuit/toggle/hatch/toggled(mob/user) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + if(!owner.hatch_locked && !owner.hatch_closed) + to_chat(user, SPAN_WARNING("You cannot lock the hatch while it is open.")) + return + owner.hatch_locked = ..() + to_chat(user, SPAN_NOTICE("The [owner.body.hatch_descriptor] is [owner.hatch_locked ? "now" : "no longer" ] locked.")) /obj/screen/exosuit/toggle/hatch_open name = "open or close hatch" maptext_x = 4 maptext_y = 12 -/obj/screen/exosuit/toggle/hatch_open/toggled() - if (!owner) - return - if(owner.hatch_locked && owner.hatch_closed) - to_chat(usr, SPAN_WARNING("You cannot open the hatch while it is locked.")) - return - owner.hatch_closed = ..() - to_chat(usr, SPAN_NOTICE("The [owner.body.hatch_descriptor] is now [owner.hatch_closed ? "closed" : "open" ].")) - owner.update_icon() +/obj/screen/exosuit/toggle/hatch_open/toggled(mob/user) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + if(owner.hatch_locked && owner.hatch_closed) + to_chat(user, SPAN_WARNING("You cannot open the hatch while it is locked.")) + return + owner.hatch_closed = ..() + to_chat(user, SPAN_NOTICE("The [owner.body.hatch_descriptor] is now [owner.hatch_closed ? "closed" : "open" ].")) + owner.update_icon() /obj/screen/exosuit/toggle/hatch_open/on_update_icon() - toggled = owner.hatch_closed - . = ..() - if(toggled) - maptext = MECH_UI_STYLE("OPEN") - maptext_x = 5 - else - maptext = MECH_UI_STYLE("CLOSE") - maptext_x = 4 - -// This is basically just a holder for the updates the exosuit does. -/obj/screen/exosuit/health - name = "exosuit integrity" - icon_state = "health" - -/obj/screen/exosuit/health/Click() - if(..()) - if(owner && owner.body && owner.get_cell() && owner.body.diagnostics?.is_functional()) - usr.setClickCooldown(0.2 SECONDS) - to_chat(usr, SPAN_NOTICE("The diagnostics panel blinks several times as it updates:")) - playsound(owner.loc,'sound/effects/scanbeep.ogg',30,0) - for(var/obj/item/mech_component/MC in list(owner.arms, owner.legs, owner.body, owner.head)) - if(MC) - MC.return_diagnostics(usr) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(owner) + toggled = owner.hatch_closed + . = ..() + if(toggled) + maptext = MECH_UI_STYLE("OPEN") + maptext_x = 5 + else + maptext = MECH_UI_STYLE("CLOSE") + maptext_x = 4 //Controls if cameras set the vision flags /obj/screen/exosuit/toggle/camera @@ -328,11 +334,14 @@ uitext = "SENSOR" /obj/screen/exosuit/toggle/camera/on_update_icon() - toggled = owner.head.active_sensors + var/mob/living/exosuit/owner = get_owning_exosuit() + if(istype(owner) && owner.head) + toggled = owner.head.active_sensors . = ..() /obj/screen/exosuit/toggle/camera/toggled() - if(!owner.head) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(!istype(owner) || !owner.head) to_chat(usr, SPAN_WARNING("I/O Error: Camera systems not found.")) return if(!owner.head.vision_flags) @@ -355,48 +364,66 @@ var/obj/screen/exosuit/needle/gauge_needle = null desc = "TEST" -/obj/screen/exosuit/heat/Initialize() +/obj/screen/exosuit/heat/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) . = ..() - gauge_needle = new /obj/screen/exosuit/needle(owner) + gauge_needle = new /obj/screen/exosuit/needle(null, _owner) add_vis_contents(src, gauge_needle) /obj/screen/exosuit/heat/Destroy() QDEL_NULL(gauge_needle) . = ..() -/obj/screen/exosuit/heat/Click(location, control, params) - if(..()) - var/modifiers = params2list(params) - if(modifiers["shift"]) - if(owner && owner.material) - usr.show_message(SPAN_NOTICE("Your suit's safe operating limit ceiling is [(celsius ? "[owner.material.melting_point - T0C] °C" : "[owner.material.melting_point] K" )]."), VISIBLE_MESSAGE) - return - if(modifiers["ctrl"]) - celsius = !celsius - usr.show_message(SPAN_NOTICE("You switch the chassis probe display to use [celsius ? "celsius" : "kelvin"]."), VISIBLE_MESSAGE) - return - if(owner && owner.body && owner.body.diagnostics?.is_functional() && owner.loc) - usr.show_message(SPAN_NOTICE("The life support panel blinks several times as it updates:"), VISIBLE_MESSAGE) - - usr.show_message(SPAN_NOTICE("Chassis heat probe reports temperature of [(celsius ? "[owner.bodytemperature - T0C] °C" : "[owner.bodytemperature] K" )]."), VISIBLE_MESSAGE) - if(owner.material.melting_point < owner.bodytemperature) - usr.show_message(SPAN_WARNING("Warning: Current chassis temperature exceeds operating parameters."), VISIBLE_MESSAGE) - var/air_contents = owner.loc.return_air() - if(!air_contents) - usr.show_message(SPAN_WARNING("The external air probe isn't reporting any data!"), VISIBLE_MESSAGE) - else - usr.show_message(SPAN_NOTICE("External probes report: [jointext(atmosanalyzer_scan(owner.loc, air_contents), "
")]"), VISIBLE_MESSAGE) +/obj/screen/exosuit/heat/handle_click(mob/user, params) + if(!..()) + return FALSE + var/mob/living/exosuit/owner = get_owning_exosuit() + var/modifiers = params2list(params) + if(modifiers["shift"]) + if(owner.material) + user.show_message(SPAN_NOTICE("Your suit's safe operating limit ceiling is [(celsius ? "[owner.material.melting_point - T0C] °C" : "[owner.material.melting_point] K" )]."), VISIBLE_MESSAGE) + return TRUE + if(modifiers["ctrl"]) + celsius = !celsius + user.show_message(SPAN_NOTICE("You switch the chassis probe display to use [celsius ? "celsius" : "kelvin"]."), VISIBLE_MESSAGE) + return TRUE + if(owner.body && owner.body.diagnostics?.is_functional() && owner.loc) + user.show_message(SPAN_NOTICE("The life support panel blinks several times as it updates:"), VISIBLE_MESSAGE) + user.show_message(SPAN_NOTICE("Chassis heat probe reports temperature of [(celsius ? "[owner.bodytemperature - T0C] °C" : "[owner.bodytemperature] K" )]."), VISIBLE_MESSAGE) + if(owner.material.melting_point < owner.bodytemperature) + user.show_message(SPAN_WARNING("Warning: Current chassis temperature exceeds operating parameters."), VISIBLE_MESSAGE) + var/air_contents = owner.loc.return_air() + if(!air_contents) + user.show_message(SPAN_WARNING("The external air probe isn't reporting any data!"), VISIBLE_MESSAGE) else - usr.show_message(SPAN_WARNING("The life support panel isn't responding."), VISIBLE_MESSAGE) + user.show_message(SPAN_NOTICE("External probes report: [jointext(atmosanalyzer_scan(owner.loc, air_contents), "
")]"), VISIBLE_MESSAGE) + else + user.show_message(SPAN_WARNING("The life support panel isn't responding."), VISIBLE_MESSAGE) + return TRUE /obj/screen/exosuit/heat/proc/Update() //Relative value of heat - if(owner && owner.body && owner.body.diagnostics?.is_functional() && gauge_needle) + var/mob/living/exosuit/owner = get_owning_exosuit() + if(istype(owner) && owner.body && owner.body.diagnostics?.is_functional() && gauge_needle) var/value = clamp(owner.bodytemperature / (owner.material.melting_point * 1.55), 0, 1) var/matrix/rot_matrix = matrix() rot_matrix.Turn(Interpolate(-90, 90, value)) rot_matrix.Translate(0, -2) animate(gauge_needle, transform = rot_matrix, 0.1, easing = SINE_EASING) -#undef BAR_CAP -#undef MECH_UI_STYLE +// This is basically just a holder for the updates the exosuit does. +/obj/screen/exosuit/health + name = "exosuit integrity" + icon_state = "health" + +/obj/screen/exosuit/health/handle_click(mob/user, params) + if(!..()) + return FALSE + var/mob/living/exosuit/owner = get_owning_exosuit() + if(!owner.body || !owner.get_cell() || !owner.body.diagnostics?.is_functional()) + return FALSE + user.setClickCooldown(0.2 SECONDS) + to_chat(user, SPAN_NOTICE("The diagnostics panel blinks several times as it updates:")) + playsound(owner.loc,'sound/effects/scanbeep.ogg',30,0) + for(var/obj/item/mech_component/MC in list(owner.arms, owner.legs, owner.body, owner.head)) + MC.return_diagnostics(user) + return TRUE diff --git a/code/_onclick/hud/screen/screen_fullscreen.dm b/code/_onclick/hud/screen/screen_fullscreen.dm new file mode 100644 index 00000000000..3a793ba82bb --- /dev/null +++ b/code/_onclick/hud/screen/screen_fullscreen.dm @@ -0,0 +1,112 @@ +/obj/screen/fullscreen + icon = 'icons/mob/screen_full.dmi' + icon_state = "default" + screen_loc = ui_center_fullscreen + plane = FULLSCREEN_PLANE + layer = FULLSCREEN_LAYER + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + var/severity = 0 + var/allstate = 0 //shows if it should show up for dead people too + +/obj/screen/fullscreen/Destroy() + severity = 0 + return ..() + +/obj/screen/fullscreen/brute + icon_state = "brutedamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/oxy + icon_state = "oxydamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/crit + icon_state = "passage" + layer = CRIT_LAYER + +/obj/screen/fullscreen/blind + icon_state = "blackimageoverlay" + layer = BLIND_LAYER + +/obj/screen/fullscreen/blackout + icon = 'icons/mob/screen1.dmi' + icon_state = "black" + screen_loc = ui_entire_screen + layer = BLIND_LAYER + +/obj/screen/fullscreen/impaired + icon_state = "impairedoverlay" + layer = IMPAIRED_LAYER + +/obj/screen/fullscreen/blurry + icon = 'icons/mob/screen1.dmi' + screen_loc = ui_entire_screen + icon_state = "blurry" + alpha = 100 + +/obj/screen/fullscreen/flash + icon = 'icons/mob/screen1.dmi' + screen_loc = ui_entire_screen + icon_state = "flash" + +/obj/screen/fullscreen/flash/noise + icon_state = "noise" + +/obj/screen/fullscreen/high + icon = 'icons/mob/screen1.dmi' + screen_loc = ui_entire_screen + icon_state = "druggy" + alpha = 180 + blend_mode = BLEND_MULTIPLY + +/obj/screen/fullscreen/noise + icon = 'icons/effects/static.dmi' + icon_state = "1 light" + screen_loc = ui_entire_screen + alpha = 127 + +/obj/screen/fullscreen/fadeout + icon = 'icons/mob/screen1.dmi' + icon_state = "black" + screen_loc = ui_entire_screen + alpha = 0 + allstate = 1 + +/obj/screen/fullscreen/fadeout/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) + . = ..() + animate(src, alpha = 255, time = 10) + +/obj/screen/fullscreen/scanline + icon = 'icons/effects/static.dmi' + icon_state = "scanlines" + screen_loc = ui_entire_screen + alpha = 50 + +/obj/screen/fullscreen/fishbed + icon_state = "fishbed" + allstate = 1 + +/obj/screen/fullscreen/pain + icon_state = "brutedamageoverlay6" + alpha = 0 + +/obj/screen/fullscreen/blueprints + icon = 'icons/effects/blueprints.dmi' + icon_state = "base" + screen_loc = ui_entire_screen + alpha = 100 + +/obj/screen/fullscreen/jump_overlay + icon = 'icons/effects/effects.dmi' + icon_state = "mfoam" + screen_loc = ui_entire_screen + color = "#ff9900" + blend_mode = BLEND_SUBTRACT + +/obj/screen/fullscreen/wormhole_overlay + icon = 'icons/effects/effects.dmi' + icon_state = "mfoam" + screen_loc = ui_entire_screen + color = "#ff9900" + alpha = 100 + blend_mode = BLEND_SUBTRACT diff --git a/code/_onclick/hud/screen/screen_global_hud.dm b/code/_onclick/hud/screen/screen_global_hud.dm new file mode 100644 index 00000000000..2071a0bef83 --- /dev/null +++ b/code/_onclick/hud/screen/screen_global_hud.dm @@ -0,0 +1,21 @@ +/obj/screen/global_hud + screen_loc = ui_entire_screen + icon = 'icons/effects/hud_full.dmi' + plane = FULLSCREEN_PLANE + layer = FULLSCREEN_LAYER + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + alpha = 125 + blend_mode = BLEND_MULTIPLY + requires_owner = FALSE + is_global_screen = TRUE + user_incapacitation_flags = null + +/obj/screen/global_holomap + name = "holomap" + icon = null + plane = HUD_PLANE + layer = HUD_BASE_LAYER + screen_loc = UI_HOLOMAP + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + requires_owner = FALSE + is_global_screen = TRUE diff --git a/code/_onclick/hud/screen/screen_gun.dm b/code/_onclick/hud/screen/screen_gun.dm new file mode 100644 index 00000000000..4d0dd63e0dd --- /dev/null +++ b/code/_onclick/hud/screen/screen_gun.dm @@ -0,0 +1,45 @@ +/obj/screen/gun + icon = 'icons/mob/screen1.dmi' + dir = SOUTH + abstract_type = /obj/screen/gun + var/toggle_flag + +/obj/screen/gun/handle_click(mob/user, params) + if(isliving(user)) + var/mob/living/shooter = user + if(!shooter.aiming) + shooter.aiming = new(user) + if(toggle_flag) + shooter.aiming.toggle_permission(toggle_flag) + return TRUE + return FALSE + +/obj/screen/gun/move + name = "Allow Movement" + icon_state = "no_walk1" + screen_loc = ui_gun2 + toggle_flag = TARGET_CAN_MOVE + +/obj/screen/gun/item + name = "Allow Item Use" + icon_state = "no_item1" + screen_loc = ui_gun1 + toggle_flag = TARGET_CAN_CLICK + +/obj/screen/gun/radio + name = "Disallow Radio Use" + icon_state = "no_radio1" + screen_loc = ui_gun4 + toggle_flag = TARGET_CAN_RADIO + +/obj/screen/gun/mode + name = "Toggle Gun Mode" + icon_state = "gun0" + screen_loc = ui_gun_select + +/obj/screen/gun/mode/handle_click(mob/user, params) + if(..()) + var/mob/living/shooter = user + shooter.aiming.toggle_active() + return TRUE + return FALSE diff --git a/code/_onclick/hud/screen/screen_holomap.dm b/code/_onclick/hud/screen/screen_holomap.dm new file mode 100644 index 00000000000..cc081b3b3f3 --- /dev/null +++ b/code/_onclick/hud/screen/screen_holomap.dm @@ -0,0 +1,98 @@ +/obj/screen/holomap_level_select + icon = 'icons/misc/mark.dmi' + layer = HUD_ITEM_LAYER + requires_owner = FALSE + var/active = TRUE + var/datum/station_holomap/holomap + +/obj/screen/holomap_text + icon = null + layer = HUD_ITEM_LAYER + maptext_width = 96 + requires_owner = FALSE + +/obj/screen/holomap_text/Initialize() + . = ..() + appearance_flags |= RESET_COLOR + +/obj/screen/holomap_level_select/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, datum/station_holomap/_holomap) + . = ..() + holomap = _holomap + +/obj/screen/holomap_level_select/handle_click(mob/user, params) + return !isghost(user) + +/obj/screen/holomap_level_select/up + icon_state = "fup" + +/obj/screen/holomap_level_select/up/handle_click(mob/user, params) + if(..() && holomap) + holomap.set_level(holomap.displayed_level - 1) + +/obj/screen/holomap_level_select/down + icon_state = "fdn" + +/obj/screen/holomap_level_select/down/handle_click(mob/user, params) + if(..() && holomap) + holomap.set_level(holomap.displayed_level + 1) + +/obj/screen/holomap_legend + icon = null + maptext_height = 128 + maptext_width = 128 + layer = HUD_ITEM_LAYER + pixel_x = HOLOMAP_LEGEND_X + appearance_flags = DEFAULT_APPEARANCE_FLAGS | RESET_COLOR + requires_owner = FALSE + var/saved_color + var/datum/station_holomap/holomap = null + var/has_areas = FALSE + +/obj/screen/holomap_legend/cursor + icon = 'icons/misc/holomap_markers.dmi' + icon_state = "you" + maptext_x = 11 + pixel_x = HOLOMAP_LEGEND_X - 3 + has_areas = TRUE + +/obj/screen/holomap_legend/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, map_color, text) + . = ..() + saved_color = map_color + maptext = "[text]" + alpha = 255 + +/obj/screen/holomap_legend/handle_click(mob/user, params) + if(!isghost(user) && istype(holomap)) + holomap.legend_select(src) + +/obj/screen/holomap_legend/proc/Setup(z_level) + has_areas = FALSE + //Get the areas for this z level and mark if we're empty + overlays.Cut() + for(var/area/A in SSminimap.holomaps[z_level].holomap_areas) + if(A.holomap_color == saved_color) + var/image/area = image(SSminimap.holomaps[z_level].holomap_areas[A]) + area.pixel_x = ((HOLOMAP_ICON_SIZE / 2) - WORLD_CENTER_X) - pixel_x + area.pixel_y = ((HOLOMAP_ICON_SIZE / 2) - WORLD_CENTER_Y) - pixel_y + overlays += area + has_areas = TRUE + +//What happens when we are clicked on / when another is clicked on +/obj/screen/holomap_legend/proc/Select() + //Start blinking + animate(src, alpha = 0, time = 2, loop = -1, easing = JUMP_EASING | EASE_IN | EASE_OUT) + animate(alpha = 254, time = 2, loop = -1, easing = JUMP_EASING | EASE_IN | EASE_OUT) + +/obj/screen/holomap_legend/proc/Deselect() + //Stop blinking + animate(src, flags = ANIMATION_END_NOW) + +//Cursor doesnt do anything specific. +/obj/screen/holomap_legend/cursor/Setup() + return + +/obj/screen/holomap_legend/cursor/Select() + return + +/obj/screen/holomap_legend/cursor/Deselect() + return diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm new file mode 100644 index 00000000000..91e9a11f5b1 --- /dev/null +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -0,0 +1,69 @@ +/obj/screen/intent + name = "intent" + icon = 'icons/mob/screen/white.dmi' + icon_state = "intent_help" + screen_loc = ui_acti + var/intent = I_HELP + +/obj/screen/intent/handle_click(mob/user, params) + var/list/P = params2list(params) + var/icon_x = text2num(P["icon-x"]) + var/icon_y = text2num(P["icon-y"]) + intent = I_DISARM + if(icon_x <= world.icon_size/2) + if(icon_y <= world.icon_size/2) + intent = I_HURT + else + intent = I_HELP + else if(icon_y <= world.icon_size/2) + intent = I_GRAB + update_icon() + user.a_intent = intent + +/obj/screen/intent/on_update_icon() + icon_state = "intent_[intent]" + +/obj/screen/intent/deity + var/list/desc_screens = list() + screen_loc = "RIGHT-5:122,BOTTOM:8" + +/obj/screen/intent/deity/on_update_icon() + . = ..() + cut_overlays() + add_overlay(image('icons/mob/screen_phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) + compile_overlays() + +/obj/screen/intent/deity/proc/sync_to_mob(var/mob) + var/mob/living/deity/D = mob + for(var/i in 1 to D.control_types.len) + var/obj/screen/deity_marker/S = new(null, D) + desc_screens[D.control_types[i]] = S + S.screen_loc = screen_loc + //This sets it up right. Trust me. + S.maptext_y = 33/2*i - i*i/2 - 10 + D.client.screen += S + + update_text() + +/obj/screen/intent/deity/proc/update_text() + if(!isdeity(usr)) + return + var/mob/living/deity/D = usr + for(var/i in D.control_types) + var/obj/screen/deity_marker/S = desc_screens[i] + var/datum/phenomena/P = D.intent_phenomenas[intent][i] + if(P) + S.maptext = "[P.name]" + else + S.maptext = null + +/obj/screen/intent/deity/handle_click(mob/user, params) + ..() + update_text() + +/obj/screen/deity_marker + name = "" //Don't want them to be able to actually right click it. + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + icon_state = "blank" + maptext_width = 128 + maptext_x = -125 \ No newline at end of file diff --git a/code/_onclick/hud/screen/screen_internal.dm b/code/_onclick/hud/screen/screen_internal.dm new file mode 100644 index 00000000000..856132a3faa --- /dev/null +++ b/code/_onclick/hud/screen/screen_internal.dm @@ -0,0 +1,9 @@ +/obj/screen/internals + name = "internal" + icon_state = "internal0" + screen_loc = ui_internal + +/obj/screen/internals/handle_click(mob/user, params) + if(isliving(user)) + var/mob/living/M = user + M.ui_toggle_internals() diff --git a/code/_onclick/hud/screen/screen_inventory.dm b/code/_onclick/hud/screen/screen_inventory.dm new file mode 100644 index 00000000000..24b4911d259 --- /dev/null +++ b/code/_onclick/hud/screen/screen_inventory.dm @@ -0,0 +1,73 @@ +/obj/screen/inventory + var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. + var/weakref/mouse_over_atom_ref + +/obj/screen/inventory/handle_click(mob/user, params) + if(name in user.get_held_item_slots()) + if(name == user.get_active_held_item_slot()) + user.attack_empty_hand() + else + user.select_held_item_slot(name) + else if(user.attack_ui(slot_id)) + user.update_inhand_overlays(FALSE) + return FALSE + +/obj/screen/inventory/MouseDrop() + . = ..() + mouse_over_atom_ref = null + update_icon() + +// Overriding Click() here instead of using handle_click() to be thorough. +/obj/screen/inventory/Click(location, control, parameters) + . = ..() + mouse_over_atom_ref = null + update_icon() + +/obj/screen/inventory/MouseEntered(location, control, params) + . = ..() + if(!slot_id || !usr) + return + var/equipped_item = usr.get_active_hand() + if(equipped_item) + var/new_mouse_over_atom = weakref(equipped_item) + if(new_mouse_over_atom != mouse_over_atom_ref) + mouse_over_atom_ref = new_mouse_over_atom + update_icon() + +/obj/screen/inventory/MouseExited(location, control, params) + . = ..() + if(mouse_over_atom_ref) + mouse_over_atom_ref = null + update_icon() + +/obj/screen/inventory/on_update_icon() + + cut_overlays() + + // Validate our owner still exists. + var/mob/owner = owner_ref?.resolve() + if(!istype(owner) || QDELETED(owner) || !(src in owner.client?.screen)) + return + + // Mark our selected hand. + if(owner.get_active_held_item_slot() == slot_id) + add_overlay("hand_selected") + + // Mark anything we're potentially trying to equip. + var/obj/item/mouse_over_atom = mouse_over_atom_ref?.resolve() + if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !usr.get_equipped_item(slot_id)) + var/mutable_appearance/MA = new /mutable_appearance(mouse_over_atom) + MA.layer = HUD_ABOVE_ITEM_LAYER + MA.plane = HUD_PLANE + MA.alpha = 80 + MA.color = mouse_over_atom.mob_can_equip(owner, slot_id, TRUE) ? COLOR_GREEN : COLOR_RED + MA.pixel_x = mouse_over_atom.default_pixel_x + MA.pixel_y = mouse_over_atom.default_pixel_y + MA.pixel_w = mouse_over_atom.default_pixel_w + MA.pixel_z = mouse_over_atom.default_pixel_z + add_overlay(MA) + else + mouse_over_atom_ref = null + + // UI needs to be responsive so avoid the subsecond update delay. + compile_overlays() diff --git a/code/_onclick/hud/screen/screen_lighting.dm b/code/_onclick/hud/screen/screen_lighting.dm new file mode 100644 index 00000000000..0354ad4a0cb --- /dev/null +++ b/code/_onclick/hud/screen/screen_lighting.dm @@ -0,0 +1,11 @@ +/obj/screen/lighting_plane_master + screen_loc = "CENTER" + appearance_flags = PLANE_MASTER + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + plane = LIGHTING_PLANE + blend_mode = BLEND_MULTIPLY + alpha = 255 + +/obj/screen/lighting_plane_master/set_alpha(var/new_alpha) + if(alpha != new_alpha) + animate(src, alpha = new_alpha, time = SSmobs.wait) \ No newline at end of file diff --git a/code/_onclick/hud/screen/screen_maneuver.dm b/code/_onclick/hud/screen/screen_maneuver.dm new file mode 100644 index 00000000000..76c524467e5 --- /dev/null +++ b/code/_onclick/hud/screen/screen_maneuver.dm @@ -0,0 +1,19 @@ +/obj/screen/maneuver + name = "Prepare Maneuver" + icon_state = "maneuver_off" + screen_loc = ui_pull_resist + +/obj/screen/maneuver/handle_click(mob/user, params) + if(isliving(user)) + var/mob/living/user_living = user + user_living.prepare_maneuver() + +/obj/screen/maneuver/examine(mob/user) + . = ..() + if(!isliving(user)) + return + var/mob/living/user_living = user + if(user_living.prepared_maneuver) + to_chat(src, SPAN_NOTICE("You are prepared to [user_living.prepared_maneuver.name].")) + else + to_chat(src, SPAN_NOTICE("You are not prepared to perform a maneuver.")) diff --git a/code/_onclick/hud/screen/screen_module.dm b/code/_onclick/hud/screen/screen_module.dm new file mode 100644 index 00000000000..258a3e5dacb --- /dev/null +++ b/code/_onclick/hud/screen/screen_module.dm @@ -0,0 +1,10 @@ +/obj/screen/robot_module_select + name = "module" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "nomod" + screen_loc = ui_borg_module + +/obj/screen/robot_module_select/handle_click(mob/user, params) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.pick_module() diff --git a/code/_onclick/hud/screen/screen_movement.dm b/code/_onclick/hud/screen/screen_movement.dm new file mode 100644 index 00000000000..e389e554cc5 --- /dev/null +++ b/code/_onclick/hud/screen/screen_movement.dm @@ -0,0 +1,7 @@ +/obj/screen/movement + name = "movement method" + screen_loc = ui_movi + +/obj/screen/movement/handle_click(mob/user, params) + if(istype(user)) + user.set_next_usable_move_intent() diff --git a/code/_onclick/hud/screen/screen_needs.dm b/code/_onclick/hud/screen/screen_needs.dm new file mode 100644 index 00000000000..67da520e367 --- /dev/null +++ b/code/_onclick/hud/screen/screen_needs.dm @@ -0,0 +1,117 @@ + +// Yes, these use icon state. Yes, these are terrible. The alternative is duplicating +// a bunch of fairly blobby logic for every click override on these objects. +/obj/screen/food + name = "nutrition" + icon = 'icons/mob/status_hunger.dmi' + pixel_w = 8 + icon_state = "nutrition1" + screen_loc = ui_nutrition_small + +/obj/screen/food/handle_click(mob/user, params) + if(user.nutrition_icon == src) + switch(icon_state) + if("nutrition0") + to_chat(usr, SPAN_WARNING("You are completely stuffed.")) + if("nutrition1") + to_chat(usr, SPAN_NOTICE("You are not hungry.")) + if("nutrition2") + to_chat(usr, SPAN_NOTICE("You are a bit peckish.")) + if("nutrition3") + to_chat(usr, SPAN_WARNING("You are quite hungry.")) + if("nutrition4") + to_chat(usr, SPAN_DANGER("You are starving!")) + +/obj/screen/drink + name = "hydration" + icon = 'icons/mob/status_hunger.dmi' + icon_state = "hydration1" + screen_loc = ui_nutrition_small + +/obj/screen/drink/handle_click(mob/user, params) + if(user.hydration_icon == src) + switch(icon_state) + if("hydration0") + to_chat(usr, SPAN_WARNING("You are overhydrated.")) + if("hydration1") + to_chat(usr, SPAN_NOTICE("You are not thirsty.")) + if("hydration2") + to_chat(usr, SPAN_NOTICE("You are a bit thirsty.")) + if("hydration3") + to_chat(usr, SPAN_WARNING("You are quite thirsty.")) + if("hydration4") + to_chat(usr, SPAN_DANGER("You are dying of thirst!")) + +/obj/screen/bodytemp + name = "body temperature" + icon = 'icons/mob/status_indicators.dmi' + icon_state = "temp1" + screen_loc = ui_temp + +/obj/screen/bodytemp/handle_click(mob/user, params) + if(user.bodytemp == src) + switch(icon_state) + if("temp4") + to_chat(usr, SPAN_DANGER("You are being cooked alive!")) + if("temp3") + to_chat(usr, SPAN_DANGER("Your body is burning up!")) + if("temp2") + to_chat(usr, SPAN_DANGER("You are overheating.")) + if("temp1") + to_chat(usr, SPAN_WARNING("You are uncomfortably hot.")) + if("temp-4") + to_chat(usr, SPAN_DANGER("You are being frozen solid!")) + if("temp-3") + to_chat(usr, SPAN_DANGER("You are freezing cold!")) + if("temp-2") + to_chat(usr, SPAN_WARNING("You are dangerously chilled!")) + if("temp-1") + to_chat(usr, SPAN_NOTICE("You are uncomfortably cold.")) + else + to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) + +/obj/screen/pressure + name = "pressure" + icon = 'icons/mob/status_indicators.dmi' + icon_state = "pressure0" + screen_loc = ui_temp + +/obj/screen/pressure/handle_click(mob/user, params) + if(user.pressure == src) + switch(icon_state) + if("pressure2") + to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) + if("pressure1") + to_chat(usr, SPAN_WARNING("The air pressure here is dangerously high.")) + if("pressure-1") + to_chat(usr, SPAN_WARNING("The air pressure here is dangerously low.")) + if("pressure-2") + to_chat(usr, SPAN_DANGER("There is nearly no air pressure here!")) + else + to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) + +/obj/screen/toxins + name = "toxin" + icon = 'icons/mob/status_indicators.dmi' + icon_state = "tox0" + screen_loc = ui_temp + +/obj/screen/toxins/handle_click(mob/user, params) + if(user.toxin == src) + if(icon_state == "tox0") + to_chat(usr, SPAN_NOTICE("The air is clear of toxins.")) + else + to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) + +/obj/screen/oxygen + name = "oxygen" + icon = 'icons/mob/status_indicators.dmi' + icon_state = "oxy0" + screen_loc = ui_temp + +/obj/screen/oxygen/handle_click(mob/user, params) + if(user.oxygen == src) + if(icon_state == "oxy0") + to_chat(usr, SPAN_NOTICE("You are breathing easy.")) + else + to_chat(usr, SPAN_DANGER("You cannot breathe!")) diff --git a/code/_onclick/hud/screen/screen_pai.dm b/code/_onclick/hud/screen/screen_pai.dm new file mode 100644 index 00000000000..9a78161d1f8 --- /dev/null +++ b/code/_onclick/hud/screen/screen_pai.dm @@ -0,0 +1,74 @@ +/obj/screen/pai + icon = 'icons/mob/screen/pai.dmi' + abstract_type = /obj/screen/pai + +/obj/screen/pai/shell + name = "Toggle Chassis" + +/obj/screen/pai/rest + name = "Rest" + +/obj/screen/pai/light + name = "Toggle Light" + +/obj/screen/pai/software + name = "Software Interface" + icon_state = "pai" + screen_loc = ui_pai_software + +/obj/screen/pai/software/handle_click(mob/user, params) + var/mob/living/silicon/pai/pai = user + if(istype(pai)) + pai.paiInterface() + +/obj/screen/pai/shell + name = "Toggle Chassis" + icon_state = "pai_holoform" + screen_loc = ui_pai_shell + +/obj/screen/pai/shell/handle_click(mob/user, params) + var/mob/living/silicon/pai/pai = user + if(istype(pai)) + if(pai.is_in_card) + pai.unfold() + else + pai.fold() + +/obj/screen/pai/chassis + name = "Holochassis Appearance Composite" + icon_state = "pai_holoform" + +/obj/screen/pai/rest + name = "Rest" + icon_state = "pai_rest" + screen_loc = ui_pai_rest + +/obj/screen/pai/rest/handle_click(mob/user, params) + var/mob/living/silicon/pai/pai = user + if(istype(pai)) + pai.lay_down() + +/obj/screen/pai/light + name = "Toggle Integrated Lights" + icon_state = "light" + screen_loc = ui_pai_light + +/obj/screen/pai/light/handle_click(mob/user, params) + var/mob/living/silicon/pai/pai = user + if(istype(pai)) + pai.toggle_integrated_light() + +/obj/screen/pai/subsystems + name = "Subsystems" + icon_state = "subsystems" + screen_loc = ui_pai_subsystems + +/obj/screen/pai/subsystems/handle_click(mob/user, params) + var/mob/living/silicon/pai/pai = user + if(istype(pai)) + var/ss_name = input(usr, "Activates the given subsystem", "Subsystems", "") in pai.silicon_subsystems_by_name + if (!ss_name) + return + var/stat_silicon_subsystem/SSS = pai.silicon_subsystems_by_name[ss_name] + if(istype(SSS)) + SSS.Click() diff --git a/code/_onclick/hud/screen/screen_radial.dm b/code/_onclick/hud/screen/screen_radial.dm new file mode 100644 index 00000000000..06327701f86 --- /dev/null +++ b/code/_onclick/hud/screen/screen_radial.dm @@ -0,0 +1,68 @@ +/obj/screen/radial + icon = 'icons/screen/radial.dmi' + layer = HUD_ABOVE_ITEM_LAYER + plane = HUD_PLANE + requires_owner = FALSE + var/datum/radial_menu/parent + +/obj/screen/radial/Destroy() + parent = null + return ..() + +/obj/screen/radial/slice + icon_state = "radial_slice" + var/choice + var/next_page = FALSE + var/tooltips = FALSE + +/obj/screen/radial/slice/MouseEntered(location, control, params) + . = ..() + icon_state = "radial_slice_focus" + if(tooltips) + openToolTip(usr, src, params, title = name) + +/obj/screen/radial/slice/MouseExited(location, control, params) + . = ..() + icon_state = "radial_slice" + if(tooltips) + closeToolTip(usr) + +/obj/screen/radial/slice/handle_click(mob/user, params) + if(parent && user.client == parent.current_user) + if(next_page) + parent.next_page() + else + parent.element_chosen(choice, user) + +/obj/screen/radial/center + name = "Close Menu" + icon_state = "radial_center" + +/obj/screen/radial/center/MouseEntered(location, control, params) + . = ..() + icon_state = "radial_center_focus" + +/obj/screen/radial/center/MouseExited(location, control, params) + . = ..() + icon_state = "radial_center" + +/obj/screen/radial/center/handle_click(mob/user, params) + if(user.client == parent.current_user) + parent.finished = TRUE + + +/obj/screen/radial/persistent/center + name = "Close Menu" + icon_state = "radial_center" + +/obj/screen/radial/persistent/center/handle_click(mob/user, params) + if(user.client == parent.current_user) + parent.element_chosen(null,user) + +/obj/screen/radial/persistent/center/MouseEntered(location, control, params) + . = ..() + icon_state = "radial_center_focus" + +/obj/screen/radial/persistent/center/MouseExited(location, control, params) + . = ..() + icon_state = "radial_center" diff --git a/code/_onclick/hud/screen/screen_resist.dm b/code/_onclick/hud/screen/screen_resist.dm new file mode 100644 index 00000000000..9bdb07a9a0b --- /dev/null +++ b/code/_onclick/hud/screen/screen_resist.dm @@ -0,0 +1,9 @@ +/obj/screen/resist + name = "resist" + icon_state = "act_resist" + screen_loc = ui_pull_resist + +/obj/screen/resist/handle_click(mob/user, params) + if(isliving(user)) + var/mob/living/L = user + L.resist() diff --git a/code/_onclick/hud/screen/screen_robot_drop_grab.dm b/code/_onclick/hud/screen/screen_robot_drop_grab.dm new file mode 100644 index 00000000000..674833dd138 --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_drop_grab.dm @@ -0,0 +1,14 @@ +/obj/screen/robot_drop_grab + name = "drop grab" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "drop_grab" + screen_loc = ui_borg_drop_grab + invisibility = INVISIBILITY_MAXIMUM + alpha = 0 + +/obj/screen/robot_drop_grab/handle_click(mob/user, params) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.drop_item() + set_invisibility(INVISIBILITY_MAXIMUM) + alpha = 0 diff --git a/code/_onclick/hud/screen/screen_robot_intent.dm b/code/_onclick/hud/screen/screen_robot_intent.dm new file mode 100644 index 00000000000..0a66dbb06be --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_intent.dm @@ -0,0 +1,8 @@ +/obj/screen/intent/robot + name = "act_intent" + dir = SOUTHWEST + icon = 'icons/mob/screen1_robot.dmi' + screen_loc = ui_acti + +/obj/screen/intent/robot/handle_click(mob/user, params) + user.a_intent_change("right") diff --git a/code/_onclick/hud/screen/screen_robot_inventory.dm b/code/_onclick/hud/screen/screen_robot_inventory.dm new file mode 100644 index 00000000000..427d7256726 --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_inventory.dm @@ -0,0 +1,13 @@ +/obj/screen/robot_inventory + name = "inventory" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "inventory" + screen_loc = ui_borg_inventory + +/obj/screen/robot_inventory/handle_click(mob/user, params) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(R.module) + R.hud_used.toggle_show_robot_modules() + return 1 + to_chat(R, "You haven't selected a module yet.") diff --git a/code/_onclick/hud/screen/screen_robot_modules.dm b/code/_onclick/hud/screen/screen_robot_modules.dm new file mode 100644 index 00000000000..49998998f13 --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_modules.dm @@ -0,0 +1,38 @@ +/obj/screen/robot_modules_background + icon_state = "block" + +/obj/screen/robot_module_one + name = "module1" + dir = SOUTHWEST + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "inv1" + screen_loc = ui_inv1 + +/obj/screen/robot_module_one/handle_click(mob/user, params) + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.toggle_module(1) + +/obj/screen/robot_module_two + name = "module2" + dir = SOUTHWEST + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "inv2" + screen_loc = ui_inv2 + +/obj/screen/robot_module_two/handle_click(mob/user, params) + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.toggle_module(2) + +/obj/screen/robot_module_three + name = "module3" + dir = SOUTHWEST + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "inv3" + screen_loc = ui_inv3 + +/obj/screen/robot_module_three/handle_click(mob/user, params) + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.toggle_module(3) diff --git a/code/_onclick/hud/screen/screen_robot_panel.dm b/code/_onclick/hud/screen/screen_robot_panel.dm new file mode 100644 index 00000000000..31f7275a3a3 --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_panel.dm @@ -0,0 +1,10 @@ +/obj/screen/robot_panel + name = "panel" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "panel" + screen_loc = ui_borg_panel + +/obj/screen/robot_panel/handle_click(mob/user, params) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.installed_modules() diff --git a/code/_onclick/hud/screen/screen_robot_radio.dm b/code/_onclick/hud/screen/screen_robot_radio.dm new file mode 100644 index 00000000000..9073dc59d40 --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_radio.dm @@ -0,0 +1,11 @@ +/obj/screen/robot_radio + name = "radio" + dir = SOUTHWEST + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "radio" + screen_loc = ui_movi + +/obj/screen/robot_radio/handle_click(mob/user, params) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.radio_menu() \ No newline at end of file diff --git a/code/_onclick/hud/screen/screen_robot_store.dm b/code/_onclick/hud/screen/screen_robot_store.dm new file mode 100644 index 00000000000..331aa960e8d --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_store.dm @@ -0,0 +1,14 @@ +/obj/screen/robot_store + name = "store" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "store" + screen_loc = ui_borg_store + +/obj/screen/robot_store/handle_click(mob/user, params) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(R.module) + R.uneq_active() + R.hud_used.update_robot_modules_display() + else + to_chat(R, "You haven't selected a module yet.") diff --git a/code/_onclick/hud/screen/screen_robot_warnings.dm b/code/_onclick/hud/screen/screen_robot_warnings.dm new file mode 100644 index 00000000000..8ff4cc133bc --- /dev/null +++ b/code/_onclick/hud/screen/screen_robot_warnings.dm @@ -0,0 +1,23 @@ +/obj/screen/robot_charge + name = "cell" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "charge-empty" + screen_loc = ui_toxin + +/obj/screen/robot_health + name = "health" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "health0" + screen_loc = ui_borg_health + +/obj/screen/robot_oxygen + name = "oxygen" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "oxy0" + screen_loc = ui_oxygen + +/obj/screen/robot_fire + name = "fire" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "fire0" + screen_loc = ui_fire diff --git a/code/_onclick/hud/screen/screen_setup.dm b/code/_onclick/hud/screen/screen_setup.dm new file mode 100644 index 00000000000..cbd2279d24b --- /dev/null +++ b/code/_onclick/hud/screen/screen_setup.dm @@ -0,0 +1,23 @@ +// Character setup stuff +/obj/screen/setup_preview + icon = 'icons/effects/32x32.dmi' + plane = DEFAULT_PLANE + layer = MOB_LAYER + requires_owner = FALSE + var/datum/preferences/pref + +/obj/screen/setup_preview/Destroy() + pref = null + return ..() + +// Background 'floor' +/obj/screen/setup_preview/bg + layer = TURF_LAYER + mouse_over_pointer = MOUSE_HAND_POINTER + +// Uses Click() instead of handle_click() due to being accessed by new_player mobs. +/obj/screen/setup_preview/bg/Click(location, control, params) + if(pref) + pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) + pref.update_preview_icon() + return ..() diff --git a/code/_onclick/hud/screen/screen_stamina.dm b/code/_onclick/hud/screen/screen_stamina.dm new file mode 100644 index 00000000000..47ca1f3a99a --- /dev/null +++ b/code/_onclick/hud/screen/screen_stamina.dm @@ -0,0 +1,6 @@ +/obj/screen/stamina + name = "stamina" + icon = 'icons/effects/progressbar.dmi' + icon_state = "prog_bar_100" + invisibility = INVISIBILITY_MAXIMUM + screen_loc = ui_stamina diff --git a/code/_onclick/hud/screen/screen_storage.dm b/code/_onclick/hud/screen/screen_storage.dm new file mode 100644 index 00000000000..f1885730211 --- /dev/null +++ b/code/_onclick/hud/screen/screen_storage.dm @@ -0,0 +1,59 @@ +/obj/screen/storage + name = "storage" + user_incapacitation_flags = INCAPACITATION_DISRUPTED + screen_loc = ui_storage_default + layer = HUD_BASE_LAYER + requires_owner = FALSE + var/weakref/storage_master_ref + +/obj/screen/storage/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, obj/item/storage/_storage_master) + . = ..() + storage_master_ref = _storage_master && weakref(_storage_master) + +/obj/screen/storage/handle_click(mob/user, params) + var/obj/item/storage/storage_master = storage_master_ref?.resolve() + if(istype(storage_master) && !QDELETED(storage_master)) + var/obj/item/I = user.get_active_hand() + if(I) + user.ClickOn(storage_master) + return TRUE + return FALSE + +/obj/screen/storage/start + icon_state = "storage_start" + +/obj/screen/storage/cont + icon_state = "storage_continue" + +/obj/screen/storage/boxes + icon_state = "block" + +/obj/screen/storage/end + icon_state = "storage_end" + +/obj/screen/storage/close + name = "close" + icon_state = "x" + layer = HUD_BASE_LAYER + +/obj/screen/storage/close/handle_click(mob/user, params) + var/obj/item/storage/storage_master = storage_master_ref?.resolve() + if(istype(storage_master) && !QDELETED(storage_master)) + storage_master.close(user) + return TRUE + return FALSE + +/obj/screen/stored_start + icon_state = "stored_start" + layer = HUD_BASE_LAYER + requires_owner = FALSE + +/obj/screen/stored_cont + icon_state = "stored_continue" + layer = HUD_BASE_LAYER + requires_owner = FALSE + +/obj/screen/stored_end + icon_state = "stored_end" + layer = HUD_BASE_LAYER + requires_owner = FALSE diff --git a/code/_onclick/hud/screen/screen_swaphands.dm b/code/_onclick/hud/screen/screen_swaphands.dm new file mode 100644 index 00000000000..037602bf9dd --- /dev/null +++ b/code/_onclick/hud/screen/screen_swaphands.dm @@ -0,0 +1,9 @@ +/obj/screen/inventory/swaphand + name = "hand" + icon_state = "hand1" + +/obj/screen/inventory/swaphand/handle_click(mob/user, params) + user.swap_hand() + +/obj/screen/inventory/swaphand/right + icon_state = "hand2" diff --git a/code/_onclick/hud/screen/screen_throw.dm b/code/_onclick/hud/screen/screen_throw.dm new file mode 100644 index 00000000000..679018fba8d --- /dev/null +++ b/code/_onclick/hud/screen/screen_throw.dm @@ -0,0 +1,8 @@ +/obj/screen/throw_toggle + name = "throw" + icon_state = "act_throw_off" + screen_loc = ui_drop_throw + +/obj/screen/throw_toggle/handle_click(mob/user, params) + if(!user.stat && isturf(user.loc) && !user.restrained()) + user.toggle_throw_mode() diff --git a/code/_onclick/hud/screen/screen_toggle.dm b/code/_onclick/hud/screen/screen_toggle.dm new file mode 100644 index 00000000000..aa83c7733d4 --- /dev/null +++ b/code/_onclick/hud/screen/screen_toggle.dm @@ -0,0 +1,12 @@ +/obj/screen/toggle + name = "toggle" + icon_state = "other" + screen_loc = ui_inventory + +/obj/screen/toggle/handle_click(mob/user, params) + if(user.hud_used.inventory_shown) + user.client.screen -= user.hud_used.other + user.hud_used.hide_inventory() + else + user.client.screen += user.hud_used.other + user.hud_used.show_inventory() diff --git a/code/_onclick/hud/screen/screen_up_hint.dm b/code/_onclick/hud/screen/screen_up_hint.dm new file mode 100644 index 00000000000..a6e45820115 --- /dev/null +++ b/code/_onclick/hud/screen/screen_up_hint.dm @@ -0,0 +1,9 @@ +/obj/screen/up_hint + name = "up hint" + icon_state = "uphint0" + screen_loc = ui_up_hint + +/obj/screen/up_hint/handle_click(mob/user, params) + if(isliving(user)) + var/mob/living/L = user + L.lookup() diff --git a/code/_onclick/hud/screen/screen_warnings.dm b/code/_onclick/hud/screen/screen_warnings.dm new file mode 100644 index 00000000000..87d6ec62dee --- /dev/null +++ b/code/_onclick/hud/screen/screen_warnings.dm @@ -0,0 +1,15 @@ +/obj/screen/fire_warning + name = "fire" + icon_state = "fire0" + screen_loc = ui_fire + +/obj/screen/health_warning + name = "health" + icon_state = "health0" + screen_loc = ui_health + +/obj/screen/warning_cells + name = "cell" + icon = 'icons/mob/screen1_robot.dmi' + icon_state = "charge-empty" + screen_loc = ui_nutrition diff --git a/code/_onclick/hud/screen/screen_zone_selector.dm b/code/_onclick/hud/screen/screen_zone_selector.dm new file mode 100644 index 00000000000..58f4ee963a8 --- /dev/null +++ b/code/_onclick/hud/screen/screen_zone_selector.dm @@ -0,0 +1,79 @@ +/obj/screen/zone_selector + name = "damage zone" + icon_state = "zone_sel" + screen_loc = ui_zonesel + var/selecting = BP_CHEST + +/obj/screen/zone_selector/handle_click(mob/user, params) + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/new_selecting + switch(icon_y) + if(1 to 3) //Feet + switch(icon_x) + if(10 to 15) + new_selecting = BP_R_FOOT + if(17 to 22) + new_selecting = BP_L_FOOT + else + return 1 + if(4 to 9) //Legs + switch(icon_x) + if(10 to 15) + new_selecting = BP_R_LEG + if(17 to 22) + new_selecting = BP_L_LEG + if(23 to 28) + new_selecting = BP_TAIL + else + return 1 + if(10 to 13) //Hands and groin + switch(icon_x) + if(8 to 11) + new_selecting = BP_R_HAND + if(12 to 20) + new_selecting = BP_GROIN + if(21 to 24) + new_selecting = BP_L_HAND + else + return 1 + if(14 to 22) //Chest and arms to shoulders + switch(icon_x) + if(8 to 11) + new_selecting = BP_R_ARM + if(12 to 20) + new_selecting = BP_CHEST + if(21 to 24) + new_selecting = BP_L_ARM + else + return 1 + if(23 to 30) //Head, but we need to check for eye or mouth + if(icon_x in 12 to 20) + new_selecting = BP_HEAD + switch(icon_y) + if(23 to 24) + if(icon_x in 15 to 17) + new_selecting = BP_MOUTH + if(26) //Eyeline, eyes are on 15 and 17 + if(icon_x in 14 to 18) + new_selecting = BP_EYES + if(25 to 27) + if(icon_x in 15 to 17) + new_selecting = BP_EYES + set_selected_zone(new_selecting) + return TRUE + +/obj/screen/zone_selector/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) + . = ..() + update_icon() + +/obj/screen/zone_selector/proc/set_selected_zone(bodypart) + var/old_selecting = selecting + selecting = bodypart + if(old_selecting != selecting) + update_icon() + return TRUE + +/obj/screen/zone_selector/on_update_icon() + set_overlays(image('icons/mob/zone_sel.dmi', "[selecting]")) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm deleted file mode 100644 index e041ed0d188..00000000000 --- a/code/_onclick/hud/screen_objects.dm +++ /dev/null @@ -1,379 +0,0 @@ -/* - Screen objects - Todo: improve/re-implement - - Screen objects are only used for the hud and should not appear anywhere "in-game". - They are used with the client/screen list and the screen_loc var. - For more information, see the byond documentation on the screen_loc and screen vars. -*/ -/obj/screen - name = "" - icon = 'icons/mob/screen1.dmi' - plane = HUD_PLANE - layer = HUD_BASE_LAYER - appearance_flags = NO_CLIENT_COLOR - unacidable = 1 - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/globalscreen = FALSE //Global screens are not qdeled when the holding mob is destroyed. - -/obj/screen/receive_mouse_drop(atom/dropping, mob/user) - return TRUE - -/obj/screen/check_mousedrop_interactivity(var/mob/user) - return user.client && (src in user.client.screen) - -/obj/screen/Destroy() - master = null - return ..() - -/obj/screen/text - icon = null - icon_state = null - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - screen_loc = "CENTER-7,CENTER-7" - maptext_height = 480 - maptext_width = 480 - - -/obj/screen/inventory - var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. - - -/obj/screen/close - name = "close" - -/obj/screen/close/Click() - if(master) - if(istype(master, /obj/item/storage)) - var/obj/item/storage/S = master - S.close(usr) - return 1 - -/obj/screen/default_attack_selector - name = "default attack selector" - icon_state = "attack_none" - screen_loc = ui_attack_selector - var/mob/living/carbon/human/owner - -/obj/screen/default_attack_selector/Click(location, control, params) - if(!owner || usr != owner || owner.incapacitated()) - return FALSE - - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - to_chat(owner, SPAN_NOTICE("Your current default attack is [owner.default_attack?.name || "unset"].")) - if(owner.default_attack) - var/summary = owner.default_attack.summarize() - if(summary) - to_chat(owner, SPAN_NOTICE(summary)) - return - - owner.set_default_unarmed_attack(src) - return TRUE - -/obj/screen/default_attack_selector/Destroy() - if(owner) - if(owner.attack_selector == src) - owner.attack_selector = null - owner = null - . = ..() - -/obj/screen/default_attack_selector/proc/set_owner(var/mob/living/carbon/human/_owner) - owner = _owner - if(!owner) - qdel(src) - else - update_icon() - -/obj/screen/default_attack_selector/on_update_icon() - var/decl/natural_attack/attack = owner?.default_attack - icon_state = attack?.selector_icon_state || "attack_none" - -/obj/screen/item_action - var/obj/item/owner - -/obj/screen/item_action/Destroy() - owner = null - . = ..() - -/obj/screen/item_action/Click() - if(!usr || !owner) - return 1 - if(!usr.canClick()) - return - - if(usr.incapacitated()) - return 1 - - if(!(owner in usr)) - return 1 - - owner.ui_action_click() - return 1 - -/obj/screen/storage - name = "storage" - -/obj/screen/storage/Click() - if(!usr.canClick()) - return 1 - if(usr.incapacitated(INCAPACITATION_DISRUPTED)) - return 1 - if(master) - var/obj/item/I = usr.get_active_hand() - if(I) - usr.ClickOn(master) - return 1 - -/obj/screen/zone_selector - name = "damage zone" - icon_state = "zone_sel" - screen_loc = ui_zonesel - var/selecting = BP_CHEST - -/obj/screen/zone_selector/Click(location, control,params) - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/new_selecting - - switch(icon_y) - if(1 to 3) //Feet - switch(icon_x) - if(10 to 15) - new_selecting = BP_R_FOOT - if(17 to 22) - new_selecting = BP_L_FOOT - else - return 1 - if(4 to 9) //Legs - switch(icon_x) - if(10 to 15) - new_selecting = BP_R_LEG - if(17 to 22) - new_selecting = BP_L_LEG - if(23 to 28) - new_selecting = BP_TAIL - else - return 1 - if(10 to 13) //Hands and groin - switch(icon_x) - if(8 to 11) - new_selecting = BP_R_HAND - if(12 to 20) - new_selecting = BP_GROIN - if(21 to 24) - new_selecting = BP_L_HAND - else - return 1 - if(14 to 22) //Chest and arms to shoulders - switch(icon_x) - if(8 to 11) - new_selecting = BP_R_ARM - if(12 to 20) - new_selecting = BP_CHEST - if(21 to 24) - new_selecting = BP_L_ARM - else - return 1 - if(23 to 30) //Head, but we need to check for eye or mouth - if(icon_x in 12 to 20) - new_selecting = BP_HEAD - switch(icon_y) - if(23 to 24) - if(icon_x in 15 to 17) - new_selecting = BP_MOUTH - if(26) //Eyeline, eyes are on 15 and 17 - if(icon_x in 14 to 18) - new_selecting = BP_EYES - if(25 to 27) - if(icon_x in 15 to 17) - new_selecting = BP_EYES - - set_selected_zone(new_selecting) - return 1 - -/obj/screen/zone_selector/Initialize(mapload) - . = ..() - update_icon() - -/obj/screen/zone_selector/proc/set_selected_zone(bodypart) - var/old_selecting = selecting - selecting = bodypart - if(old_selecting != selecting) - update_icon() - return TRUE - -/obj/screen/zone_selector/on_update_icon() - set_overlays(image('icons/mob/zone_sel.dmi', "[selecting]")) - -/obj/screen/intent - name = "intent" - icon = 'icons/mob/screen/white.dmi' - icon_state = "intent_help" - screen_loc = ui_acti - var/intent = I_HELP - -/obj/screen/intent/Click(var/location, var/control, var/params) - var/list/P = params2list(params) - var/icon_x = text2num(P["icon-x"]) - var/icon_y = text2num(P["icon-y"]) - intent = I_DISARM - if(icon_x <= world.icon_size/2) - if(icon_y <= world.icon_size/2) - intent = I_HURT - else - intent = I_HELP - else if(icon_y <= world.icon_size/2) - intent = I_GRAB - update_icon() - usr.a_intent = intent - -/obj/screen/intent/on_update_icon() - icon_state = "intent_[intent]" - -/obj/screen/Click(location, control, params) - if(!usr) return 1 - - switch(name) - if("toggle") - if(usr.hud_used.inventory_shown) - usr.client.screen -= usr.hud_used.other - usr.hud_used.hide_inventory() - else - usr.client.screen += usr.hud_used.other - usr.hud_used.show_inventory() - - if("equip") - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.quick_equip() - - if("resist") - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - - if("Reset Machine") - usr.unset_machine() - - if("up hint") - if(isliving(usr)) - var/mob/living/L = usr - L.lookup() - - if("internal") - if(isliving(usr)) - var/mob/living/M = usr - M.ui_toggle_internals() - - if("act_intent") - usr.a_intent_change("right") - - if("throw") - if(!usr.stat && isturf(usr.loc) && !usr.restrained()) - usr.toggle_throw_mode() - if("drop") - if(usr.client) - usr.client.drop_item() - - if("module") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.pick_module() - - if("inventory") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.hud_used.toggle_show_robot_modules() - return 1 - else - to_chat(R, "You haven't selected a module yet.") - - if("radio") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.radio_menu() - if("panel") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.installed_modules() - - if("store") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.uneq_active() - R.hud_used.update_robot_modules_display() - else - to_chat(R, "You haven't selected a module yet.") - - if("module1") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.toggle_module(1) - - if("module2") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.toggle_module(2) - - if("module3") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.toggle_module(3) - else - return 0 - return 1 - -/obj/screen/inventory/Click() - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(!usr.canClick() || usr.incapacitated()) - return TRUE - - if(name == "swap" || name == "hand") - usr.swap_hand() - else if(name in usr.get_held_item_slots()) - if(name == usr.get_active_held_item_slot()) - usr.attack_empty_hand() - else - usr.select_held_item_slot(name) - else if(usr.attack_ui(slot_id)) - usr.update_inhand_overlays(FALSE) - - return TRUE - -// Character setup stuff -/obj/screen/setup_preview - plane = DEFAULT_PLANE - layer = MOB_LAYER - - var/datum/preferences/pref - -/obj/screen/setup_preview/Destroy() - pref = null - return ..() - -// Background 'floor' -/obj/screen/setup_preview/bg - layer = TURF_LAYER - mouse_over_pointer = MOUSE_HAND_POINTER - -/obj/screen/setup_preview/bg/Click(params) - if(pref) - pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) - pref.update_preview_icon() - -/obj/screen/lighting_plane_master - screen_loc = "CENTER" - appearance_flags = PLANE_MASTER - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - plane = LIGHTING_PLANE - blend_mode = BLEND_MULTIPLY - alpha = 255 - -/obj/screen/lighting_plane_master/proc/set_alpha(var/newalpha) - if(alpha != newalpha) - animate(src, alpha = newalpha, time = SSmobs.wait) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 1b4b1dad91b..3e6f983e699 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -49,17 +49,6 @@ avoid code duplication. This includes items that may sometimes act as a standard return 0 if(can_operate(src,user) != OPERATE_DENY && I.do_surgery(src,user)) //Surgery return 1 - - if(user.a_intent == I_HELP && istype(I, /obj/item/clothing/head)) - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable) - if(hattable.hat) - to_chat(user, SPAN_WARNING("\The [src] is already wearing \the [hattable.hat].")) - return TRUE - if(user.try_unequip(I) && hattable.wear_hat(src, I)) - user.visible_message(SPAN_NOTICE("\The [user] puts \the [I] on \the [src].")) - return TRUE - return I.attack(src, user, user.get_target_zone() || ran_zone()) /mob/living/carbon/human/attackby(obj/item/I, mob/user) @@ -91,6 +80,10 @@ avoid code duplication. This includes items that may sometimes act as a standard //I would prefer to rename this attack_as_weapon(), but that would involve touching hundreds of files. /obj/item/proc/attack(mob/living/M, mob/living/user, var/target_zone, animate = TRUE) + + if(user?.a_intent != I_HURT && is_edible(M) && handle_eaten_by_mob(user, M) != EATEN_INVALID) + return TRUE + if(item_flags & ITEM_FLAG_NO_BLUDGEON) return FALSE diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d529f620b2f..95c0b5aed21 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -2,26 +2,6 @@ /atom/proc/attack_generic(mob/user) return 0 -/* - Humans: - Adds an exception for gloves, to allow special glove types like the ninja ones. - - Otherwise pretty standard. -*/ -/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity) - - if(!..()) - return - - // Special glove functions: - // If the gloves do anything, have them return 1 to stop - // normal attack_hand() here. - var/obj/item/clothing/gloves/G = get_equipped_item(slot_gloves_str) // not typecast specifically enough in defines - if(istype(G) && G.Touch(A,1)) - return - - A.attack_hand(src) - /atom/proc/handle_grab_interaction(var/mob/user) return FALSE @@ -29,7 +9,7 @@ SHOULD_CALL_PARENT(TRUE) if(handle_grab_interaction(user)) return TRUE - if(!LAZYLEN(climbers) || (user in climbers) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) + if(!LAZYLEN(climbers) || (user in climbers) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, silent = TRUE)) return FALSE user.visible_message( SPAN_DANGER("\The [user] shakes \the [src]!"), @@ -43,12 +23,6 @@ /mob/living/carbon/human/RestrainedClickOn(var/atom/A) return -/mob/living/CtrlClickOn(var/atom/A) - . = ..() - if(!. && a_intent == I_GRAB && length(available_maneuvers)) - . = perform_maneuver(prepared_maneuver || available_maneuvers[1], A) - - /mob/living/carbon/human/RangedAttack(var/atom/A, var/params) //Climbing up open spaces if(isturf(loc) && bound_overlay && !is_physically_disabled() && istype(A) && A.can_climb_from_below(src)) @@ -72,11 +46,12 @@ /mob/living/carbon/alien/UnarmedAttack(var/atom/A, var/proximity) - if(!..()) - return 0 + . = ..() + if(.) + return setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - A.attack_generic(src,rand(5,6),"bites") + return A.attack_generic(src,rand(5,6),"bites") /* New Players: @@ -88,23 +63,37 @@ /* Animals */ + /mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity) - if(!..()) + . = ..() + if(.) return - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(isliving(A)) - if(a_intent == I_HELP || !get_natural_weapon()) - custom_emote(1,"[friendly] [A]!") - return - if(ckey) - admin_attack_log(src, A, "Has attacked its victim.", "Has been attacked by its attacker.") - if(a_intent == I_HELP) - A.attack_animal(src) - else - var/attacking_with = get_natural_weapon() - if(attacking_with) - A.attackby(attacking_with, src) + + setClickCooldown(attack_delay) + var/attacking_with = get_natural_weapon() + if(a_intent == I_HELP || !attacking_with) + return A.attack_animal(src) + + var/decl/pronouns/G = get_pronouns() + face_atom(A) + if(attack_delay) + walk_to(src, 0) // Cancel any baked-in movement. + do_windup_animation(A, attack_delay, no_reset = TRUE) + if(!do_after(src, attack_delay, A) || !Adjacent(A)) + visible_message(SPAN_NOTICE("\The [src] misses [G.his] attack on \the [A]!")) + animate(src, pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2) // reset wherever the attack animation got us to. + MoveToTarget(TRUE) // Restart hostile mob tracking. + return TRUE + MoveToTarget(TRUE) // Restart hostile mob tracking. + + if(ismob(A)) // Clientless mobs are too dum to move away, so they can be missed. + var/mob/mob = A + if(!mob.ckey && !prob(get_melee_accuracy())) + visible_message(SPAN_NOTICE("\The [src] misses [G.his] attack on \the [A]!")) + return TRUE + + return A.attackby(attacking_with, src) // Attack hand but for simple animals /atom/proc/attack_animal(mob/user) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 7813f9d5d3c..8dd8799e561 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -28,9 +28,6 @@ /mob/living/carbon/human/can_use_rig() return 1 -/mob/living/carbon/brain/can_use_rig() - return istype(loc, /obj/item/mmi) - /mob/living/silicon/ai/can_use_rig() return carded diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm index b609a369ffb..c37a4784fe0 100644 --- a/code/controllers/autotransfer.dm +++ b/code/controllers/autotransfer.dm @@ -4,7 +4,7 @@ var/global/datum/controller/transfer_controller/transfer_controller var/timerbuffer = 0 //buffer for time check /datum/controller/transfer_controller/New() - timerbuffer = config.vote_autotransfer_initial + timerbuffer = get_config_value(/decl/config/num/vote_autotransfer_initial) START_PROCESSING(SSprocessing, src) /datum/controller/transfer_controller/Destroy() @@ -14,7 +14,7 @@ var/global/datum/controller/transfer_controller/transfer_controller /datum/controller/transfer_controller/Process() if (time_till_transfer_vote() <= 0) SSvote.initiate_vote(/datum/vote/transfer, automatic = 1) - timerbuffer += config.vote_autotransfer_interval + timerbuffer += get_config_value(/decl/config/num/vote_autotransfer_interval) /datum/controller/transfer_controller/proc/time_till_transfer_vote() return timerbuffer - round_duration_in_ticks - (1 MINUTE) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm deleted file mode 100644 index 52841166178..00000000000 --- a/code/controllers/configuration.dm +++ /dev/null @@ -1,1013 +0,0 @@ -var/global/list/gamemode_cache = list() - -/datum/configuration - var/server_name = "Nebula 13" // server name (for world name / status) - var/server_suffix = 0 // generate numeric suffix based on server port - - var/log_ooc = 0 // log OOC channel - var/log_access = 0 // log login/logout - var/log_say = 0 // log client say - var/log_admin = 0 // log admin actions - var/log_debug = 1 // log debug output - var/log_game = 0 // log game events - var/log_vote = 0 // log voting - var/log_whisper = 0 // log client whisper - var/log_emote = 0 // log emotes - var/log_attack = 0 // log attack messages - var/log_adminchat = 0 // log admin chat messages - var/log_adminwarn = 0 // log warnings admins get about bomb construction and such - var/log_pda = 0 // log pda messages - var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits - var/log_runtime = 0 // logs world.log to a file - var/log_world_output = 0 // log to_world_log(messages) - var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour - var/allow_vote_restart = 0 // allow votes to restart - var/ert_admin_call_only = 0 - var/allow_vote_mode = 0 // allow votes to change mode - var/allow_admin_jump = 1 // allows admin jumping - var/allow_admin_spawning = 1 // allows admin item spawning - var/allow_admin_rev = 1 // allows admin revives - var/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) - var/vote_period = 600 // length of voting period (deciseconds, default 1 minute) - var/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called - var/vote_autotransfer_interval = 18000 // length of time before next sequential autotransfer vote - var/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). - var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) - var/vote_no_dead = 0 // dead people can't vote (tbi) - var/vote_no_dead_crew_transfer = 0 // dead people can't vote on crew transfer votes -// var/enable_authentication = 0 // goon authentication - var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/traitor_scaling = 0 //if amount of traitors scales based on amount of players - var/objectives_disabled = 0 //if objectives are disabled or not - var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/allow_holidays = FALSE - var/fps = 20 - var/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling - var/list/resource_urls = null - var/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. - var/list/mode_names = list() - var/list/modes = list() // allowed modes - var/list/votable_modes = list() // votable modes - var/list/probabilities = list() // relative probability of each mode - var/secret_hide_possibilities = FALSE // Whether or not secret modes show list of possible round types - var/humans_need_surnames = 0 - var/allow_random_events = 0 // enables random events mid-round when set to 1 - var/allow_ai = 1 // allow ai job - var/hostedby = null - var/respawn_delay = 30 - var/guest_jobban = 1 - var/usewhitelist = 0 - var/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 - var/mods_can_tempban = 0 - var/mods_can_job_tempban = 0 - var/mod_tempban_max = 1440 - var/mod_job_tempban_max = 1440 - var/load_jobs_from_txt = 0 - var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. - - var/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... - var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. - - var/character_slots = 10 // The number of available character slots - var/loadout_slots = 3 // The number of loadout slots per character - - var/max_maint_drones = 5 //This many drones can spawn, - var/allow_drone_spawn = 1 //assuming the admin allow them to. - var/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. - - var/disable_player_mice = 0 - var/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech - - var/usealienwhitelist = 0 - var/usealienwhitelistSQL = 0; - var/limitalienplayers = 0 - var/alien_to_human_ratio = 0.5 - var/allow_extra_antags = 0 - var/guests_allowed = 1 - var/debugparanoid = 0 - - var/serverurl - var/server - var/banappeals - var/wikiurl - var/forumurl - var/discordurl - var/githuburl - var/issuereporturl - - var/forbid_singulo_possession = 0 - - //game_options.txt configs - - var/show_human_death_message = FALSE - var/health_threshold_dead = -100 - - var/organ_health_multiplier = 0.9 - var/organ_regeneration_multiplier = 0.25 - var/organs_decay - - //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, - //so that it's similar to PAIN. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. - var/organ_damage_spillover_multiplier = 0.5 - - var/bones_can_break = 1 - var/limbs_can_break = 1 - - var/revival_pod_plants = 1 - var/revival_cloning = 1 - var/revival_brain_life = -1 - - var/use_loyalty_implants = 0 - var/max_character_aspects = 5 - - var/welder_vision = 1 - ///If false, skips all level generation. - var/roundstart_level_generation = 1 - var/no_click_cooldown = 0 - - //Used for modifying movement speed for mobs. - //Unversal modifiers - var/run_delay = 2 - var/walk_delay = 4 - var/creep_delay = 6 - var/minimum_sprint_cost = 0.8 - var/skill_sprint_cost_range = 0.8 - var/minimum_stamina_recovery = 1 - var/maximum_stamina_recovery = 3 - var/glide_size_delay = 1 - - //Mob specific modifiers. NOTE: These will affect different mob types in different ways - var/human_delay = 0 - var/robot_delay = 0 - var/monkey_delay = 0 - var/alien_delay = 0 - var/slime_delay = 0 - var/animal_delay = 0 - var/maximum_mushrooms = 15 //After this amount alive, mushrooms will not boom boom - - - var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt - var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt - var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database - var/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database - - var/use_iterative_explosions //Defines whether the server uses iterative or circular explosions. - var/iterative_explosives_z_threshold = 10 - var/iterative_explosives_z_multiplier = 0.75 - - var/assistant_maint = 0 //Do assistants get maint access? - var/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. - var/ghost_interaction = 0 - - var/comms_password = null - var/ban_comms_password = null - var/list/forbidden_versions = list() // Clients with these byond versions will be autobanned. Format: string "byond_version.byond_build"; separate with ; in config, e.g. 512.1234;512.1235 - var/minimum_byond_version = 0 - var/minimum_byond_build = 0 - - var/login_export_addr = null - - var/enter_allowed = 1 - var/player_limit = 0 - - var/use_irc_bot = 0 - var/irc_bot_host = "" - var/main_irc = "" - var/admin_irc = "" - var/announce_shuttle_dock_to_irc = FALSE - - var/custom_item_icon_location // File location to look for custom items icons, needs to be relative to the executing binary. - var/custom_icon_icon_location // File location to look for custom icons, needs to be relative to the executing binary. - - // Event settings - var/expected_round_length = 3 * 60 * 60 * 10 // 3 hours - // If the first delay has a custom start time - // No custom time, no custom time, between 80 to 100 minutes respectively. - var/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) - // The lowest delay until next event - // 10, 30, 50 minutes respectively - var/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) - // The upper delay until next event - // 15, 45, 70 minutes respectively - var/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - - var/aliens_allowed = 0 - var/alien_eggs_allowed = 0 - var/ninjas_allowed = 0 - var/abandon_allowed = 1 - var/ooc_allowed = 1 - var/looc_allowed = 1 - var/dooc_allowed = 1 - var/dsay_allowed = 1 - var/aooc_allowed = 1 - - var/exterior_ambient_light = 0 // The strength of ambient light applied to outside turfs - - var/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" - - var/aggressive_changelog = 0 - var/disable_webhook_embeds = FALSE - - var/ghosts_can_possess_animals = 0 - var/delist_when_no_admins = FALSE - - var/allow_map_switching = 0 // Whether map switching is allowed - var/auto_map_vote = 0 // Automatically call a map vote at end of round and switch to the selected map - var/wait_for_sigusr1_reboot = 0 // Don't allow reboot unless it was caused by SIGUSR1 - - var/radiation_decay_rate = 1 //How much radiation is reduced by each tick - var/radiation_resistance_multiplier = 1.25 - var/radiation_material_resistance_divisor = 2 //A turf's possible radiation resistance is divided by this number, to get the real value. - var/radiation_lower_limit = 0.15 //If the radiation level for a turf would be below this, ignore it. - - var/auto_local_admin = TRUE // If true, connections from 127.0.0.1 get automatic admin. - var/autostealth = 0 // Staff get automatic stealth after this many minutes - - var/error_cooldown = 600 // The "cooldown" time for each occurrence of a unique error - var/error_limit = 50 // How many occurrences before the next will silence them - var/error_silence_time = 6000 // How long a unique error will be silenced for - var/error_msg_delay = 50 // How long to wait between messaging admins about occurrences of a unique error - - var/max_gear_cost = 10 // Used in chargen for accessory loadout limit. 0 disables loadout, negative allows infinite points. - - var/allow_ic_printing = TRUE //Whether players should be allowed to print IC circuits from scripts. - - var/allow_unsafe_narrates = FALSE //Whether admins can use unsanitized narration; when true, allows HTML etc. - - var/do_not_prevent_spam = FALSE //If this is true, skips spam prevention for user actions; inputs, verbs, macros, etc. - var/max_acts_per_interval = 140 //Number of actions per interval permitted for spam protection. - var/act_interval = 0.1 SECONDS //Interval for spam prevention. - - var/panic_bunker = FALSE //is the panic bunker enabled? - var/panic_bunker_message = "Sorry! The panic bunker is enabled. Please head to our Discord or forum to get yourself added to the panic bunker bypass." - - var/lock_client_view_x - var/lock_client_view_y - var/max_client_view_x = MAX_VIEW - var/max_client_view_y = MAX_VIEW - - var/allow_diagonal_movement = FALSE - - var/no_throttle_localhost - - var/dex_malus_brainloss_threshold = 30 //The threshold of when brainloss begins to affect dexterity. - var/grant_default_darksight = FALSE - var/default_darksight_range = 2 - var/default_darksight_effectiveness = 0.05 - - var/static/list/protected_vars = list( - "comms_password", - "ban_comms_password", - "login_export_addr" - ) - - var/expanded_alt_interactions = FALSE // Set to true to enable look, grab, drop, etc. in the alt interaction menu. - - var/show_typing_indicator_for_whispers = FALSE // Do whispers show typing indicators overhead? - - // Stress-related healing vars. - var/adjust_healing_from_stress = FALSE - var/stress_shock_recovery_constant = 0.5 - var/stress_healing_recovery_constant = 0.3 - var/stress_blood_recovery_constant = 0.3 - - var/exoplanet_min_day_duration = 10 MINUTES - var/exoplanet_max_day_duration = 40 MINUTES - ///If true, exoplanets won't have daycycles - var/disable_daycycle = FALSE - -/datum/configuration/VV_hidden() - . = ..() | protected_vars - -/datum/configuration/New() - var/list/L = subtypesof(/datum/game_mode) - for (var/T in L) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - if (M.config_tag) - gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. - if(!(M.config_tag in modes)) // ensure each mode is added only once - log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") - src.modes += M.config_tag - src.mode_names[M.config_tag] = M.name - src.probabilities[M.config_tag] = M.probability - if (M.votable) - src.votable_modes += M.config_tag - src.votable_modes += "secret" - -/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) - - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - if(type == "config") - switch (name) - if ("resource_urls") - config.resource_urls = splittext(value, " ") - - if ("admin_legacy_system") - config.admin_legacy_system = 1 - - if ("ban_legacy_system") - config.ban_legacy_system = 1 - - if ("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 - - if ("use_age_restriction_for_antags") - config.use_age_restriction_for_antags = 1 - - if ("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 - - if ("use_iterative_explosions") - use_iterative_explosions = 1 - - if ("expanded_alt_interactions") - expanded_alt_interactions = 1 - - if ("explosion_z_threshold") - iterative_explosives_z_threshold = text2num(value) - - if ("explosion_z_mult") - iterative_explosives_z_multiplier = text2num(value) - - if ("custom_item_icon_location") - config.custom_item_icon_location = value - - if ("custom_icon_icon_location") - config.custom_icon_icon_location = value - - if ("log_ooc") - config.log_ooc = 1 - - if ("log_access") - config.log_access = 1 - - if ("log_say") - config.log_say = 1 - - if ("debug_paranoid") - config.debugparanoid = 1 - - if ("log_admin") - config.log_admin = 1 - - if ("log_debug") - config.log_debug = text2num(value) - - if ("log_game") - config.log_game = 1 - - if ("log_vote") - config.log_vote = 1 - - if ("log_whisper") - config.log_whisper = 1 - - if ("log_attack") - config.log_attack = 1 - - if ("log_emote") - config.log_emote = 1 - - if ("log_adminchat") - config.log_adminchat = 1 - - if ("log_adminwarn") - config.log_adminwarn = 1 - - if ("log_pda") - config.log_pda = 1 - - if ("log_world_output") - config.log_world_output = 1 - - if ("log_hrefs") - config.log_hrefs = 1 - - if ("log_runtime") - config.log_runtime = 1 - - if ("roundstart_level_generation") - config.roundstart_level_generation = text2num(value) - - if ("no_click_cooldown") - config.no_click_cooldown = 1 - - if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 - - if ("allow_vote_restart") - config.allow_vote_restart = 1 - - if ("allow_vote_mode") - config.allow_vote_mode = 1 - - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("no_dead_vote") - config.vote_no_dead = 1 - - if ("no_dead_vote_crew_transfer") - config.vote_no_dead_crew_transfer = 1 - - if ("default_no_vote") - config.vote_no_default = 1 - - if ("vote_delay") - config.vote_delay = text2num(value) - - if ("vote_period") - config.vote_period = text2num(value) - - if ("vote_autotransfer_initial") - config.vote_autotransfer_initial = text2num(value) - - if ("vote_autotransfer_interval") - config.vote_autotransfer_interval = text2num(value) - - if ("vote_autogamemode_timeleft") - config.vote_autogamemode_timeleft = text2num(value) - - if("ert_admin_only") - config.ert_admin_call_only = 1 - - if ("allow_ai") - config.allow_ai = 1 - -// if ("authentication") -// config.enable_authentication = 1 - - if ("respawn_delay") - config.respawn_delay = text2num(value) - config.respawn_delay = config.respawn_delay > 0 ? config.respawn_delay : 0 - - if ("servername") - config.server_name = value - - if ("serversuffix") - config.server_suffix = 1 - - if ("hostedby") - config.hostedby = value - - if ("serverurl") - config.serverurl = value - - if ("server") - config.server = value - - if ("banappeals") - config.banappeals = value - - if ("wikiurl") - config.wikiurl = value - - if ("forumurl") - config.forumurl = value - - if ("discordurl") - config.discordurl = value - - if ("githuburl") - config.githuburl = value - - if ("issuereporturl") - config.issuereporturl = value - - if ("ghosts_can_possess_animals") - config.ghosts_can_possess_animals = value - - if ("guest_jobban") - config.guest_jobban = 1 - - if ("guest_ban") - config.guests_allowed = 0 - - if ("disable_ooc") - config.ooc_allowed = 0 - - if ("disable_looc") - config.looc_allowed = 0 - - if ("disable_aooc") - config.aooc_allowed = 0 - - if ("disable_entry") - config.enter_allowed = 0 - - if ("disable_dead_ooc") - config.dooc_allowed = 0 - - if ("disable_dsay") - config.dsay_allowed = 0 - - if ("disable_respawn") - config.abandon_allowed = 0 - - if ("usewhitelist") - config.usewhitelist = 1 - - if ("feature_object_spell_system") - config.feature_object_spell_system = 1 - - if ("traitor_scaling") - config.traitor_scaling = 1 - - if ("aliens_allowed") - config.aliens_allowed = 1 - - if("alien_eggs_allowed") - config.alien_eggs_allowed = 1 - - if ("ninjas_allowed") - config.ninjas_allowed = 1 - - if ("objectives_disabled") - if(!value) - log_misc("Could not find value for objectives_disabled in configuration.") - config.objectives_disabled = CONFIG_OBJECTIVE_NONE - else - switch(value) - if("none") - config.objectives_disabled = CONFIG_OBJECTIVE_NONE - if("verb") - config.objectives_disabled = CONFIG_OBJECTIVE_VERB - if("all") - config.objectives_disabled = CONFIG_OBJECTIVE_ALL - else - log_misc("Incorrect objective disabled definition: [value]") - config.objectives_disabled = CONFIG_OBJECTIVE_NONE - if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 - - if ("probability") - var/prob_pos = findtext(value, " ") - var/prob_name = null - var/prob_value = null - - if (prob_pos) - prob_name = lowertext(copytext(value, 1, prob_pos)) - prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) - else - log_misc("Unknown game mode probability configuration definition: [prob_name].") - else - log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") - - if("allow_random_events") - config.allow_random_events = 1 - - if("kick_inactive") - config.kick_inactive = text2num(value) - - if("mods_can_tempban") - config.mods_can_tempban = 1 - - if("mods_can_job_tempban") - config.mods_can_job_tempban = 1 - - if("mod_tempban_max") - config.mod_tempban_max = text2num(value) - - if("mod_job_tempban_max") - config.mod_job_tempban_max = text2num(value) - - if("load_jobs_from_txt") - load_jobs_from_txt = 1 - - if("forbid_singulo_possession") - forbid_singulo_possession = 1 - - if("popup_admin_pm") - config.popup_admin_pm = 1 - - if("allow_holidays") - config.allow_holidays = 1 - - if("use_irc_bot") - use_irc_bot = 1 - - if("ticklag") - var/ticklag = text2num(value) - if(ticklag > 0) - fps = 10 / ticklag - - if("fps") - fps = text2num(value) - - if("tick_limit_mc_init") - tick_limit_mc_init = text2num(value) - - if("allow_antag_hud") - config.antag_hud_allowed = 1 - if("antag_hud_restricted") - config.antag_hud_restricted = 1 - - if("secret_hide_possibilities") - secret_hide_possibilities = TRUE - - if("humans_need_surnames") - humans_need_surnames = 1 - - if("usealienwhitelist") - usealienwhitelist = 1 - if("usealienwhitelist_sql") // above need to be enabled as well - usealienwhitelistSQL = 1; - if("alien_player_ratio") - limitalienplayers = 1 - alien_to_human_ratio = text2num(value) - - if("assistant_maint") - config.assistant_maint = 1 - - if("gateway_delay") - config.gateway_delay = text2num(value) - - if("continuous_rounds") - config.continous_rounds = 1 - - if("ghost_interaction") - config.ghost_interaction = 1 - - if("disable_player_mice") - config.disable_player_mice = 1 - - if("uneducated_mice") - config.uneducated_mice = 1 - - if("comms_password") - config.comms_password = value - - if("ban_comms_password") - config.ban_comms_password = value - - if("forbidden_versions") - config.forbidden_versions = splittext(value, ";") - - if("minimum_byond_version") - config.minimum_byond_version = text2num(value) - - if("minimum_byond_build") - config.minimum_byond_build = text2num(value) - - if("login_export_addr") - config.login_export_addr = value - - if("irc_bot_host") - config.irc_bot_host = value - - if("main_irc") - config.main_irc = value - - if("admin_irc") - config.admin_irc = value - - if("announce_shuttle_dock_to_irc") - config.announce_shuttle_dock_to_irc = TRUE - - if("allow_cult_ghostwriter") - config.cult_ghostwriter = 1 - - if("req_cult_ghostwriter") - config.cult_ghostwriter_req_cultists = text2num(value) - - if("character_slots") - config.character_slots = text2num(value) - - if("loadout_slots") - config.loadout_slots = text2num(value) - - if("allow_drone_spawn") - config.allow_drone_spawn = text2num(value) - - if("drone_build_time") - config.drone_build_time = text2num(value) - - if("max_maint_drones") - config.max_maint_drones = text2num(value) - - if("expected_round_length") - config.expected_round_length = MinutesToTicks(text2num(value)) - - if("disable_welder_vision") - config.welder_vision = 0 - - if("disable_circuit_printing") - config.allow_ic_printing = FALSE - - if("allow_extra_antags") - config.allow_extra_antags = 1 - - if("event_custom_start_mundane") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_moderate") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_major") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_delay_lower") - var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("event_delay_upper") - var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("exterior_ambient_light") - value = text2num(value) - config.exterior_ambient_light = value >= 0 ? value : 0 - - if("law_zero") - law_zero = value - - if("aggressive_changelog") - config.aggressive_changelog = 1 - - if("delist_when_no_admins") - config.delist_when_no_admins = TRUE - - if("map_switching") - config.allow_map_switching = 1 - - if("disable_webhook_embeds") - config.disable_webhook_embeds = TRUE - - if("auto_map_vote") - config.auto_map_vote = 1 - - if("wait_for_sigusr1") - config.wait_for_sigusr1_reboot = 1 - - if("autostealth") - config.autostealth = text2num(value) - - if("auto_local_admin") - config.auto_local_admin = text2num(value) - - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - - if("error_cooldown") - error_cooldown = text2num(value) - if("error_limit") - error_limit = text2num(value) - if("error_silence_time") - error_silence_time = text2num(value) - if("error_msg_delay") - error_msg_delay = text2num(value) - - if("max_gear_cost") - max_gear_cost = text2num(value) - if(max_gear_cost < 0) - max_gear_cost = INFINITY - if("radiation_decay_rate") - radiation_decay_rate = text2num(value) - if("radiation_resistance_multiplier") - radiation_resistance_multiplier = text2num(value) - if("radiation_material_resistance_divisor") - radiation_material_resistance_divisor = text2num(value) - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - if("player_limit") - player_limit = text2num(value) - if("hub") - world.update_hub_visibility() - - if ("allow_unsafe_narrates") - config.allow_unsafe_narrates = TRUE - - if ("do_not_prevent_spam") - config.do_not_prevent_spam = TRUE - if ("max_acts_per_interval") - config.max_acts_per_interval = text2num(value) - if ("act_interval") - config.act_interval = text2num(value) SECONDS - - if("panic_bunker") - config.panic_bunker = TRUE - if("panic_bunker_message") - config.panic_bunker_message = value - - if("no_throttle_localhost") - config.no_throttle_localhost = TRUE - - if("show_typing_indicator_for_whispers") - config.show_typing_indicator_for_whispers = TRUE - - else - log_misc("Unknown setting in configuration: '[name]'") - - else if(type == "game_options") - if(!value) - log_misc("Unknown value for setting [name] in [filename].") - value = text2num(value) - - switch(name) - if("show_human_death_message") - config.show_human_death_message = TRUE - if ("max_character_aspects") - config.max_character_aspects = text2num(value) - if("health_threshold_dead") - config.health_threshold_dead = value - if("revival_pod_plants") - config.revival_pod_plants = value - if("revival_cloning") - config.revival_cloning = value - if("revival_brain_life") - config.revival_brain_life = value - if("organ_health_multiplier") - config.organ_health_multiplier = value / 100 - if("organ_regeneration_multiplier") - config.organ_regeneration_multiplier = value / 100 - if("organ_damage_spillover_multiplier") - config.organ_damage_spillover_multiplier = value / 100 - if("organs_can_decay") - config.organs_decay = 1 - if("bones_can_break") - config.bones_can_break = value - if("limbs_can_break") - config.limbs_can_break = value - - if("run_delay") - config.run_delay = value - if("walk_delay") - config.walk_delay = value - if("creep_delay") - config.creep_delay = value - if("glide_size_delay") - config.glide_size_delay = value - if("minimum_sprint_cost") - config.minimum_sprint_cost = value - if("skill_sprint_cost_range") - config.skill_sprint_cost_range = value - if("minimum_stamina_recovery") - config.minimum_stamina_recovery = value - if("maximum_stamina_recovery") - config.maximum_stamina_recovery = value - - if("human_delay") - config.human_delay = value - if("robot_delay") - config.robot_delay = value - if("monkey_delay") - config.monkey_delay = value - if("alien_delay") - config.alien_delay = value - if("slime_delay") - config.slime_delay = value - if("animal_delay") - config.animal_delay = value - if("maximum_mushrooms") - config.maximum_mushrooms = value - - if("lock_client_view_x") - config.lock_client_view_x = text2num(value) - if("lock_client_view_y") - config.lock_client_view_y = text2num(value) - if("max_client_view_x") - config.max_client_view_x = text2num(value) - if("max_client_view_y") - config.max_client_view_y = text2num(value) - - if("allow_diagonal_movement") - config.allow_diagonal_movement = TRUE - - if("use_loyalty_implants") - config.use_loyalty_implants = 1 - if("dexterity_malus_brainloss_threshold") - config.dex_malus_brainloss_threshold = text2num(value) - if("grant_default_darksight") - config.grant_default_darksight = TRUE - if("default_darksight_range") - config.default_darksight_range = max(text2num(value), 0) - if("default_darksight_effectiveness") - config.default_darksight_effectiveness = clamp(text2num(value), 0, 1) - - if("adjust_healing_from_stress") - config.adjust_healing_from_stress = TRUE - if("stress_shock_recovery_constant") - config.stress_shock_recovery_constant = text2num(value) - if("stress_healing_recovery_constant") - config.stress_healing_recovery_constant = text2num(value) - if("stress_blood_recovery_constant") - config.stress_blood_recovery_constant = text2num(value) - - - - if("exoplanet_min_day_duration") - config.exoplanet_min_day_duration = text2num(value) - if("exoplanet_max_day_duration") - config.exoplanet_max_day_duration = text2num(value) - if("disable_daycycle") - config.disable_daycycle = TRUE - - else - log_misc("Unknown setting in configuration: '[name]'") - - fps = round(fps) - if(fps <= 0) - fps = initial(fps) - -/datum/configuration/proc/loadsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("enabled") - sqlenabled = TRUE - if ("address") - sqladdress = value - if ("port") - sqlport = value - if ("database") - sqldb = value - if ("login") - sqllogin = value - if ("password") - sqlpass = value - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - for (var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if (M.config_tag && M.config_tag == mode_name) - return M - -/datum/configuration/proc/get_runnable_modes() - var/list/runnable_modes = list() - for(var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if(M && !M.startRequirements() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) - runnable_modes[M.config_tag] = config.probabilities[M.config_tag] - return runnable_modes - -/datum/configuration/proc/load_event(filename) - var/event_info = safe_file2text(filename, FALSE) - if(event_info) - custom_event_msg = event_info diff --git a/code/controllers/evacuation/evacuation.dm b/code/controllers/evacuation/evacuation.dm index 31495e484d5..69eeb9bc5bc 100644 --- a/code/controllers/evacuation/evacuation.dm +++ b/code/controllers/evacuation/evacuation.dm @@ -131,7 +131,7 @@ evac_waiting.Announce(replacetext(global.using_map.emergency_shuttle_docked_message, "%ETD%", "[estimated_time] minute\s"), new_sound = sound('sound/effects/Evacuation.ogg', volume = 35)) else priority_announcement.Announce(replacetext(replacetext(global.using_map.shuttle_docked_message, "%dock_name%", "[global.using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) - if(config.announce_shuttle_dock_to_irc) + if(get_config_value(/decl/config/toggle/announce_shuttle_dock_to_irc)) send2mainirc("The shuttle has docked with the station. It will depart in approximately [estimated_time] minute\s.") /datum/evacuation_controller/proc/launch_evacuation() diff --git a/code/controllers/evacuation/evacuation_pods.dm b/code/controllers/evacuation/evacuation_pods.dm index 06d0aabc77e..1747311b806 100644 --- a/code/controllers/evacuation/evacuation_pods.dm +++ b/code/controllers/evacuation/evacuation_pods.dm @@ -131,12 +131,6 @@ if (SSevac.evacuation_controller?.cancel_evacuation()) log_and_message_admins("[key_name(user)] has cancelled the FTL jump.") -/obj/screen/fullscreen/jump_overlay - icon = 'icons/effects/effects.dmi' - icon_state = "mfoam" - screen_loc = ui_entire_screen - color = "#ff9900" - blend_mode = BLEND_SUBTRACT #undef EVAC_OPT_ABANDON_SHIP #undef EVAC_OPT_JUMP diff --git a/code/controllers/master.dm b/code/controllers/master.dm index c7a3c84f63e..713a05bd8f2 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -176,7 +176,7 @@ var/global/datum/controller/master/Master = new var/start_timeofday = REALTIMEOFDAY // Initialize subsystems. - current_ticklimit = config.tick_limit_mc_init + current_ticklimit = get_config_value(/decl/config/num/tick_limit_mc_init) for (var/datum/controller/subsystem/SS in subsystems) if (SS.flags & SS_NO_INIT) continue @@ -202,7 +202,7 @@ var/global/datum/controller/master/Master = new #else world.sleep_offline = TRUE #endif - world.fps = config.fps + world.fps = get_config_value(/decl/config/num/fps) var/initialized_tod = REALTIMEOFDAY initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10 diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index a595e9fda63..cb1858d43f1 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -43,6 +43,8 @@ var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out! + var/_internal_name //! A stringified version of the variable name for this subsystem. Used by the processing subsystem to make sure is_processing is unset properly. + //Do not override ///datum/controller/subsystem/New() diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index 5e9105dd1f6..9b4686505cb 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -411,7 +411,9 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun return edge else for(var/connection_edge/unsimulated/edge in A.edges) - if(has_same_air(edge.B,B)) + var/datum/gas_mixture/opponent_air = edge.B.return_air() + var/turf/our_turf = B + if(opponent_air.compare(our_turf.return_air())) return edge var/connection_edge/edge = new/connection_edge/unsimulated(A,B) edges += edge diff --git a/code/controllers/subsystems/configuration.dm b/code/controllers/subsystems/configuration.dm new file mode 100644 index 00000000000..8cf48eb2c50 --- /dev/null +++ b/code/controllers/subsystems/configuration.dm @@ -0,0 +1,144 @@ +SUBSYSTEM_DEF(configuration) + name = "Configuration" + flags = SS_NO_FIRE | SS_NO_INIT + var/list/configuration_file_locations = list() + var/load_sql_from = "config/dbconfig.txt" + var/load_event_from = "config/custom_event.txt" + +/datum/controller/subsystem/configuration/proc/load_all_configuration() + + // Assemble a list of all the files we are expected to load this run. + var/list/all_config = decls_repository.get_decls_of_subtype(/decl/configuration_category) + for(var/config_cat_type in all_config) + var/decl/configuration_category/config_cat = all_config[config_cat_type] + configuration_file_locations |= config_cat.configuration_file_location + + load_files() + load_sql() + load_event() + +/datum/controller/subsystem/configuration/proc/write_default_configuration(var/list/specific_files, var/modify_write_prefix) + + if(!specific_files) + specific_files = configuration_file_locations + else if(!islist(specific_files)) + specific_files = list(specific_files) + + if(!length(specific_files)) + return + + var/list/config_lines = list() + var/list/all_config = decls_repository.get_decls_of_subtype(/decl/configuration_category) + var/list/sorted_config = list() + for(var/config_type in all_config) + sorted_config += all_config[config_type] + for(var/decl/configuration_category/config_cat as anything in sortTim(sorted_config, /proc/cmp_name_asc)) + if(!(config_cat.configuration_file_location in specific_files)) + continue + LAZYADD(config_lines["[modify_write_prefix][config_cat.configuration_file_location]"], config_cat.get_config_category_text()) + + for(var/filename in config_lines) + if(fexists(filename)) + fdel(filename) + var/write_file = file(filename) + to_file(write_file, jointext(config_lines[filename], "\n\n")) + +/datum/controller/subsystem/configuration/proc/load_files() + + // Load values from file into an assoc list. + var/list/loaded_values = list() + var/list/write_defaults = list() + for(var/filename in configuration_file_locations) + + if(!fexists(filename)) + write_defaults += filename + continue + + var/list/lines = file2list(filename) + for(var/line in lines) + line = trim(line) + if(!line || length(line) == 0 || copytext(line, 1, 2) == "#") + continue + var/pos = findtext(line, " ") + var/config_key + var/config_value + if(pos) + config_key = copytext(line, 1, pos) + config_value = copytext(line, pos + 1) + else + config_key = line + config_value = TRUE + if(config_key) + config_key = lowertext(trim(config_key)) + if(config_key in loaded_values) + PRINT_STACK_TRACE("Duplicate config value loaded for key '[config_key]' from file '[filename]'.") + loaded_values[config_key] = config_value + + // Write any defaults that aren't already populated. + if(length(write_defaults)) + write_default_configuration(write_defaults) + + // Set our config values on the decls. + var/list/config_to_refresh = list() + var/list/all_config_decls = decls_repository.get_decls_of_subtype(/decl/config) + for(var/config_type in all_config_decls) + var/decl/config/config_option = all_config_decls[config_type] + if(config_option.uid in loaded_values) + if(set_config_value(config_type, loaded_values[config_option.uid], defer_config_refresh = TRUE)) + config_to_refresh += config_option + loaded_values -= config_option.uid + + // Do a refresh now that all values are populated. + for(var/decl/config/config_option as anything in config_to_refresh) + config_option.update_post_value_set() + +/datum/controller/subsystem/configuration/proc/load_event(filename) + var/event_info = safe_file2text(filename, FALSE) + if(event_info) + global.custom_event_msg = event_info + +/datum/controller/subsystem/configuration/proc/load_sql() + var/list/lines = file2list(load_sql_from) + for(var/line in lines) + if(!line) + continue + line = trim(line) + if (length(line) == 0 || copytext(line, 1, 2) == "#") + continue + + var/pos = findtext(line, " ") + var/name = null + var/value = null + if (pos) + name = lowertext(copytext(line, 1, pos)) + value = copytext(line, pos + 1) + else + name = lowertext(line) + if (!name) + continue + + switch (name) + if ("enabled") + sqlenabled = TRUE + if ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/admins/proc/dump_configuration() + set category = "Admin" + set name = "Dump Configuration" + set desc = "Writes out the current configuration to file." + if(!ishost(usr?.client)) + to_chat(usr, SPAN_WARNING("This verb can only be used by the host.")) + return + SSconfiguration.write_default_configuration(modify_write_prefix = "temp/") + to_chat(usr, SPAN_NOTICE("All done!")) diff --git a/code/controllers/subsystems/daycycle.dm b/code/controllers/subsystems/daycycle.dm index 5a725b0c625..15ba9d24bdf 100644 --- a/code/controllers/subsystems/daycycle.dm +++ b/code/controllers/subsystems/daycycle.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(daycyle) ///Adds a set of levels that should all be updated at the same time and share the same day state /datum/controller/subsystem/daycyle/proc/add_linked_levels(var/list/level_ids, var/start_at_night = FALSE, var/update_interval = 5 MINUTES) - if(global.config.disable_daycycle) + if(get_config_value(/decl/config/toggle/disable_daycycle)) return //If disabled, we don't add anything var/topmost_level_id = level_ids[1] if(LAZYISIN(registered_levels, topmost_level_id)) @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(daycyle) LAZYREMOVE(registered_levels, topmost_level_id) /datum/controller/subsystem/daycyle/fire(resumed = 0) - if(global.config.disable_daycycle) + if(get_config_value(/decl/config/toggle/disable_daycycle)) disable() LAZYCLEARLIST(current_run) return //If disabled, we shouldn't fire diff --git a/code/controllers/subsystems/event.dm b/code/controllers/subsystems/event.dm index 96c0b4a2cad..f3a5bd29ca3 100644 --- a/code/controllers/subsystems/event.dm +++ b/code/controllers/subsystems/event.dm @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(event) while (pos <= EVENT_LEVEL_MAJOR) event_containers[pos].process() pos++ - + if (MC_TICK_CHECK) return @@ -109,17 +109,18 @@ SUBSYSTEM_DEF(event) if(E.isRunning) message += "and is still running." else - if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes + if(E.endedAt - E.startedAt > 5 MINUTES) // Only mention end time if the entire duration was more than 5 minutes message += "and ended at [worldtime2stationtime(E.endedAt)]." else message += "and ran to completion." to_world(message) -//Event manager UI +//Event manager UI /datum/controller/subsystem/event/proc/GetInteractWindow() + var/allow_random_events = get_config_value(/decl/config/toggle/allow_random_events) var/html = "Refresh" - html += "Pause All - [config.allow_random_events ? "Pause" : "Resume"]" + html += "Pause All - [allow_random_events ? "Pause" : "Resume"]" if(selected_event_container) var/event_time = max(0, selected_event_container.next_event_time - world.time) @@ -253,8 +254,8 @@ SUBSYSTEM_DEF(event) EC.delayed = !EC.delayed log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [severity_to_string[EC.severity]] events.") else if(href_list["pause_all"]) - config.allow_random_events = text2num(href_list["pause_all"]) - log_and_message_admins("has [config.allow_random_events ? "resumed" : "paused"] countdown for all events.") + set_config_value(/decl/config/toggle/allow_random_events, text2num(href_list["pause_all"])) + log_and_message_admins("has [get_config_value(/decl/config/toggle/allow_random_events) ? "resumed" : "paused"] countdown for all events.") else if(href_list["interval"]) var/delay = input("Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null if(delay && delay > 0) diff --git a/code/controllers/subsystems/fluids.dm b/code/controllers/subsystems/fluids.dm index e2af5880fd6..f9671d442ed 100644 --- a/code/controllers/subsystems/fluids.dm +++ b/code/controllers/subsystems/fluids.dm @@ -1,6 +1,7 @@ SUBSYSTEM_DEF(fluids) name = "Fluids" wait = 1 SECOND + priority = SS_PRIORITY_FLUIDS flags = SS_NO_INIT var/tmp/list/water_sources = list() diff --git a/code/controllers/subsystems/inactivity.dm b/code/controllers/subsystems/inactivity.dm index 5e80377274c..8ba84003468 100644 --- a/code/controllers/subsystems/inactivity.dm +++ b/code/controllers/subsystems/inactivity.dm @@ -7,7 +7,8 @@ SUBSYSTEM_DEF(inactivity) var/number_kicked = 0 /datum/controller/subsystem/inactivity/fire(resumed = FALSE) - if (!config.kick_inactive) + var/kick_inactive_time = get_config_value(/decl/config/num/kick_inactive) MINUTES + if (!kick_inactive_time) suspend() return if (!resumed) @@ -16,9 +17,9 @@ SUBSYSTEM_DEF(inactivity) while(client_list.len) var/client/C = client_list[client_list.len] client_list.len-- - if(!C.holder && C.is_afk(config.kick_inactive MINUTES) && !isobserver(C.mob)) + if(!C.holder && C.is_afk(kick_inactive_time) && !isobserver(C.mob)) log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.") + to_chat(C, SPAN_WARNING("You have been inactive for more than [kick_inactive_time] minute\s and have been disconnected.")) qdel(C) number_kicked++ if (MC_TICK_CHECK) diff --git a/code/controllers/subsystems/initialization/codex.dm b/code/controllers/subsystems/initialization/codex.dm index 878d9ba30c0..1948ba42ccd 100644 --- a/code/controllers/subsystems/initialization/codex.dm +++ b/code/controllers/subsystems/initialization/codex.dm @@ -84,9 +84,17 @@ SUBSYSTEM_DEF(codex) popup.set_content(parse_links(jointext(entry.get_codex_body(presenting_to), null), presenting_to)) popup.open() -/datum/controller/subsystem/codex/proc/get_guide(var/category) - var/decl/codex_category/cat = GET_DECL(category) - . = cat?.guide_html +/datum/controller/subsystem/codex/proc/get_manual_text(var/guide_id) + if(ispath(guide_id, /decl/codex_category)) + var/decl/codex_category/cat = GET_DECL(guide_id) + . = cat?.guide_html + else if(guide_id) + var/datum/codex_entry/entry + if(ispath(guide_id, /datum/codex_entry)) + entry = guide_id + guide_id = initial(entry.name) + entry = get_codex_entry(guide_id) + . = entry?.guide_html /datum/controller/subsystem/codex/proc/retrieve_entries_for_string(var/searching) diff --git a/code/controllers/subsystems/initialization/customitems.dm b/code/controllers/subsystems/initialization/customitems.dm index d9283b81fb4..ae4262be0c3 100644 --- a/code/controllers/subsystems/initialization/customitems.dm +++ b/code/controllers/subsystems/initialization/customitems.dm @@ -91,8 +91,9 @@ SUBSYSTEM_DEF(customitems) character_name = lowertext(character_name) for(var/icon_id in ids_to_icons) var/icon_loc = ids_to_icons[icon_id] - if(config.custom_icon_icon_location) - icon_loc = "[config.custom_icon_icon_location]/[icon_loc]" + var/config_icon_loc = get_config_value(/decl/config/text/custom_icon_icon_location) + if(config_icon_loc) + icon_loc = "[config_icon_loc]/[icon_loc]" ids_to_icons[icon_id] = file(icon_loc) /datum/custom_icon/proc/validate() @@ -134,8 +135,9 @@ SUBSYSTEM_DEF(customitems) item_path = item_path && text2path(item_path) apply_to_target_type = apply_to_target_type && text2path(apply_to_target_type) if(item_icon) - if(config.custom_item_icon_location) - item_icon = "[config.custom_item_icon_location]/[item_path]" + var/config_item_loc = get_config_value(/decl/config/text/custom_item_icon_location) + if(config_item_loc) + item_icon = "[config_item_loc]/[item_path]" if(fexists(item_icon)) item_icon = file(item_icon) diff --git a/code/controllers/subsystems/initialization/materials.dm b/code/controllers/subsystems/initialization/materials.dm index 8bead1365c1..b544be7ef2f 100644 --- a/code/controllers/subsystems/initialization/materials.dm +++ b/code/controllers/subsystems/initialization/materials.dm @@ -156,7 +156,7 @@ SUBSYSTEM_DEF(materials) mat_name = lowertext(mat_name) return materials_by_name[mat_name] -/datum/controller/subsystem/materials/proc/get_strata_material_type(var/turf/exterior/wall/location) +/datum/controller/subsystem/materials/proc/get_strata_material_type(var/turf/exterior/location) if(!istype(location)) return diff --git a/code/controllers/subsystems/initialization/robots.dm b/code/controllers/subsystems/initialization/robots.dm index b71138afa75..75c70a7fe4c 100644 --- a/code/controllers/subsystems/initialization/robots.dm +++ b/code/controllers/subsystems/initialization/robots.dm @@ -10,18 +10,15 @@ SUBSYSTEM_DEF(robots) var/list/robot_alt_titles = list() var/list/mob_types_by_title = list( - "robot, flying" = /mob/living/silicon/robot/flying, - "drone, flying" = /mob/living/silicon/robot/flying, - "cyborg, flying" = /mob/living/silicon/robot/flying + "cyborg, flying" = /mob/living/silicon/robot/flying, + "robot, flying" = /mob/living/silicon/robot/flying ) var/list/mmi_types_by_title = list( - "cyborg" = /obj/item/mmi, - "robot" = /obj/item/organ/internal/posibrain, - "drone" = /obj/item/mmi/digital/robot, - "cyborg, flying" = /obj/item/mmi, - "robot, flying" = /obj/item/organ/internal/posibrain, - "drone, flying" = /obj/item/mmi/digital/robot + "cyborg" = /obj/item/organ/internal/brain_interface, + "robot" = /obj/item/organ/internal/brain/robotic, + "cyborg, flying" = /obj/item/organ/internal/brain_interface, + "robot, flying" = /obj/item/organ/internal/brain/robotic ) /datum/controller/subsystem/robots/Initialize() @@ -60,8 +57,8 @@ SUBSYSTEM_DEF(robots) if(modules[include_override]) .[include_override] = modules[include_override] -/datum/controller/subsystem/robots/proc/get_mmi_type_by_title(var/check_title) - . = mmi_types_by_title[lowertext(trim(check_title))] || /obj/item/mmi +/datum/controller/subsystem/robots/proc/get_brain_type_by_title(var/check_title) + . = mmi_types_by_title[lowertext(trim(check_title))] || /obj/item/organ/internal/brain/robotic /datum/controller/subsystem/robots/proc/get_mob_type_by_title(var/check_title) . = mob_types_by_title[lowertext(trim(check_title))] || /mob/living/silicon/robot \ No newline at end of file diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index 0286f28e24a..c802aba3945 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(jobs) submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc, TRUE) // Load job configuration (is this even used anymore?) - if(job_config_file && config.load_jobs_from_txt) + if(job_config_file && get_config_value(/decl/config/toggle/load_jobs_from_txt)) var/list/jobEntries = file2list(job_config_file) for(var/job in jobEntries) if(!job) @@ -174,7 +174,7 @@ SUBSYSTEM_DEF(jobs) if(!job.is_position_available()) to_chat(joining, "Unfortunately, that job is no longer available.") return FALSE - if(!config.enter_allowed) + if(!get_config_value(/decl/config/toggle/on/enter_allowed)) to_chat(joining, "There is an administrative lock on entering the game!") return FALSE if(SSticker.mode && SSticker.mode.station_explosion_in_progress) @@ -210,7 +210,7 @@ SUBSYSTEM_DEF(jobs) log_and_message_admins("User [spawner] spawned at spawn point with dangerous atmosphere.") return TRUE -/datum/controller/subsystem/jobs/proc/assign_role(var/mob/new_player/player, var/rank, var/latejoin = 0, var/datum/game_mode/mode = SSticker.mode) +/datum/controller/subsystem/jobs/proc/assign_role(var/mob/new_player/player, var/rank, var/latejoin = 0, var/decl/game_mode/mode = SSticker.mode) if(player && player.mind && rank) var/datum/job/job = get_by_title(rank) if(!job) @@ -251,7 +251,7 @@ SUBSYSTEM_DEF(jobs) candidates += player return candidates -/datum/controller/subsystem/jobs/proc/give_random_job(var/mob/new_player/player, var/datum/game_mode/mode = SSticker.mode) +/datum/controller/subsystem/jobs/proc/give_random_job(var/mob/new_player/player, var/decl/game_mode/mode = SSticker.mode) for(var/datum/job/job in shuffle(primary_job_datums)) if(!job) continue @@ -275,7 +275,7 @@ SUBSYSTEM_DEF(jobs) break ///This proc is called before the level loop of divide_occupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check -/datum/controller/subsystem/jobs/proc/fill_head_position(var/datum/game_mode/mode) +/datum/controller/subsystem/jobs/proc/fill_head_position(var/decl/game_mode/mode) for(var/level = 1 to 3) for(var/command_position in must_fill_titles) var/datum/job/job = get_by_title(command_position) @@ -291,7 +291,7 @@ SUBSYSTEM_DEF(jobs) if(age < job.minimum_character_age) // Nope. continue switch(age - job.ideal_character_age) - if(0 to -10) + if(-INFINITY to -10) if(age < (job.minimum_character_age+10)) weightedCandidates[V] = 3 // Still a bit young. else @@ -311,7 +311,7 @@ SUBSYSTEM_DEF(jobs) return 0 ///This proc is called at the start of the level loop of divide_occupations() and will cause head jobs to be checked before any other jobs of the same level -/datum/controller/subsystem/jobs/proc/CheckHeadPositions(var/level, var/datum/game_mode/mode) +/datum/controller/subsystem/jobs/proc/CheckHeadPositions(var/level, var/decl/game_mode/mode) for(var/command_position in must_fill_titles) var/datum/job/job = get_by_title(command_position) if(!job) continue @@ -324,7 +324,7 @@ SUBSYSTEM_DEF(jobs) * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ -/datum/controller/subsystem/jobs/proc/divide_occupations(datum/game_mode/mode) +/datum/controller/subsystem/jobs/proc/divide_occupations(decl/game_mode/mode) if(global.triai) for(var/datum/job/A in primary_job_datums) if(A.title == "AI") @@ -399,7 +399,7 @@ SUBSYSTEM_DEF(jobs) unassigned_roundstart -= player return TRUE -/datum/controller/subsystem/jobs/proc/attempt_role_assignment(var/mob/new_player/player, var/datum/job/job, var/level, var/datum/game_mode/mode) +/datum/controller/subsystem/jobs/proc/attempt_role_assignment(var/mob/new_player/player, var/datum/job/job, var/level, var/decl/game_mode/mode) if(!jobban_isbanned(player, job.title) && \ job.player_old_enough(player.client) && \ player.client.prefs.CorrectLevel(job, level) && \ @@ -469,34 +469,32 @@ SUBSYSTEM_DEF(jobs) return spawn_in_storage -/datum/controller/subsystem/jobs/proc/equip_rank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) +/datum/controller/subsystem/jobs/proc/equip_job_title(var/mob/living/carbon/human/H, var/job_title, var/joined_late = 0) if(!H) return - var/datum/job/job = get_by_title(rank) + var/datum/job/job = get_by_title(job_title) var/list/spawn_in_storage if(job) if(H.client) if(global.using_map.flags & MAP_HAS_BRANCH) - H.char_branch = mil_branches.get_branch(H.client.prefs.branches[rank]) + H.char_branch = mil_branches.get_branch(H.client.prefs.branches[job_title]) if(global.using_map.flags & MAP_HAS_RANK) - H.char_rank = mil_branches.get_rank(H.client.prefs.branches[rank], H.client.prefs.ranks[rank]) + H.char_rank = mil_branches.get_rank(H.client.prefs.branches[job_title], H.client.prefs.ranks[job_title]) // Transfers the skill settings for the job to the mob H.skillset.obtain_from_client(job, H.client) //Equip job items. - job.equip(H, H.mind ? H.mind.role_alt_title : "", H.char_branch, H.char_rank) + job.setup_account(H) + job.equip_job(H, H.mind?.role_alt_title, H.char_branch, H.char_rank) job.apply_fingerprints(H) spawn_in_storage = equip_custom_loadout(H, job) - job.setup_account(H) - var/decl/hierarchy/outfit/outfit = job.get_outfit(H, H.mind ? H.mind.role_alt_title : "", H.char_branch, H.char_rank) - outfit.equip_id(H, H.mind ? H.mind.role_alt_title : "", H.char_branch, H.char_rank, job) else - to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.") + to_chat(H, "Your job is [job_title] and the game just can't handle it! Please report this bug to an administrator.") - H.job = rank + H.job = job_title if(!joined_late || job.latejoin_at_spawnpoints) var/obj/S = job.get_roundstart_spawnpoint() @@ -505,7 +503,7 @@ SUBSYSTEM_DEF(jobs) H.forceMove(S.loc) else var/decl/spawnpoint/spawnpoint = job.get_spawnpoint(H.client) - H.forceMove(pick(spawnpoint.turfs)) + H.forceMove(DEFAULTPICK(spawnpoint.get_spawn_turfs(H), get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN))) spawnpoint.after_join(H) // Moving wheelchair if they have one @@ -533,26 +531,26 @@ SUBSYSTEM_DEF(jobs) var/alt_title = null if(!H.mind) H.mind_initialize() - H.mind.assigned_job = job - H.mind.assigned_role = rank + H.mind.assigned_job = job + H.mind.assigned_role = job_title alt_title = H.mind.role_alt_title var/mob/other_mob = job.handle_variant_join(H, alt_title) if(other_mob) - job.post_equip_rank(other_mob, alt_title || rank) + job.post_equip_job_title(other_mob, alt_title || job_title) return other_mob if(spawn_in_storage) for(var/decl/loadout_option/G in spawn_in_storage) G.spawn_in_storage_or_drop(H, H.client.prefs.Gear()[G.name]) - to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].") + to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title || job_title].") if(job.description) to_chat(H, SPAN_BOLD("[job.description]")) if(job.supervisors) - to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") + to_chat(H, "As the [alt_title || job_title] you answer directly to [job.supervisors]. Special circumstances may change this.") if(H.has_headset_in_ears()) to_chat(H, "To speak on your department's radio channel use [H.get_department_radio_prefix()]h. For the use of other channels, examine your headset.") @@ -567,7 +565,7 @@ SUBSYSTEM_DEF(jobs) BITSET(H.hud_updateflag, IMPLOYAL_HUD) BITSET(H.hud_updateflag, SPECIALROLE_HUD) - job.post_equip_rank(H, alt_title || rank) + job.post_equip_job_title(H, alt_title || job_title) H.client.show_location_blurb(30) @@ -613,7 +611,7 @@ SUBSYSTEM_DEF(jobs) T.maptext = "[copytext_char(text, 1, i)] " sleep(1) - addtimer(CALLBACK(GLOBAL_PROC, .proc/fade_location_blurb, src, T), duration) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(fade_location_blurb), src, T), duration) /proc/fade_location_blurb(client/C, obj/T) animate(T, alpha = 0, time = 5) diff --git a/code/controllers/subsystems/managed_instance.dm b/code/controllers/subsystems/managed_instance.dm index dbf7cebf69f..92197745772 100644 --- a/code/controllers/subsystems/managed_instance.dm +++ b/code/controllers/subsystems/managed_instance.dm @@ -34,7 +34,7 @@ SUBSYSTEM_DEF(managed_instances) PRINT_STACK_TRACE("Managed instance was queued for deletion during init! [managed_instance]") category_list[cache_id] -= managed_instance else - events_repository.register(/decl/observ/destroyed, managed_instance, src, /datum/controller/subsystem/managed_instances/proc/clear) + events_repository.register(/decl/observ/destroyed, managed_instance, src, TYPE_PROC_REF(/datum/controller/subsystem/managed_instances, clear)) . = managed_instance // This is costly, but it also shouldn't be common for managed instances to get qdeleted post-storage. diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index 38ecbfaecc7..7f54be02b57 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -61,6 +61,8 @@ SUBSYSTEM_DEF(mapping) /datum/controller/subsystem/mapping/Initialize(timeofday) + reindex_lists() + // Load our banned map list, if we have one. if(banned_dmm_location && fexists(banned_dmm_location)) banned_maps = cached_json_decode(safe_file2text(banned_dmm_location)) @@ -69,10 +71,6 @@ SUBSYSTEM_DEF(mapping) for(var/datum/map_template/MT as anything in get_all_template_instances()) register_map_template(MT) - // Generate turbolifts. - for(var/obj/abstract/turbolift_spawner/turbolift as anything in turbolifts_to_initialize) - turbolift.build_turbolift() - // Populate overmap. if(length(global.using_map.overmap_ids)) for(var/overmap_id in global.using_map.overmap_ids) @@ -89,6 +87,7 @@ SUBSYSTEM_DEF(mapping) PRINT_STACK_TRACE("Missing z-level data object for z[num2text(z)]!") level.setup_level_data() + old_maxz = world.maxz // Build away sites. global.using_map.build_away_sites() global.using_map.build_planets() @@ -99,10 +98,9 @@ SUBSYSTEM_DEF(mapping) PRINT_STACK_TRACE("Missing z-level data object for z[num2text(z)]!") level.setup_level_data() - // Initialize z-level objects. -#ifdef UNIT_TEST - config.roundstart_level_generation = FALSE -#endif + // Generate turbolifts last, since away sites may have elevators to generate too. + for(var/obj/abstract/turbolift_spawner/turbolift as anything in turbolifts_to_initialize) + turbolift.build_turbolift() // Resize the world to the max template size to fix a BYOND bug with world resizing breaking events. // REMOVE WHEN THIS IS FIXED: https://www.byond.com/forum/post/2833191 @@ -117,9 +115,10 @@ SUBSYSTEM_DEF(mapping) if (new_maxy > world.maxy) world.maxy = new_maxy - for(var/obj/abstract/landmark/map_load_mark/mark in queued_markers) - mark.load_subtemplate() - queued_markers.Cut() + // Initialize z-level objects. +#ifdef UNIT_TEST + set_config_value(/decl/config/toggle/roundstart_level_generation, FALSE) //#FIXME: Shouldn't this be set before running level_data/setup_level_data()? +#endif . = ..() diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index 61d8f7f626f..689c5f1bd68 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -179,7 +179,7 @@ SUBSYSTEM_DEF(overlays) if(NOT_QUEUED_ALREADY) QUEUE_FOR_COMPILE -/atom/proc/set_overlays(list/overlays_list, priority = FALSE) // Sets overlays to a list, equivalent to cut_overlays() + add_overlays(). +/atom/proc/set_overlays(list/overlays_list, priority = FALSE) // Sets overlays to a list, equivalent to cut_overlays() + add_overlay(). if (!overlays_list) return diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index 00efee1ef03..5d704ae9aad 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -6,8 +6,6 @@ PROCESSING_SUBSYSTEM_DEF(plants) init_order = SS_INIT_PLANTS wait = 60 - process_proc = /obj/machinery/portable_atmospherics/hydroponics/Process - var/list/product_descs = list() // Stores generated fruit descs. var/list/seeds = list() // All seed data stored here. var/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness. diff --git a/code/controllers/subsystems/processing/mobs.dm b/code/controllers/subsystems/processing/mobs.dm index 77a852de19c..a1812f5d758 100644 --- a/code/controllers/subsystems/processing/mobs.dm +++ b/code/controllers/subsystems/processing/mobs.dm @@ -5,7 +5,7 @@ PROCESSING_SUBSYSTEM_DEF(mobs) runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME wait = 2 SECONDS - process_proc = /mob/proc/Life + process_proc = TYPE_PROC_REF(/mob, Life) var/list/mob_list diff --git a/code/controllers/subsystems/processing/processing.dm b/code/controllers/subsystems/processing/processing.dm index ba9ca0fd657..594dc8a1985 100644 --- a/code/controllers/subsystems/processing/processing.dm +++ b/code/controllers/subsystems/processing/processing.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(processing) var/list/processing = list() var/list/current_run = list() - var/process_proc = /datum/proc/Process + var/process_proc = TYPE_PROC_REF(/datum, Process) var/debug_last_thing var/debug_original_process_proc // initial() does not work with procs @@ -28,7 +28,7 @@ SUBSYSTEM_DEF(processing) var/datum/thing = current_run[current_run.len] current_run.len-- if(QDELETED(thing) || (call(thing, process_proc)(wait, times_fired, src) == PROCESS_KILL)) - if(thing) + if(thing?.is_processing == _internal_name) thing.is_processing = null processing -= thing if (MC_TICK_CHECK) @@ -43,7 +43,7 @@ SUBSYSTEM_DEF(processing) debug_original_process_proc = null else debug_original_process_proc = process_proc - process_proc = /datum/proc/DebugSubsystemProcess + process_proc = TYPE_PROC_REF(/datum, DebugSubsystemProcess) to_chat(usr, "[name] - Debug mode [debug_original_process_proc ? "en" : "dis"]abled") diff --git a/code/controllers/subsystems/processing/temperature.dm b/code/controllers/subsystems/processing/temperature.dm index 377c8283660..4f14fc03788 100644 --- a/code/controllers/subsystems/processing/temperature.dm +++ b/code/controllers/subsystems/processing/temperature.dm @@ -2,4 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(temperature) name = "Temperature" priority = SS_PRIORITY_TEMPERATURE wait = 5 SECONDS - process_proc = /atom/proc/ProcessAtomTemperature + process_proc = TYPE_PROC_REF(/atom, ProcessAtomTemperature) diff --git a/code/controllers/subsystems/processing/vines.dm b/code/controllers/subsystems/processing/vines.dm index 56e24d30f27..1e59ccf5a6f 100644 --- a/code/controllers/subsystems/processing/vines.dm +++ b/code/controllers/subsystems/processing/vines.dm @@ -5,8 +5,6 @@ PROCESSING_SUBSYSTEM_DEF(vines) runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME wait = 80 - process_proc = /obj/effect/vine/Process - var/list/vine_list /datum/controller/subsystem/processing/vines/PreInit() diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm index 3e0b0747a13..5865d8f28a4 100644 --- a/code/controllers/subsystems/radiation.dm +++ b/code/controllers/subsystems/radiation.dm @@ -18,6 +18,7 @@ SUBSYSTEM_DEF(radiation) current_res_cache = resistance_cache.Copy() listeners = global.living_mob_list_.Copy() + var/rad_decay_rate = get_config_value(/decl/config/num/radiation_decay_rate) while(current_sources.len) var/datum/radiation_source/S = current_sources[current_sources.len] current_sources.len-- @@ -25,7 +26,7 @@ SUBSYSTEM_DEF(radiation) if(QDELETED(S)) sources -= S else if(S.decay) - S.update_rad_power(S.rad_power - config.radiation_decay_rate) + S.update_rad_power(S.rad_power - rad_decay_rate) if (MC_TICK_CHECK) return @@ -87,12 +88,13 @@ SUBSYSTEM_DEF(radiation) // Okay, now ray trace to find resistence! var/turf/origin = source.source_turf var/working = source.rad_power + var/rad_mult = get_config_value(/decl/config/num/radiation_resistance_multiplier) while(origin != T) origin = get_step_towards(origin, T) //Raytracing if(!resistance_cache[origin]) //Only get the resistance if we don't already know it. origin.calc_rad_resistance() if(origin.cached_rad_resistance) - working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1) + working = round((working / (origin.cached_rad_resistance * rad_mult)), 0.1) if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF)) break // Already affected by a stronger source (or its zero...) . = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose diff --git a/code/controllers/subsystems/throwing.dm b/code/controllers/subsystems/throwing.dm index 4c6dfbb6ccd..f10c02c06cf 100644 --- a/code/controllers/subsystems/throwing.dm +++ b/code/controllers/subsystems/throwing.dm @@ -170,11 +170,10 @@ SUBSYSTEM_DEF(throwing) thrownthing.throwing = null if (!hit) - for (var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on. - var/atom/A = thing - if (A == target) + for (var/atom/thing as anything in get_turf(thrownthing)) //looking for our target on the turf we land on. + if (thing == target) hit = TRUE - thrownthing.throw_impact(A, src) + thrownthing.throw_impact(thing, src) break if(QDELETED(thrownthing)) @@ -182,9 +181,10 @@ SUBSYSTEM_DEF(throwing) if(!hit) thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground. - thrownthing.space_drift(init_dir) + if(!QDELETED(thrownthing)) + thrownthing.space_drift(init_dir) - if(t_target) + if(t_target && !QDELETED(thrownthing)) thrownthing.throw_impact(t_target, src) if (callback) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 8eaa787ea53..4926e5e6635 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -8,11 +8,11 @@ SUBSYSTEM_DEF(ticker) var/pregame_timeleft = 3 MINUTES var/start_ASAP = FALSE //the game will start as soon as possible, bypassing all pre-game nonsense - var/list/gamemode_vote_results //Will be a list, in order of preference, of form list(config_tag = number of votes). + var/list/gamemode_vote_results //Will be a list, in order of preference, of form list(uid = number of votes). var/bypass_gamemode_vote = 0 //Intended for use with admin tools. Will avoid voting and ignore any results. - var/master_mode = "extended" //The underlying game mode (so "secret" or the voted mode). Saved to default back to previous round's mode in case the vote failed. This is a config_tag. - var/datum/game_mode/mode //The actual gamemode, if selected. + var/master_mode = "extended" //The underlying game mode (so "secret" or the voted mode). Saved to default back to previous round's mode in case the vote failed. This is a uid. + var/decl/game_mode/mode //The actual gamemode, if selected. var/round_progressing = 1 //Whether the lobby clock is ticking down. var/list/bad_modes = list() //Holds modes we tried to start and failed to. @@ -52,7 +52,7 @@ SUBSYSTEM_DEF(ticker) Master.SetRunLevel(RUNLEVEL_SETUP) return - if(!bypass_gamemode_vote && (pregame_timeleft <= config.vote_autogamemode_timeleft SECONDS) && !gamemode_vote_results) + if(!bypass_gamemode_vote && (pregame_timeleft <= get_config_value(/decl/config/num/vote_autogamemode_timeleft) SECONDS) && !gamemode_vote_results) if(!SSvote.active_vote) SSvote.initiate_vote(/datum/vote/gamemode, automatic = 1) @@ -111,8 +111,8 @@ SUBSYSTEM_DEF(ticker) if(mode_finished && game_finished()) Master.SetRunLevel(RUNLEVEL_POSTGAME) end_game_state = END_GAME_READY_TO_END - INVOKE_ASYNC(src, .proc/declare_completion) - if(config.allow_map_switching && config.auto_map_vote && global.all_maps.len > 1) + INVOKE_ASYNC(src, PROC_REF(declare_completion)) + if(get_config_value(/decl/config/toggle/allow_map_switching) && get_config_value(/decl/config/toggle/auto_map_vote) && global.all_maps.len > 1) SSvote.initiate_vote(/datum/vote/map/end_game, automatic = 1) else if(mode_finished && (end_game_state <= END_GAME_NOT_OVER)) @@ -206,7 +206,7 @@ Helpers . = (revotes_allowed && !bypass_gamemode_vote) ? CHOOSE_GAMEMODE_REVOTE : CHOOSE_GAMEMODE_RESTART var/mode_to_try = master_mode //This is the config tag - var/datum/game_mode/mode_datum + var/decl/game_mode/mode_datum //Decide on the mode to try. if(!bypass_gamemode_vote && gamemode_vote_results) @@ -222,21 +222,26 @@ Helpers if(mode_to_try in bad_modes) return - //Find the relevant datum, resolving secret in the process. - var/list/base_runnable_modes = config.get_runnable_modes() //format: list(config_tag = weight) + var/list/base_runnable_modes = list() + var/list/all_modes = decls_repository.get_decls_of_subtype(/decl/game_mode) + for(var/mode_type in all_modes) + var/decl/game_mode/game_mode = all_modes[mode_type] + if(game_mode.probability > 0 && !game_mode.startRequirements()) + base_runnable_modes[game_mode.uid] = game_mode.probability + if((mode_to_try=="random") || (mode_to_try=="secret")) var/list/runnable_modes = base_runnable_modes - bad_modes if(secret_force_mode != "secret") // Config option to force secret to be a specific mode. - mode_datum = config.pick_mode(secret_force_mode) + mode_datum = decls_repository.get_decl_by_id(secret_force_mode, validate_decl_type = FALSE) else if(!length(runnable_modes)) // Indicates major issues; will be handled on return. bad_modes += mode_to_try return else - mode_datum = config.pick_mode(pickweight(runnable_modes)) + mode_datum = decls_repository.get_decl_by_id(pickweight(runnable_modes), validate_decl_type = FALSE) if(length(runnable_modes) > 1) // More to pick if we fail; we won't tell anyone we failed unless we fail all possibilities, though. . = CHOOSE_GAMEMODE_SILENT_REDO else - mode_datum = config.pick_mode(mode_to_try) + mode_datum = decls_repository.get_decl_by_id(mode_to_try, validate_decl_type = FALSE) if(!istype(mode_datum)) bad_modes += mode_to_try return @@ -250,7 +255,7 @@ Helpers if(mode_datum.startRequirements()) mode_datum.fail_setup() SSjobs.reset_occupations() - bad_modes += mode_datum.config_tag + bad_modes += mode_datum.uid return //Declare victory, make an announcement. @@ -261,10 +266,10 @@ Helpers to_world("The current game mode is Secret!") var/list/mode_names = list() for (var/mode_tag in base_runnable_modes) - var/datum/game_mode/M = gamemode_cache[mode_tag] + var/decl/game_mode/M = decls_repository.get_decl_by_id(mode_tag, validate_decl_type = FALSE) if(M) - mode_names += M.name - if (config.secret_hide_possibilities) + mode_names |= M.name + if (get_config_value(/decl/config/toggle/secret_hide_possibilities)) message_admins("Possibilities: [english_list(mode_names)]") else to_world("Possibilities: [english_list(mode_names)]") @@ -291,7 +296,7 @@ Helpers if(player.mind.assigned_role == "Captain") captainless=0 if(!player_is_antag(player.mind, only_offstation_roles = 1)) - SSjobs.equip_rank(player, player.mind.assigned_role, 0) + SSjobs.equip_job_title(player, player.mind.assigned_role, 0) SScustomitems.equip_custom_items(player) if(captainless) for(var/mob/M in global.player_list) @@ -344,13 +349,13 @@ Helpers /datum/controller/subsystem/ticker/proc/game_finished() if(mode.station_explosion_in_progress) return 0 - if(config.continous_rounds) + if(get_config_value(/decl/config/toggle/continuous_rounds)) return SSevac.evacuation_controller?.round_over() || mode.station_was_nuked else return mode.check_finished() || (SSevac.evacuation_controller && SSevac.evacuation_controller.round_over() && SSevac.evacuation_controller.emergency_evacuation) || universe_has_ended /datum/controller/subsystem/ticker/proc/mode_finished() - if(config.continous_rounds) + if(get_config_value(/decl/config/toggle/continuous_rounds)) return mode.check_finished() else return game_finished() diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm index 298d4e28dd6..587c9898676 100644 --- a/code/controllers/subsystems/timer.dm +++ b/code/controllers/subsystems/timer.dm @@ -273,7 +273,7 @@ SUBSYSTEM_DEF(timer) return // Sort all timers by time to run - sortTim(alltimers, .proc/cmp_timer) + sortTim(alltimers, PROC_REF(cmp_timer)) // Get the earliest timer, and if the TTR is earlier than the current world.time, // then set the head offset appropriately to be the earliest time tracked by the diff --git a/code/controllers/subsystems/typing.dm b/code/controllers/subsystems/typing.dm index e046e181772..d44ba9a14de 100644 --- a/code/controllers/subsystems/typing.dm +++ b/code/controllers/subsystems/typing.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(typing) var/static/regex/match_verbs /// A list of clients waiting to be polled for input state. var/list/client/queue = list() - /// A list of ckey to list, containing current state data. See .proc/get_entry for details. + /// A list of ckey to list, containing current state data. See get_entry() for details. var/list/status = list() /* example of an entry: (ckey = list( @@ -35,7 +35,7 @@ SUBSYSTEM_DEF(typing) */ /datum/controller/subsystem/typing/Initialize(start_timeofday) - if(config.show_typing_indicator_for_whispers) + if(get_config_value(/decl/config/toggle/show_typing_indicator_for_whispers)) match_verbs = regex("^(Me|Say|Whisper) +\"?\\w+") else match_verbs = regex("^(Me|Say) +\"?\\w+") @@ -182,7 +182,7 @@ Updated 09/10/2022 to include chatbar using Spookerton's SStyping system from Po /atom/movable/typing_indicator/proc/show_typing_indicator() // Make it visible after being hidden. - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) // Update the appearance. if(ismob(master)) diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index e5d4b025ff7..0c69d7d1c24 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -69,7 +69,7 @@ SUBSYSTEM_DEF(vote) return FALSE if(last_started_time != null && !(is_admin(creator) || automatic)) - var/next_allowed_time = (last_started_time + config.vote_delay) + var/next_allowed_time = (last_started_time + get_config_value(/decl/config/num/vote_delay)) if(next_allowed_time > world.time) return FALSE @@ -176,7 +176,7 @@ SUBSYSTEM_DEF(vote) // Helper proc for determining whether addantag vote can be called. /datum/controller/subsystem/vote/proc/is_addantag_allowed(mob/creator, automatic) - if(!config.allow_extra_antags) + if(!get_config_value(/decl/config/toggle/allow_extra_antags)) return 0 // Gamemode has to be determined before we can add antagonists, so we can respect gamemode's add antag vote settings. if((GAME_STATE <= RUNLEVEL_SETUP) || !SSticker.mode) diff --git a/code/controllers/subsystems/weather.dm b/code/controllers/subsystems/weather.dm index 539ceba1bdc..46e00772251 100644 --- a/code/controllers/subsystems/weather.dm +++ b/code/controllers/subsystems/weather.dm @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(weather) /datum/controller/subsystem/weather/proc/register_weather_system(var/obj/abstract/weather_system/WS) if(weather_by_z[WS.z]) CRASH("Trying to register another weather system on the same z-level([WS.z]) as an existing one!") - LAZYDISTINCTADD(weather_systems, WS) + weather_systems |= WS //Mark all affected z-levels var/list/affected = SSmapping.get_connected_levels(WS.z) @@ -62,10 +62,4 @@ SUBSYSTEM_DEF(weather) for(var/Z = 1 to length(weather_by_z)) if(weather_by_z[Z] == WS) weather_by_z[Z] = null - LAZYREMOVE(weather_systems, WS) - -///Returns the weather obj for a given z-level if it exists -/datum/controller/subsystem/weather/proc/get_weather_for_level(var/z_level) - if(z_level > length(weather_by_z)) - return null - return weather_by_z[z_level] \ No newline at end of file + weather_systems -= WS diff --git a/code/controllers/subsystems/zcopy.dm b/code/controllers/subsystems/zcopy.dm index c66026adf6c..5c209dd2c52 100644 --- a/code/controllers/subsystems/zcopy.dm +++ b/code/controllers/subsystems/zcopy.dm @@ -563,6 +563,7 @@ SUBSYSTEM_DEF(zcopy) QDEL_NULL(T.below.mimic_above_copy) if (T.below.mimic_proxy) QDEL_NULL(T.below.mimic_proxy) + QDEL_NULL(T.mimic_underlay) for (var/atom/movable/openspace/mimic/OO in T) qdel(OO) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index dff70c19021..429ecfd060e 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -25,9 +25,6 @@ if("Radio") debug_variables(radio_controller) SSstatistics.add_field_details("admin_verb","DRadio") - if("Configuration") - debug_variables(config) - SSstatistics.add_field_details("admin_verb","DConf") if("pAI") debug_variables(paiController) SSstatistics.add_field_details("admin_verb","DpAI") diff --git a/code/datums/appearances/appearance_manager.dm b/code/datums/appearances/appearance_manager.dm index b5ce0b9e882..d196a89303d 100644 --- a/code/datums/appearances/appearance_manager.dm +++ b/code/datums/appearances/appearance_manager.dm @@ -6,8 +6,8 @@ if(!pq) pq = new /datum/priority_queue(/proc/cmp_appearance_data) appearances_[viewer] = pq - events_repository.register(/decl/observ/logged_in, viewer, src, /decl/appearance_manager/proc/apply_appearance_images) - events_repository.register(/decl/observ/destroyed, viewer, src, /decl/appearance_manager/proc/remove_appearances) + events_repository.register(/decl/observ/logged_in, viewer, src, TYPE_PROC_REF(/decl/appearance_manager, apply_appearance_images)) + events_repository.register(/decl/observ/destroyed, viewer, src, TYPE_PROC_REF(/decl/appearance_manager, remove_appearances)) pq.Enqueue(ad) reset_appearance_images(viewer) @@ -17,8 +17,8 @@ if(viewer.client) viewer.client.images -= ad.images if(!pq.Length()) - events_repository.unregister(/decl/observ/logged_in, viewer, src, /decl/appearance_manager/proc/apply_appearance_images) - events_repository.register(/decl/observ/destroyed, viewer, src, /decl/appearance_manager/proc/remove_appearances) + events_repository.unregister(/decl/observ/logged_in, viewer, src, TYPE_PROC_REF(/decl/appearance_manager, apply_appearance_images)) + events_repository.register(/decl/observ/destroyed, viewer, src, TYPE_PROC_REF(/decl/appearance_manager, remove_appearances)) appearances_ -= viewer /decl/appearance_manager/proc/remove_appearances(var/mob/viewer) diff --git a/code/datums/appearances/automatic/_base.dm b/code/datums/appearances/automatic/_base.dm index c4422652adc..03c71a126e5 100644 --- a/code/datums/appearances/automatic/_base.dm +++ b/code/datums/appearances/automatic/_base.dm @@ -6,7 +6,7 @@ if(source in appearance_sources) return FALSE appearance_sources[source] = new/datum/appearance_data(images, viewers, priority) - events_repository.register(/decl/observ/destroyed, source, src, /decl/appearance_handler/proc/RemoveAltAppearance) + events_repository.register(/decl/observ/destroyed, source, src, TYPE_PROC_REF(/decl/appearance_handler, RemoveAltAppearance)) /decl/appearance_handler/proc/RemoveAltAppearance(var/source) var/datum/appearance_data/ad = appearance_sources[source] diff --git a/code/datums/appearances/automatic/cardborg.dm b/code/datums/appearances/automatic/cardborg.dm index 5a22f4763ea..42fcea16813 100644 --- a/code/datums/appearances/automatic/cardborg.dm +++ b/code/datums/appearances/automatic/cardborg.dm @@ -17,7 +17,7 @@ var/image/I = get_image_from_backpack(H) AddAltAppearance(H, I, global.silicon_mob_list+H) //you look like a robot to robots! (including yourself because you're totally a robot) - events_repository.register_global(/decl/observ/logged_in, src, /decl/appearance_handler/cardborg/proc/mob_joined) // Duplicate registration request are handled for us + events_repository.register_global(/decl/observ/logged_in, src, TYPE_PROC_REF(/decl/appearance_handler/cardborg, mob_joined)) // Duplicate registration request are handled for us /decl/appearance_handler/cardborg/proc/item_removed(var/obj/item/item, var/mob/user) if((istype(item, /obj/item/clothing/suit/cardborg) || istype(item, /obj/item/clothing/head/cardborg)) || istype(item, /obj/item/storage/backpack)) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index df3678803fe..e90b12f208b 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -153,7 +153,7 @@ return var/param = ref ? "\ref[ref]" : "null" - addtimer(CALLBACK(user, /mob/proc/post_onclose, windowid, param), 2) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, post_onclose), windowid, param), 2) /mob/proc/post_onclose(windowid, param) if(client) diff --git a/code/datums/callbacks.dm b/code/datums/callbacks.dm index 575a3f13959..869a5831bed 100644 --- a/code/datums/callbacks.dm +++ b/code/datums/callbacks.dm @@ -1,46 +1,44 @@ -// USAGE: -// -// var/datum/callback/C = new(object|null, /proc/type/path|"procstring", arg1, arg2, ... argn) -// var/timerid = addtimer(C, time, timertype) -// OR -// var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype) -// -// Note: proc strings can only be given for datum proc calls, global procs must be proc paths -// Also proc strings are strongly advised against because they don't compile error if the proc stops existing -// See the note on proc typepath shortcuts -// -// INVOKING THE CALLBACK: -// var/result = C.Invoke(args, to, add) //additional args are added after the ones given when the callback was created -// OR -// var/result = C.InvokeAsync(args, to, add) //Sleeps will not block, returns . on the first sleep (then continues on in the "background" after the sleep/block ends), otherwise operates normally. -// OR -// INVOKE_ASYNC() to immediately create and call InvokeAsync -// -// PROC TYPEPATH SHORTCUTS (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...) -// -// global proc while in another global proc: -// .procname -// Example: -// CALLBACK(GLOBAL_PROC, .some_proc_here) -// -// proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents: -// .procname -// Example: -// CALLBACK(src, .some_proc_here) -// -// -// when the above doesn't apply: -// .proc/procname -// Example: -// CALLBACK(src, .proc/some_proc_here) -// -// proc defined on a parent of a some type: -// /some/type/.proc/some_proc_here -// -// -// -// Other wise you will have to do the full typepath of the proc (/type/of/thing/proc/procname) - +/** + *# Callback Datums + *A datum that holds a proc to be called on another object, used to track proccalls to other objects + * + * ## USAGE + * + * ``` + * var/datum/callback/C = new(object|null, PROC_REF(procname), arg1, arg2, ... argn) + * var/timerid = addtimer(C, time, timertype) + * you can also use the compiler define shorthand + * var/timerid = addtimer(CALLBACK(object|null, PROC_REF(procname), arg1, arg2, ... argn), time, timertype) + * ``` + * + * Note: proc strings can only be given for datum proc calls, global procs must be proc paths + * + * Also proc strings are strongly advised against because they don't compile error if the proc stops existing + * + * In some cases you can provide a shortform of the procname, see the proc typepath shortcuts documentation below + * + * ## INVOKING THE CALLBACK + *`var/result = C.Invoke(args, to, add)` additional args are added after the ones given when the callback was created + * + * `var/result = C.InvokeAsync(args, to, add)` Asynchronous - returns . on the first sleep then continues on in the background + * after the sleep/block ends, otherwise operates normally. + * + * ## PROC TYPEPATH SHORTCUTS + * (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...) + * + * ### proc defined on current(src) object OR overridden at src or any of it's parents: + * PROC_REF(procname) + * + * `CALLBACK(src, PROC_REF(some_proc_here))` + * + * ### global proc + * GLOBAL_PROC_REF(procname) + * + * `CALLBACK(src, GLOBAL_PROC_REF(some_proc_here))` + * + * ### proc defined on some type + * TYPE_PROC_REF(/some/type/, some_proc_here) + */ /datum/callback var/datum/object = GLOBAL_PROC var/delegate diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index 8be0b5d1b63..2d56bc1db45 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -1,13 +1,11 @@ var/global/datum/cinematic/cinematic = new -//Was moved from the gameticker to here. Could use further improvement. - /datum/cinematic //station_explosion used to be a variable for every mob's hud. Which was a waste! //Now we have a general cinematic centrally held within the gameticker....far more efficient! - var/obj/screen/cinematic_screen = null + var/obj/screen/cinematic/cinematic_screen = null //Plus it provides an easy way to make cinematics for other events. Just use this as a template :) -/datum/cinematic/proc/station_explosion_cinematic(var/station_missed=0, var/datum/game_mode/override) +/datum/cinematic/proc/station_explosion_cinematic(var/station_missed=0, var/decl/game_mode/override) set waitfor = FALSE if(cinematic_screen) @@ -16,18 +14,12 @@ var/global/datum/cinematic/cinematic = new if(!override) override = SSticker.mode if(!override) - override = gamemode_cache["extended"] + override = GET_DECL(/decl/game_mode/extended) if(!override) return //initialise our cinematic screen object - cinematic_screen = new(src) - cinematic_screen.icon = 'icons/effects/station_explosion.dmi' - cinematic_screen.icon_state = "station_intact" - cinematic_screen.plane = HUD_PLANE - cinematic_screen.layer = HUD_ABOVE_ITEM_LAYER - cinematic_screen.mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - cinematic_screen.screen_loc = "LEFT+1,BOTTOM" + cinematic_screen = new //Let's not discuss how this worked previously. var/list/viewers = list() diff --git a/code/datums/communication/aooc.dm b/code/datums/communication/aooc.dm index e6a3b9575b9..52ca16f4194 100644 --- a/code/datums/communication/aooc.dm +++ b/code/datums/communication/aooc.dm @@ -2,7 +2,7 @@ /decl/communication_channel/aooc name = "AOOC" - config_setting = "aooc_allowed" + config_setting = /decl/config/toggle/on/aooc_allowed expected_communicator_type = /client flags = COMMUNICATION_LOG_CHANNEL_NAME|COMMUNICATION_ADMIN_FOLLOW log_proc = /proc/log_ooc diff --git a/code/datums/communication/channel.dm b/code/datums/communication/channel.dm index 261a0bd658b..c9dc993cb37 100644 --- a/code/datums/communication/channel.dm +++ b/code/datums/communication/channel.dm @@ -48,7 +48,7 @@ log_debug("[log_info_line(communicator)] attempted to communicate over the channel [src] but was of an unexpected type.") return FALSE - if(config_setting && !config.vars[config_setting] && !check_rights(R_INVESTIGATE,0,communicator)) + if(config_setting && !get_config_value(config_setting) && !check_rights(R_INVESTIGATE,0,communicator)) to_chat(communicator, "[name] is globally muted.") return FALSE @@ -117,7 +117,7 @@ if (!message) return FALSE - if (!override_config && config_setting && !config.vars[config_setting]) + if (!override_config && config_setting && !get_config_value(config_setting)) return FALSE return TRUE diff --git a/code/datums/communication/dsay.dm b/code/datums/communication/dsay.dm index 67c01783178..c21705a672e 100644 --- a/code/datums/communication/dsay.dm +++ b/code/datums/communication/dsay.dm @@ -3,7 +3,7 @@ /decl/communication_channel/dsay name = "DSAY" - config_setting = "dsay_allowed" + config_setting = /decl/config/toggle/on/dsay_allowed expected_communicator_type = /client flags = COMMUNICATION_LOG_CHANNEL_NAME log_proc = /proc/log_say diff --git a/code/datums/communication/looc.dm b/code/datums/communication/looc.dm index 756c05f021a..925ccbeb1ac 100644 --- a/code/datums/communication/looc.dm +++ b/code/datums/communication/looc.dm @@ -1,6 +1,6 @@ /decl/communication_channel/ooc/looc name = "LOOC" - config_setting = "looc_allowed" + config_setting = /decl/config/toggle/on/looc_allowed flags = COMMUNICATION_NO_GUESTS|COMMUNICATION_LOG_CHANNEL_NAME|COMMUNICATION_ADMIN_FOLLOW show_preference_setting = /datum/client_preference/show_looc diff --git a/code/datums/communication/ooc.dm b/code/datums/communication/ooc.dm index 401c662e90b..2d206d206bc 100644 --- a/code/datums/communication/ooc.dm +++ b/code/datums/communication/ooc.dm @@ -1,6 +1,6 @@ /decl/communication_channel/ooc name = "OOC" - config_setting = "ooc_allowed" + config_setting = /decl/config/toggle/on/ooc_allowed expected_communicator_type = /client flags = COMMUNICATION_NO_GUESTS log_proc = /proc/log_ooc @@ -13,7 +13,7 @@ return if(!C.holder) - if(!config.dooc_allowed && (C.mob.stat == DEAD)) + if(!get_config_value(/decl/config/toggle/on/dooc_allowed) && (C.mob.stat == DEAD)) to_chat(C, "[name] for dead mobs has been turned off.") return FALSE if(findtext(message, "byond://")) diff --git a/code/datums/composite_sounds/_composite_sound.dm b/code/datums/composite_sounds/_composite_sound.dm index b7de5e43b9d..12790c6765c 100644 --- a/code/datums/composite_sounds/_composite_sound.dm +++ b/code/datums/composite_sounds/_composite_sound.dm @@ -64,7 +64,7 @@ if(!chance || prob(chance)) play(get_sound(starttime)) if(!timerid) - timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP) + timerid = addtimer(CALLBACK(src, PROC_REF(sound_loop), world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP) /datum/composite_sound/proc/play(soundfile) var/sound/S = sound(soundfile) @@ -81,7 +81,7 @@ if(start_sound) play(start_sound) start_wait = start_length - addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME) + addtimer(CALLBACK(src, PROC_REF(sound_loop)), start_wait, TIMER_CLIENT_TIME) /datum/composite_sound/proc/on_stop() if(end_sound) diff --git a/code/datums/config/_config.dm b/code/datums/config/_config.dm new file mode 100644 index 00000000000..0ffc1891a8b --- /dev/null +++ b/code/datums/config/_config.dm @@ -0,0 +1,152 @@ +#define CONFIG_FLAG_BOOL BITFLAG(0) +#define CONFIG_FLAG_NUM BITFLAG(1) +#define CONFIG_FLAG_ENUM BITFLAG(2) +#define CONFIG_FLAG_TEXT BITFLAG(3) +#define CONFIG_FLAG_LIST BITFLAG(4) +#define CONFIG_FLAG_HAS_VALUE BITFLAG(5) + +/proc/get_config_value(var/config_decl) + var/decl/config/config_option = GET_DECL(config_decl) + return config_option.value + +/proc/set_config_value(var/config_decl, var/new_value, var/defer_config_refresh = FALSE) + + // Get our actual value (loading from text etc. may change data type) + var/decl/config/config_option = GET_DECL(config_decl) + if((config_option.config_flags & CONFIG_FLAG_NUM) && istext(new_value)) + new_value = text2num(new_value) + else if((config_option.config_flags & (CONFIG_FLAG_ENUM|CONFIG_FLAG_TEXT)) && isnum(new_value)) + new_value = num2text(new_value) + + // Identical values, no point updating. + if(config_option.value == new_value) + return + + // Actually set the value. + var/old_value = config_option.value + config_option.set_value(new_value) + if(config_option.value != old_value && !defer_config_refresh) + config_option.update_post_value_set() + +/proc/toggle_config_value(var/config_decl) + var/decl/config/config_option = GET_DECL(config_decl) + if(!(config_option.config_flags & CONFIG_FLAG_BOOL)) + CRASH("Attempted to toggle non-boolean config entry [config_decl].") + set_config_value(config_decl, !config_option.value) + return config_option.value + +/decl/config + abstract_type = /decl/config + decl_flags = DECL_FLAG_MANDATORY_UID + var/desc + var/value + var/default_value + var/config_flags = CONFIG_FLAG_HAS_VALUE + var/protected = FALSE + + var/static/list/protected_vars = list( + "desc", + "value", + "default_value", + "config_flags", + "protected" + ) + +/decl/config/Initialize() + . = ..() + // Config options without values are assumed false and set to true if present in the loaded data. + // Otherwise we initialize to the default value. + if(!(config_flags & CONFIG_FLAG_HAS_VALUE)) + default_value = FALSE + if(desc) + desc += " Uncomment to enable." + else + desc = "Uncomment to enable." + value = default_value + +/decl/config/VV_hidden() + . = ..() + if(protected) + . |= protected_vars + +/decl/config/validate() + . = ..() + if(isnull(desc)) + . += "no config description set" + if(isnull(default_value)) + if(config_flags & CONFIG_FLAG_HAS_VALUE) + . += "null default value" + else + if((config_flags & (CONFIG_FLAG_NUM|CONFIG_FLAG_ENUM)) && !isnum(default_value)) + . += "has numeric or enum flag but not numeric default_value" + else if((config_flags & CONFIG_FLAG_TEXT) && !istext(default_value)) + . += "has text flag but not text default_value" + else if((config_flags & CONFIG_FLAG_LIST) && !islist(default_value)) + . += "has list flag but not list default_value" + set_value(handle_value_deconversion(default_value)) + if(!compare_values(value, default_value)) + . += "setting to default value via proc resulted in different value ([serialize_value(value)] != [serialize_value(default_value)])" + var/comparison_fail = default_value_serialize_comparison_fails() + if(comparison_fail) + . += "conversion and deconversion of default value does not equal default value ([comparison_fail])" + +/decl/config/proc/compare_values(var/value_one, var/value_two) + return value_one == value_two + +/decl/config/proc/default_value_serialize_comparison_fails() + var/new_val = handle_value_conversion(handle_value_deconversion(default_value)) + if(!compare_values(new_val, default_value)) + return "[new_val] != [default_value]" + +/decl/config/proc/sanitize_value() + SHOULD_CALL_PARENT(TRUE) + var/invalid_value = FALSE + if((config_flags & CONFIG_FLAG_BOOL) && value != TRUE && value != FALSE) + invalid_value = TRUE + else if((config_flags & (CONFIG_FLAG_NUM|CONFIG_FLAG_ENUM)) && !isnum(value)) + invalid_value = TRUE + else if((config_flags & CONFIG_FLAG_TEXT) && !istext(value)) + invalid_value = TRUE + else if((config_flags & CONFIG_FLAG_LIST) && !islist(value)) + invalid_value = TRUE + if(invalid_value) + value = default_value + +/decl/config/proc/update_post_value_set() + SHOULD_CALL_PARENT(TRUE) + return + +/decl/config/proc/get_config_file_text() + . = list() + if(desc) + if(islist(desc)) + for(var/config_line in desc) + . += "## [config_line]" + else + . += "## [desc]" + if(config_flags & CONFIG_FLAG_HAS_VALUE) + if(compare_values(value, default_value)) + . += "#[uppertext(uid)] [serialize_default_value()]" + else + . += "[uppertext(uid)] [serialize_value()]" + else if(value) + . += uppertext(uid) + else + . += "#[uppertext(uid)]" + return jointext(., "\n") + +/decl/config/proc/serialize_value() + return "[handle_value_deconversion(value)]" + +/decl/config/proc/serialize_default_value() + return "[handle_value_deconversion(default_value)]" + +/decl/config/proc/handle_value_conversion(var/new_value) + return new_value + +/decl/config/proc/handle_value_deconversion(var/new_value) + return new_value + +/decl/config/proc/set_value(var/new_value) + value = handle_value_conversion(new_value) + sanitize_value() diff --git a/code/datums/config/_config_categories.dm b/code/datums/config/_config_categories.dm new file mode 100644 index 00000000000..b9212994768 --- /dev/null +++ b/code/datums/config/_config_categories.dm @@ -0,0 +1,40 @@ +/decl/configuration_category + abstract_type = /decl/configuration_category + var/name + var/desc + var/configuration_file_location = "config/configuration.txt" + var/list/associated_configuration + +/decl/configuration_category/Initialize() + if(length(associated_configuration)) + for(var/decl_type in associated_configuration) + associated_configuration -= decl_type + associated_configuration += GET_DECL(decl_type) + return ..() + +/decl/configuration_category/validate() + . = ..() + if(!name) + . += "no name set" + if(!desc) + . += "no description supplied" + if(isnull(configuration_file_location)) + . += "null dump file target" + +/decl/configuration_category/proc/get_config_category_text() + + if(!length(associated_configuration)) + return "" + + var/list/header = list( + "##", + "# [uppertext(name)]", + "# [desc]", + "##" + ) + + . = list("[jointext(header, "\n")]") + associated_configuration = sortTim(associated_configuration, /proc/cmp_decl_uid_asc) + for(var/decl/config/config_option in associated_configuration) + . += config_option.get_config_file_text() + return jointext(., "\n\n") diff --git a/code/datums/config/config_enum.dm b/code/datums/config/config_enum.dm new file mode 100644 index 00000000000..ba61b07b6dd --- /dev/null +++ b/code/datums/config/config_enum.dm @@ -0,0 +1,32 @@ +/decl/config/enum + abstract_type = /decl/config/enum + default_value = 0 + config_flags = CONFIG_FLAG_ENUM | CONFIG_FLAG_HAS_VALUE + +/decl/config/enum/proc/get_enum_map() + return + +/decl/config/enum/validate() + . = ..() + if(!length(get_enum_map())) + . += "enum config has zero-length return to get_enum_map()" + +/decl/config/enum/Initialize() + . = ..() + var/list/enum_map = get_enum_map() + if(length(enum_map)) + if(desc) + desc = "[desc] Valid values: [english_list(enum_map)]." + else + desc = english_list(enum_map) + +/decl/config/enum/set_value(var/new_value) + if(istext(new_value)) + var/list/enum_map = get_enum_map() + new_value = trim(lowertext(new_value)) + if(new_value in enum_map) + new_value = enum_map[new_value] + else + log_error("Invalid key '[new_value]' supplied to [type].") + new_value = default_value + return ..(new_value) diff --git a/code/datums/config/config_list.dm b/code/datums/config/config_list.dm new file mode 100644 index 00000000000..a2c5893c39c --- /dev/null +++ b/code/datums/config/config_list.dm @@ -0,0 +1,25 @@ +/decl/config/lists + abstract_type = /decl/config/lists + default_value = list() + config_flags = CONFIG_FLAG_LIST | CONFIG_FLAG_HAS_VALUE + +/decl/config/lists/handle_value_deconversion(var/new_value) + return json_encode(new_value) + +/decl/config/lists/handle_value_conversion(var/new_value) + return json_decode(new_value) + +/decl/config/lists/compare_values(var/value_one, var/value_two) + if(!islist(value_one) || !islist(value_two)) + return ..(value_one, value_two) + if(length(value_one) != length(value_two)) + return FALSE + for(var/i = 1 to length(value_one)) + if(!same_entries(value_one[i], value_two[i]) && value_one[i] != value_two[i]) + return FALSE + return TRUE + +/decl/config/lists/default_value_serialize_comparison_fails() + var/list/new_value = handle_value_conversion(handle_value_deconversion(default_value)) + if(!compare_values(new_value, default_value)) + return "[json_encode(new_value)] != [json_encode(default_value)]" diff --git a/code/datums/config/config_num.dm b/code/datums/config/config_num.dm new file mode 100644 index 00000000000..9e28c6e5ec0 --- /dev/null +++ b/code/datums/config/config_num.dm @@ -0,0 +1,18 @@ +/decl/config/num + abstract_type = /decl/config/num + config_flags = CONFIG_FLAG_NUM | CONFIG_FLAG_HAS_VALUE + default_value = 0 + var/min_value = -(INFINITY) + var/max_value = INFINITY + var/rounding + +/decl/config/num/sanitize_value() + ..() + value = clamp(value, min_value, max_value) + if(!isnull(rounding)) + value = round(value, rounding) + +/decl/config/num/compare_values(value_one, value_two) + if(!isnum(value_one) || !isnum(value_two) || !rounding) + return ..(value_one, value_two) + return abs(value_one - value_two) < rounding // epsilon compare due to floating point issues \ No newline at end of file diff --git a/code/datums/config/config_num_client.dm b/code/datums/config/config_num_client.dm new file mode 100644 index 00000000000..4b1527c9fb5 --- /dev/null +++ b/code/datums/config/config_num_client.dm @@ -0,0 +1,7 @@ +/decl/config/num/clients + abstract_type = /decl/config/num/clients + +/decl/config/num/clients/update_post_value_set() + for(var/client/client) + client.OnResize() + . = ..() diff --git a/code/datums/config/config_text.dm b/code/datums/config/config_text.dm new file mode 100644 index 00000000000..4385399d4d7 --- /dev/null +++ b/code/datums/config/config_text.dm @@ -0,0 +1,4 @@ +/decl/config/text + abstract_type = /decl/config/text + config_flags = CONFIG_FLAG_TEXT | CONFIG_FLAG_HAS_VALUE + default_value = "" diff --git a/code/datums/config/config_toggle.dm b/code/datums/config/config_toggle.dm new file mode 100644 index 00000000000..ac859d2edb0 --- /dev/null +++ b/code/datums/config/config_toggle.dm @@ -0,0 +1,4 @@ +/decl/config/toggle + abstract_type = /decl/config/toggle + config_flags = CONFIG_FLAG_BOOL + default_value = FALSE diff --git a/code/datums/config/config_toggle_on.dm b/code/datums/config/config_toggle_on.dm new file mode 100644 index 00000000000..1f1910a1308 --- /dev/null +++ b/code/datums/config/config_toggle_on.dm @@ -0,0 +1,5 @@ + +/decl/config/toggle/on + abstract_type = /decl/config/toggle/on + default_value = TRUE + config_flags = CONFIG_FLAG_BOOL | CONFIG_FLAG_HAS_VALUE diff --git a/code/datums/config/config_types/config_admin.dm b/code/datums/config/config_types/config_admin.dm new file mode 100644 index 00000000000..c7515d4ea52 --- /dev/null +++ b/code/datums/config/config_types/config_admin.dm @@ -0,0 +1,79 @@ +/decl/configuration_category/admin + name = "Admin" + desc = "Configuration options relating to administration." + associated_configuration = list( + /decl/config/num/mod_tempban_max, + /decl/config/num/mod_job_tempban_max, + /decl/config/num/autostealth, + /decl/config/toggle/on/guest_jobban, + /decl/config/toggle/on/auto_local_admin, + /decl/config/toggle/on/admin_jump, + /decl/config/toggle/on/admin_spawning, + /decl/config/toggle/on/admin_revive, + /decl/config/toggle/admin_ooccolor, + /decl/config/toggle/mods_can_job_tempban, + /decl/config/toggle/mods_can_tempban, + /decl/config/toggle/allow_unsafe_narrates + ) + +/decl/config/num/mod_tempban_max + uid = "mod_tempban_max" + default_value = 1440 + desc = "Maximum mod tempban duration (in minutes)." + +/decl/config/num/mod_job_tempban_max + uid = "mod_job_tempban_max" + default_value = 1440 + desc = "Maximum mod job tempban duration (in minutes)." + +/decl/config/num/autostealth + uid = "autostealth" + default_value = 0 + desc = "Uncomment to enable auto-stealthing staff who are AFK for more than specified minutes." + +/decl/config/toggle/on/guest_jobban + uid = "guest_jobban" + desc = list( + "Set to jobban 'Guest-' accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions.", + "Set to 1 to jobban them from those positions, set to 0 to allow them." + ) + +/decl/config/toggle/on/auto_local_admin + uid = "auto_local_admin" + desc = "Set to 0/1 to disable/enable automatic admin rights for users connecting from the host the server is running on." + +/decl/config/toggle/on/admin_jump + uid = "allow_admin_jump" + desc = "Allows admin jumping." + +/decl/config/toggle/on/admin_spawning + uid = "allow_admin_spawning" + desc = "Allows admin item spawning." + +/decl/config/toggle/on/admin_revive + uid = "allow_admin_rev" + desc = "Allows admin revives." + +/decl/config/toggle/admin_ooccolor + uid = "allow_admin_ooccolor" + desc = "Comment this out to stop admins being able to choose their personal OOC color." + +/decl/config/toggle/mods_can_tempban + uid = "mods_can_tempban" + desc = "Chooses whether mods have the ability to tempban or not." + +/decl/config/toggle/mods_can_job_tempban + uid = "mods_can_job_tempban" + desc = "Chooses whether mods have the ability to issue tempbans for jobs or not." + +/decl/config/toggle/allow_unsafe_narrates + uid = "allow_unsafe_narrates" + desc = "Uncomment this to allow admins to narrate using HTML tags." + +/decl/config/toggle/visible_examine + uid = "visible_examine" + desc = "Uncomment this to show a visible message when someone examines something ('Dave looks at you.')." + +/decl/config/toggle/allow_loadout_customization + uid = "loadout_customization" + desc = "Uncomment this to allow all loadout items to have name and desc customized by default." diff --git a/code/datums/config/config_types/config_client.dm b/code/datums/config/config_types/config_client.dm new file mode 100644 index 00000000000..cb6e8a5a359 --- /dev/null +++ b/code/datums/config/config_types/config_client.dm @@ -0,0 +1,60 @@ +/decl/configuration_category/events + name = "Client" + desc = "Configuration options relating to client settings." + associated_configuration = list( + /decl/config/num/clients/lock_client_view_x, + /decl/config/num/clients/lock_client_view_y, + /decl/config/num/clients/max_client_view_x, + /decl/config/num/clients/max_client_view_y, + /decl/config/toggle/popup_admin_pm, + /decl/config/toggle/aggressive_changelog, + /decl/config/lists/forbidden_versions + ) + +/decl/config/lists/forbidden_versions + uid = "forbidden_versions" + default_value = list("512.0001", "512.0002") + desc = "BYOND builds that will result the client using them to be banned." + +/decl/config/num/clients/lock_client_view_x + uid = "lock_client_view_x" + default_value = 0 + desc = "Uncomment and set to an integer to lock the automatic client view scaling on the X axis." + +/decl/config/num/clients/lock_client_view_y + uid = "lock_client_view_y" + default_value = 0 + desc = "Uncomment and set to an integer to lock the automatic client view scaling on the Y axis." + +/decl/config/num/clients/max_client_view_x + uid = "max_client_view_x" + default_value = MAX_VIEW + desc = "Change to set a maximum size for the client view X scaling." + +/decl/config/num/clients/max_client_view_x/update_post_value_set() + global.click_catchers = null + for(var/client/client) + client.reset_click_catchers() + . = ..() + +/decl/config/num/clients/max_client_view_y + uid = "max_client_view_y" + default_value = MAX_VIEW + desc = "Change to set a maximum size for the client view Y scaling." + +/decl/config/num/clients/max_client_view_y/update_post_value_set() + global.click_catchers = null + for(var/client/client) + client.reset_click_catchers() + . = ..() + +/decl/config/toggle/popup_admin_pm + uid = "popup_admin_pm" + desc = list( + "Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM.", + "The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off)." + ) + +/decl/config/toggle/aggressive_changelog + uid = "aggressive_changelog" + desc = "Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog." diff --git a/code/datums/config/config_types/config_debug.dm b/code/datums/config/config_types/config_debug.dm new file mode 100644 index 00000000000..66f250dd8ea --- /dev/null +++ b/code/datums/config/config_types/config_debug.dm @@ -0,0 +1,38 @@ +/decl/configuration_category/debug + name = "Debug" + desc = "Configuration options relating to error reporting." + associated_configuration = list( + /decl/config/num/debug_error_cooldown, + /decl/config/num/debug_error_limit, + /decl/config/num/debug_error_silence_time, + /decl/config/num/debug_error_msg_delay, + /decl/config/toggle/paranoid + ) + +/decl/config/num/debug_error_cooldown + uid = "error_cooldown" + desc = "The \"cooldown\" time for each occurrence of a unique error." + default_value = 600 + +/decl/config/num/debug_error_limit + uid = "error_limit" + desc = "How many occurrences before the next will silence them." + default_value = 50 + +/decl/config/num/debug_error_silence_time + uid = "error_silence_time" + desc = "How long a unique error will be silenced for." + default_value = 6000 + +/decl/config/num/debug_error_msg_delay + uid = "error_msg_delay" + desc = "How long to wait between messaging admins about occurrences of a unique error." + default_value = 50 + +/decl/config/toggle/paranoid + uid = "debug_paranoid" + desc = list( + "Uncomment to make proccall require R_ADMIN instead of R_DEBUG", + "designed for environments where you have testers but don't want them", + "able to use the more powerful debug options." + ) diff --git a/code/datums/config/config_types/config_events.dm b/code/datums/config/config_types/config_events.dm new file mode 100644 index 00000000000..0b83e38fb2b --- /dev/null +++ b/code/datums/config/config_types/config_events.dm @@ -0,0 +1,50 @@ +/decl/configuration_category/events + name = "Events" + desc = "Configuration options relating to event timers and probabilities." + associated_configuration = list( + /decl/config/enum/objectives_disabled, + /decl/config/lists/event_first_run, + /decl/config/lists/event_delay_lower, + /decl/config/lists/event_delay_upper, + /decl/config/toggle/allow_random_events + ) + +//if objectives are disabled or not +/decl/config/enum/objectives_disabled + uid = "objectives_disabled" + default_value = CONFIG_OBJECTIVE_NONE + desc = "Determines if objectives are disabled." + +/decl/config/enum/objectives_disabled/get_enum_map() + var/static/list/obj_enum_map = list( + "none" = CONFIG_OBJECTIVE_NONE, + "verb" = CONFIG_OBJECTIVE_VERB, + "all" = CONFIG_OBJECTIVE_ALL + ) + return obj_enum_map + +// No custom time, no custom time, between 80 to 100 minutes respectively. +/decl/config/lists/event_first_run + uid = "event_first_run" + desc = "If the first delay has a custom start time. Defined in minutes." + default_value = list(null, null, list("lower" = 80, "upper" = 100)) + +/decl/config/lists/event_delay_lower + uid = "event_delay_lower" + default_value = list(10, 30, 50) + desc = list( + "The lower delay between events in minutes.", + "Affect mundane, moderate, and major events respectively." + ) + +/decl/config/lists/event_delay_upper + uid = "event_delay_upper" + default_value = list(15, 45, 70) + desc = list( + "The upper delay between events in minutes.", + "Affect mundane, moderate, and major events respectively." + ) + +/decl/config/toggle/allow_random_events + uid = "allow_random_events" + desc = "Hash out to disable random events during the round." diff --git a/code/datums/config/config_types/config_game_option.dm b/code/datums/config/config_types/config_game_option.dm new file mode 100644 index 00000000000..b0dac4a4378 --- /dev/null +++ b/code/datums/config/config_types/config_game_option.dm @@ -0,0 +1,164 @@ +/decl/configuration_category/game_options + name = "Game Options" + desc = "Configuration options relating to gameplay, such as movement, health and stamina." + associated_configuration = list( + /decl/config/num/movement_human, + /decl/config/num/movement_robot, + /decl/config/num/movement_animal, + /decl/config/num/movement_run, + /decl/config/num/movement_walk, + /decl/config/num/movement_creep, + /decl/config/num/movement_glide_size, + /decl/config/num/movement_min_sprint_cost, + /decl/config/num/movement_skill_sprint_cost_range, + /decl/config/num/movement_min_stamina_recovery, + /decl/config/num/movement_max_stamina_recovery, + /decl/config/num/max_gear_cost, + /decl/config/num/max_acts_per_interval, + /decl/config/num/act_interval, + /decl/config/num/dex_malus_brainloss_threshold, + /decl/config/num/default_darksight_range, + /decl/config/num/default_darksight_effectiveness, + /decl/config/toggle/grant_default_darksight, + /decl/config/num/expected_round_length, + /decl/config/toggle/allow_diagonal_movement, + /decl/config/toggle/expanded_alt_interactions, + /decl/config/toggle/ert_admin_call_only, + /decl/config/toggle/ghosts_can_possess_animals, + /decl/config/toggle/assistant_maint, + /decl/config/toggle/ghost_interaction, + /decl/config/toggle/aliens_allowed, + /decl/config/toggle/ninjas_allowed + ) + +/decl/config/num/movement_human + uid = "human_delay" + desc = "These modify the run/walk speed of all mobs before the mob-specific modifiers are applied." + +/decl/config/num/movement_robot + uid = "robot_delay" + desc = "These modify the run/walk speed of all mobs before the mob-specific modifiers are applied." + +/decl/config/num/movement_animal + uid = "animal_delay" + desc = "These modify the run/walk speed of all mobs before the mob-specific modifiers are applied." + +/decl/config/num/movement_run + uid = "run_delay" + default_value = 2 + desc = "These modify the run/walk speed of all mobs before the mob-specific modifiers are applied." + +/decl/config/num/movement_walk + uid = "walk_delay" + default_value = 4 + desc = "These modify the run/walk speed of all mobs before the mob-specific modifiers are applied." + +/decl/config/num/movement_creep + uid = "creep_delay" + default_value = 6 + desc = "These modify the run/walk speed of all mobs before the mob-specific modifiers are applied." + +/decl/config/num/movement_glide_size + uid = "glide_size_delay" + default_value = 1 + desc = "Set this to 0 for perfectly smooth movement gliding, or 1 or more for delayed chess move style movements." + +/decl/config/num/movement_min_sprint_cost + uid = "minimum_sprint_cost" + default_value = 0.8 + rounding = 0.01 + desc = "Value used for expending stamina during sprinting." + +/decl/config/num/movement_skill_sprint_cost_range + uid = "skill_sprint_cost_range" + default_value = 0.8 + rounding = 0.01 + desc = "Determines the severity of athletics skill when applied to stamina cost." + +/decl/config/num/movement_min_stamina_recovery + uid = "minimum_stamina_recovery" + default_value = 1 + desc = "Minimum stamina recovered per tick when resting." + +/decl/config/num/movement_max_stamina_recovery + uid = "maximum_stamina_recovery" + default_value = 3 + desc = "Maximum stamina recovered per tick when resting." + +/decl/config/num/max_gear_cost + uid = "max_gear_cost" + default_value = 10 + desc = "How many loadout points are available. Use 0 to disable loadout, and any negative number to indicate infinite points." + +/decl/config/num/max_gear_cost/sanitize_value() + ..() + if(value < 0) + value = INFINITY + +/decl/config/num/max_acts_per_interval + uid = "max_acts_per_interval" + default_value = 140 + desc = "Uncomment this to modify the number of actions permitted per interval before being kicked for spam." + +/decl/config/num/act_interval + uid = "act_interval" + default_value = 0.1 + rounding = 0.01 + desc = "Uncomment this to modify the length of the spam kicking interval in seconds." + +/decl/config/num/dex_malus_brainloss_threshold + uid = "dex_malus_brainloss_threshold" + default_value = 30 + desc = "Threshold of where brain damage begins to affect dexterity (70 brainloss above this means zero dexterity). Default is 30." + +/decl/config/num/default_darksight_range + uid = "default_darksight_range" + default_value = 2 + desc = "The range of default darksight if above is uncommented." + +/decl/config/num/default_darksight_effectiveness + uid = "default_darksight_effectiveness" + default_value = 0.05 + rounding = 0.01 + desc = "The effectiveness of default darksight if above is uncommented." + +/decl/config/num/expected_round_length + uid = "expected_round_length" + default_value = 3 + desc = "Expected round length in hours." + +/decl/config/toggle/grant_default_darksight + uid = "grant_default_darksight" + desc = "Whether or not all human mobs have very basic darksight by default." + +/decl/config/toggle/allow_diagonal_movement + uid = "allow_diagonal_movement" + desc = "Allow multiple input keys to be pressed for diagonal movement." + +/decl/config/toggle/expanded_alt_interactions + uid = "expanded_alt_interactions" + desc = "Uncomment this to enable expanded alt interactions with objects." + +/decl/config/toggle/ert_admin_call_only + uid = "ert_admin_call_only" + desc = "Restricted ERT to be only called by admins." + +/decl/config/toggle/ghosts_can_possess_animals + uid = "ghosts_can_possess_animals" + desc = "Uncomment to allow ghosts to possess any animal." + +/decl/config/toggle/assistant_maint + uid = "assistant_maint" + desc = "Remove the # to give assistants maint access." + +/decl/config/toggle/ghost_interaction + uid = "ghost_interaction" + desc = "Remove the # to let ghosts spin chairs." + +/decl/config/toggle/aliens_allowed + uid = "aliens_allowed" + desc = "Remove the # to let aliens spawn." + +/decl/config/toggle/ninjas_allowed + uid = "ninjas_allowed" + desc = "Remove the # to let ninjas spawn." diff --git a/code/datums/config/config_types/config_game_world.dm b/code/datums/config/config_types/config_game_world.dm new file mode 100644 index 00000000000..d81b963b1f6 --- /dev/null +++ b/code/datums/config/config_types/config_game_world.dm @@ -0,0 +1,127 @@ +/decl/configuration_category/game_world + name = "Game World" + desc = "Configuration options relating to the game world and simulation." + associated_configuration = list( + /decl/config/num/exterior_ambient_light, + /decl/config/num/radiation_decay_rate, + /decl/config/num/radiation_resistance_multiplier, + /decl/config/num/radiation_material_resistance_divisor, + /decl/config/num/radiation_lower_limit, + /decl/config/num/exoplanet_min_day_duration, + /decl/config/num/exoplanet_max_day_duration, + /decl/config/toggle/use_iterative_explosions, + /decl/config/num/iterative_explosives_z_threshold, + /decl/config/num/iterative_explosives_z_multiplier, + /decl/config/num/maximum_mushrooms, + /decl/config/num/gateway_delay, + /decl/config/text/law_zero, + /decl/config/toggle/on/welder_vision, + /decl/config/toggle/on/allow_ic_printing, + /decl/config/toggle/on/cult_ghostwriter, + /decl/config/toggle/allow_holidays, + /decl/config/toggle/humans_need_surnames, + /decl/config/toggle/roundstart_level_generation + ) + +/decl/config/num/exterior_ambient_light + uid = "exterior_ambient_light" + default_value = 0 + min_value = 0 + desc = "Percentile strength of exterior ambient light (such as starlight). 0.5 is 50% lit." + +/decl/config/num/radiation_decay_rate + uid = "radiation_decay_rate" + default_value = 1 + desc = "How much radiation levels self-reduce by each tick." + +/decl/config/num/radiation_resistance_multiplier + uid = "radiation_resistance_multiplier" + default_value = 1.25 + desc = "The amount of radiation resistance on a turf is multiplied by this value." + +/decl/config/num/radiation_material_resistance_divisor + uid = "radiation_material_resistance_divisor" + default_value = 2 + desc = "General material radiation resistance is divided by this value." + +/decl/config/num/radiation_lower_limit + uid = "radiation_lower_limit" + default_value = 0.15 + rounding = 0.1 + desc = list( + "Below this point, radiation is ignored.", + "Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage.", + "Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT" + ) + +/decl/config/num/exoplanet_min_day_duration + uid = "exoplanet_min_day_duration" + default_value = 10 + desc = "The minimum duration of an exoplanet day, in minutes." + +/decl/config/num/exoplanet_max_day_duration + uid = "exoplanet_max_day_duration" + default_value = 40 + desc = "The maximum duration of an exoplanet day, in minutes." + +/decl/config/toggle/use_iterative_explosions + uid = "use_iterative_explosions" + desc = "Unhash this to use iterative explosions, keep it hashed to use circle explosions." + +/decl/config/num/iterative_explosives_z_threshold + uid = "iterative_explosives_z_threshold" + default_value = 10 + desc = "The power of explosion required for it to cross Z-levels." + +/decl/config/num/iterative_explosives_z_multiplier + uid = "iterative_explosives_z_multiplier" + default_value = 0.75 + rounding = 0.01 + desc = "What to multiply power by when crossing Z-levels." + +/decl/config/num/maximum_mushrooms + uid = "maximum_mushrooms" + desc = "After this amount alive, walking mushrooms spawned from botany will not reproduce." + default_value = 15 + +/decl/config/num/gateway_delay + uid = "gateway_delay" + default_value = 18000 + desc = "How long the delay is before the Away Mission gate opens. Default is half an hour." + +/decl/config/text/law_zero + uid = "law_zero" + default_value = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + desc = "Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode." + +/decl/config/toggle/on/welder_vision + uid = "welder_vision" + desc = "Uncomment to disable the restrictive weldervision overlay." + +/decl/config/toggle/on/allow_ic_printing + uid = "allow_ic_printing" + desc = "Uncomment this to prevent players from printing copy/pasted circuits." + +/decl/config/toggle/on/cult_ghostwriter + uid = "cult_ghostwriter" + desc = "Uncomment to allow ghosts to write in blood during Cult rounds." + +/decl/config/toggle/allow_holidays + uid = "allow_holidays" + desc = "Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR" + +/decl/config/toggle/allow_holidays/update_post_value_set() + . = ..() + update_holiday() + +/decl/config/toggle/humans_need_surnames + uid = "humans_need_surnames" + desc = "Humans are forced to have surnames if this is uncommented." + +/decl/config/toggle/disable_daycycle + uid = "disable_daycycle" + desc = "If true, exoplanets won't have daycycles." + +/decl/config/toggle/roundstart_level_generation + uid = "roundstart_level_generation" + desc = "Enable/Disable random level generation. Will behave strangely if turned off with a map that expects it on." diff --git a/code/datums/config/config_types/config_health.dm b/code/datums/config/config_types/config_health.dm new file mode 100644 index 00000000000..c5db9f04e7a --- /dev/null +++ b/code/datums/config/config_types/config_health.dm @@ -0,0 +1,90 @@ +/decl/configuration_category/health + name = "Health" + desc = "Configuration options relating to the health simulation." + associated_configuration = list( + /decl/config/num/health_stress_shock_recovery_constant, + /decl/config/num/health_stress_healing_recovery_constant, + /decl/config/num/health_stress_blood_recovery_constant, + /decl/config/num/health_health_threshold_dead, + /decl/config/num/health_organ_health_multiplier, + /decl/config/num/health_organ_regeneration_multiplier, + /decl/config/num/health_organ_damage_spillover_multiplier, + /decl/config/num/health_revival_brain_life, + /decl/config/toggle/on/health_bones_can_break, + /decl/config/toggle/on/health_limbs_can_break + ) + +/decl/config/toggle/health_adjust_healing_from_stress + uid = "adjust_healing_from_stress" + config_flags = CONFIG_FLAG_BOOL + desc = "Uncomment to allow stressors to impact shock, healing and blood recovery." + +/decl/config/toggle/health_show_human_death_message + uid = "show_human_death_message" + config_flags = CONFIG_FLAG_BOOL + desc = "Uncomment this line to enable humans showing a visible message upon death ('X seizes up then falls limp, eyes dead and lifeless')." + +/decl/config/toggle/health_organs_decay + uid = "organs_decay" + config_flags = CONFIG_FLAG_BOOL + desc = "Uncomment to enable organ decay outside of a body or storage item." + +/decl/config/toggle/on/health_bones_can_break + uid = "bones_can_break" + desc = list( + "Determines whether bones can be broken through excessive damage to the organ.", + "0 means bones can't break, 1 means they can." + ) + +/decl/config/toggle/on/health_limbs_can_break + uid = "limbs_can_break" + desc = list( + "Determines whether limbs can be amputated through excessive damage to the organ.", + "0 means limbs can't be amputated, 1 means they can." + ) + + +/decl/config/num/health_stress_shock_recovery_constant + uid = "stress_shock_recovery_constant" + default_value = 0.5 + rounding = 0.01 + desc = "A multiplier for the impact stress has on shock recovery - 0.3 means maximum stress imposes a 30% penalty on shock recovery." + +/decl/config/num/health_stress_healing_recovery_constant + uid = "stress_healing_recovery_constant" + default_value = 0.3 + rounding = 0.01 + desc = "A multiplier for the impact stress has on wound passive healing, as above." + +/decl/config/num/health_stress_blood_recovery_constant + uid = "stress_blood_recovery_constant" + default_value = 0.3 + rounding = 0.01 + desc = "A multiplier for the impact stress has on blood regeneration, as above." + +/decl/config/num/health_health_threshold_dead + uid = "health_threshold_dead" + default_value = -100 + desc = "Level of health at which a mob becomes dead." + +/decl/config/num/health_organ_health_multiplier + uid = "organ_health_multiplier" + default_value = 0.9 + rounding = 0.01 + desc = "Percentage multiplier which enables organs to take more damage before bones breaking or limbs being destroyed." + +/decl/config/num/health_organ_regeneration_multiplier + uid = "organ_regeneration_multiplier" + default_value = 0.25 + desc = "Percentage multiplier which influences how fast organs regenerate naturally." + +/decl/config/num/health_organ_damage_spillover_multiplier + uid = "organ_damage_spillover_multiplier" + desc = "Percentage multiplier that influences how damage spreads around organs. 100 means normal, 50 means half." + default_value = 0.5 + rounding = 0.01 + +/decl/config/num/health_revival_brain_life + uid = "revival_brain_life" + default_value = -1 + desc = "Amount of time (in hundredths of seconds) for which a brain retains the 'spark of life' after the person's death (set to -1 for infinite)." diff --git a/code/datums/config/config_types/config_logging.dm b/code/datums/config/config_types/config_logging.dm new file mode 100644 index 00000000000..8efc131bce0 --- /dev/null +++ b/code/datums/config/config_types/config_logging.dm @@ -0,0 +1,85 @@ +/decl/configuration_category/logging + name = "Logging" + desc = "Configuration options relating to logging." + associated_configuration = list( + /decl/config/toggle/log_ooc, + /decl/config/toggle/log_access, + /decl/config/toggle/log_say, + /decl/config/toggle/log_admin, + /decl/config/toggle/log_debug, + /decl/config/toggle/log_game, + /decl/config/toggle/log_vote, + /decl/config/toggle/log_whisper, + /decl/config/toggle/log_emotes, + /decl/config/toggle/log_attack, + /decl/config/toggle/log_adminchat, + /decl/config/toggle/log_adminwarn, + /decl/config/toggle/log_pda, + /decl/config/toggle/log_hrefs, + /decl/config/toggle/log_runtime, + /decl/config/toggle/log_world_output + ) + +/decl/config/toggle/log_ooc + uid = "log_ooc" + desc = "log OOC channel" + +/decl/config/toggle/log_access + uid = "log_access" + desc = "log client access (logon/logoff)" + +/decl/config/toggle/log_say + uid = "log_say" + desc = "log client Say" + +/decl/config/toggle/log_admin + uid = "log_admin" + desc = "log admin actions" + +/decl/config/toggle/log_debug + uid = "log_debug" + desc = "log debug output" + +/decl/config/toggle/log_game + uid = "log_game" + desc = "log game actions (start of round, results, etc.)" + +/decl/config/toggle/log_vote + uid = "log_vote" + desc = "log player votes" + +/decl/config/toggle/log_whisper + uid = "log_whisper" + desc = "log client Whisper" + +/decl/config/toggle/log_emotes + uid = "log_emote" + desc = "log emotes" + +/decl/config/toggle/log_attack + uid = "log_attack" + desc = "log attack messages" + +/decl/config/toggle/log_adminchat + uid = "log_adminchat" + desc = "log admin chat" + +/decl/config/toggle/log_adminwarn + uid = "log_adminwarn" + desc = "Log admin warning messages. Also duplicates a bunch of other messages." + +/decl/config/toggle/log_pda + uid = "log_pda" + desc = "Log PDA messages." + +/decl/config/toggle/log_hrefs + uid = "log_hrefs" + desc = "Log all Topic() calls (for use by coders in tracking down Topic issues)." + +/decl/config/toggle/log_runtime + uid = "log_runtime" + desc = "Log world.log and runtime errors to a file." + +/decl/config/toggle/log_world_output + uid = "log_world_output" + desc = "Log world.log messages." diff --git a/code/datums/config/config_types/config_mode.dm b/code/datums/config/config_types/config_mode.dm new file mode 100644 index 00000000000..adf5fe06718 --- /dev/null +++ b/code/datums/config/config_types/config_mode.dm @@ -0,0 +1,112 @@ +/decl/configuration_category/modes + name = "Modes" + desc = "Configuration options relating to game modes." + associated_configuration = list( + /decl/config/lists/mode_names, + /decl/config/lists/mode_allowed, + /decl/config/lists/mode_votable, + /decl/config/lists/mode_probabilities, + /decl/config/toggle/feature_object_spell_system, + /decl/config/toggle/traitor_scaling, + /decl/config/toggle/protect_roles_from_antagonist, + /decl/config/toggle/continuous_rounds, + /decl/config/toggle/allow_extra_antags + ) + +/decl/config/lists/mode_names + uid = "mode_names" + desc = "Mode names." + +/decl/config/lists/mode_allowed + uid = "modes" + desc = "Allowed modes." + +/decl/config/lists/mode_votable + uid = "votable_modes" + desc = "A list of modes that should be votable." + default_value = list() + +/decl/config/lists/mode_votable/Initialize() + default_value = list("secret") + var/list/all_modes = decls_repository.get_decls_of_subtype(/decl/game_mode) + for(var/mode_type in all_modes) + var/decl/game_mode/game_mode = all_modes[mode_type] + if(initial(game_mode.votable)) + default_value += game_mode.uid + default_value = sortTim(default_value, /proc/cmp_text_asc) + return ..() + +/decl/config/lists/mode_votable/set_value(new_value) + . = ..() + LAZYDISTINCTADD(value, "secret") + value = sortTim(value, /proc/cmp_text_asc) + +/decl/config/lists/mode_probabilities + uid = "probabilities" + desc = "Relative probability of each mode." + default_value = list() + +/decl/config/lists/mode_probabilities/Initialize() + var/list/all_modes = decls_repository.get_decls_of_subtype(/decl/game_mode) + for(var/mode_type in all_modes) + var/decl/game_mode/game_mode = all_modes[mode_type] + default_value[game_mode.uid] = initial(game_mode.probability) + return ..() + +/decl/config/lists/mode_probabilities/update_post_value_set() + . = ..() + var/list/all_modes = decls_repository.get_decls_of_subtype(/decl/game_mode) + for(var/mode_type in all_modes) + var/decl/game_mode/game_mode = all_modes[mode_type] + game_mode.probability = max(0, value[game_mode.uid]) + +/decl/config/toggle/feature_object_spell_system + uid = "feature_object_spell_system" + desc = "Spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard." + +/decl/config/toggle/traitor_scaling + uid = "traitor_scaling" + desc = "If amount of traitors scales or not." + +/decl/config/toggle/protect_roles_from_antagonist + uid = "protect_roles_from_antagonist" + desc = "If security is prohibited from being most antagonists." + +/decl/config/toggle/continuous_rounds + uid = "continuous_rounds" + desc = list( + "Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked.", + "Malf and Rev will let the shuttle be called when the antags/protags are dead." + ) + +/decl/config/toggle/antag_hud_allowed + uid = "antag_hud_allowed" + desc = "Allow ghosts to see antagonist through AntagHUD." + +/decl/config/toggle/antag_hud_allowed/update_post_value_set() + . = ..() + if(value) + for(var/mob/observer/ghost/g in get_ghosts()) + if(!g.client.holder) // Add the verb back for all non-admin ghosts + g.verbs += /mob/observer/ghost/verb/toggle_antagHUD + to_chat(g, SPAN_NOTICE("AntagHUD has been enabled!"))// Notify all observers they can now use AntagHUD + else + for(var/mob/observer/ghost/g in get_ghosts()) + if(!g.client.holder) //Remove the verb from non-admin ghosts + g.verbs -= /mob/observer/ghost/verb/toggle_antagHUD + if(g.antagHUD) + g.antagHUD = 0 // Disable it on those that have it enabled + g.has_enabled_antagHUD = 2 // We'll allow them to respawn + to_chat(g, SPAN_DANGER("AntagHUD has been disabled.")) + +/decl/config/toggle/antag_hud_restricted + uid = "antag_hud_restricted" + desc = "If ghosts use antagHUD they are no longer allowed to join the round." + +/decl/config/toggle/secret_hide_possibilities + uid = "secret_hide_possibilities" + desc = "If possible round types will be hidden from players for secret rounds." + +/decl/config/toggle/allow_extra_antags + uid = "allow_extra_antags" + desc = "If uncommented, votes can be called to add extra antags to the round." diff --git a/code/datums/config/config_types/config_protected.dm b/code/datums/config/config_types/config_protected.dm new file mode 100644 index 00000000000..40cfa3bdd0f --- /dev/null +++ b/code/datums/config/config_types/config_protected.dm @@ -0,0 +1,23 @@ +/decl/configuration_category/protected + name = "Protected" + desc = "Configuration options protected from manipulation on-server." + associated_configuration = list( + /decl/config/text/comms_password, + /decl/config/text/ban_comms_password, + /decl/config/text/login_export_addr + ) + +/decl/config/text/comms_password + uid = "comms_password" + protected = TRUE + desc = "Password used for authorizing ircbot and other external tools." + +/decl/config/text/ban_comms_password + uid = "ban_comms_password" + protected = TRUE + desc = "Password used for authorizing external tools that can apply bans." + +/decl/config/text/login_export_addr + uid = "login_export_addr" + protected = TRUE + desc = "Export address where external tools that monitor logins are located." diff --git a/code/datums/config/config_types/config_resources.dm b/code/datums/config/config_types/config_resources.dm new file mode 100644 index 00000000000..b1bfda325f3 --- /dev/null +++ b/code/datums/config/config_types/config_resources.dm @@ -0,0 +1,29 @@ +/decl/configuration_category/resources + name = "Resources" + desc = "Configuration options relating to server resources." + associated_configuration = list( + /decl/config/text/custom_item_icon_location, + /decl/config/text/custom_icon_icon_location, + /decl/config/lists/resource_urls + ) + +/decl/config/text/custom_item_icon_location + uid = "custom_item_icon_location" + default_value = "config/custom_items/icons" + desc = "Set this to a file path relative to the executing binary to prefix all custom item icon locations with this location ie. '\[CUSTOM_ITEM_ICON_LOCATION\]/\[custom item icon path value\]'" + +/decl/config/text/custom_icon_icon_location + uid = "custom_icon_icon_location" + default_value = "config/custom_icons/icons" + desc = "Uncomment this and set it to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '\[CUSTOM_ICON_ICON_LOCATION\]/\[custom icon path value\]'" + +/decl/config/lists/resource_urls + uid = "resource_urls" + desc = list( + "Direct clients to preload the server resource file from a URL pointing to a .rsc file. NOTE: At this time (byond 512),", + "the client/resource_rsc var does not function as one would expect. See client_defines.dm, the 'preload_rsc' var's", + "comments on how to use it properly. If you use a resource URL, you must set preload_rsc to 0 at compile time or", + "clients will still download from the server *too*. This will randomly select one URL if more than one is provided.", + "Spaces are prohibited in each URL by spec, you must use encoded spaces.", + "ex. RESOURCE_URLS URL URL2 URL3" + ) diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm new file mode 100644 index 00000000000..958fbf06070 --- /dev/null +++ b/code/datums/config/config_types/config_server.dm @@ -0,0 +1,365 @@ +/decl/configuration_category/server + name = "Server" + desc = "Configuration options relating to the server itself." + associated_configuration = list( + /decl/config/num/kick_inactive, + /decl/config/num/fps, + /decl/config/num/tick_limit_mc_init, + /decl/config/num/minimum_byond_version, + /decl/config/num/minimum_byond_build, + /decl/config/num/player_limit, + /decl/config/num/respawn_delay, + /decl/config/num/cult_ghostwriter_req_cultists, + /decl/config/num/character_slots, + /decl/config/num/loadout_slots, + /decl/config/num/max_maint_drones, + /decl/config/num/drone_build_time, + /decl/config/num/max_character_aspects, + /decl/config/text/irc_bot_host, + /decl/config/text/main_irc, + /decl/config/text/admin_irc, + /decl/config/text/server_name, + /decl/config/text/server, + /decl/config/text/serverurl, + /decl/config/text/banappeals, + /decl/config/text/wikiurl, + /decl/config/text/forumurl, + /decl/config/text/discordurl, + /decl/config/text/githuburl, + /decl/config/text/issuereporturl, + /decl/config/text/hosted_by, + /decl/config/toggle/panic_bunker, + /decl/config/text/panic_bunker_message, + /decl/config/toggle/do_not_prevent_spam, + /decl/config/toggle/no_throttle_localhost, + /decl/config/toggle/on/abandon_allowed, + /decl/config/toggle/on/ooc_allowed, + /decl/config/toggle/on/looc_allowed, + /decl/config/toggle/on/dooc_allowed, + /decl/config/toggle/on/dsay_allowed, + /decl/config/toggle/on/aooc_allowed, + /decl/config/toggle/on/enter_allowed, + /decl/config/toggle/on/allow_ai, + /decl/config/toggle/on/allow_drone_spawn, + /decl/config/toggle/hub_visibility, + /decl/config/toggle/usewhitelist, + /decl/config/toggle/load_jobs_from_txt, + /decl/config/toggle/disable_player_mice, + /decl/config/toggle/uneducated_mice, + /decl/config/toggle/use_alien_whitelist, + /decl/config/toggle/use_alien_whitelist_sql, + /decl/config/toggle/forbid_singulo_possession, + /decl/config/toggle/use_loyalty_implants, + /decl/config/toggle/no_click_cooldown, + /decl/config/toggle/disable_webhook_embeds, + /decl/config/toggle/delist_when_no_admins, + /decl/config/toggle/wait_for_sigusr1_reboot, + /decl/config/toggle/use_irc_bot, + /decl/config/toggle/show_typing_indicator_for_whispers, + /decl/config/toggle/announce_shuttle_dock_to_irc, + /decl/config/toggle/guests_allowed, + /decl/config/toggle/on/jobs_have_minimal_access, + /decl/config/toggle/on/admin_legacy_system, + /decl/config/toggle/on/ban_legacy_system + ) + +/decl/config/num/kick_inactive + uid = "kick_inactive" + desc = "Disconnect players who did nothing during the set amount of minutes." + +/decl/config/num/fps + uid = "fps" + default_value = 20 + desc = list( + "Defines world FPS. Defaults to 20.", + "Can also accept ticklag values (0.9, 0.5, etc) which will automatically be converted to FPS." + ) + +/decl/config/num/fps/sanitize_value() + ..() + if(value <= 0) + value = default_value + +/decl/config/num/fps/set_value(new_value) + // Handle ticklag-formatted FPS (0.7 etc) + if(new_value > 0 && new_value < 1) + new_value = round(10 / new_value) + return ..(new_value) + +/decl/config/num/fps/update_post_value_set() + world.fps = value + . = ..() + +/decl/config/num/tick_limit_mc_init + uid = "tick_limit_mc_init" + desc = "SSinitialization throttling." + default_value = TICK_LIMIT_MC_INIT_DEFAULT + +/decl/config/num/minimum_byond_version + uid = "minimum_byond_version" + default_value = 0 + desc = "Clients will be unable to connect unless their version is equal to or higher than this (a number, e.g. 511)." + +/decl/config/num/minimum_byond_build + uid = "minimum_byond_build" + default_value = 0 + desc = "Clients will be unable to connect unless their build is equal to or higher than this (a number, e.g. 1000)." + +/decl/config/num/player_limit + uid = "player_limit" + desc = "The maximum number of non-admin players online." + default_value = 0 + +/decl/config/num/use_age_restriction_for_jobs + uid = "use_age_restriction_for_jobs" + default_value = 0 + desc = list( + "Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing", + "the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job.", + "REQUIRES the database set up to work. Keep it hashed if you don't have a database set up.", + "NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means", + "you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days." + ) + +/decl/config/num/use_age_restriction_for_antags + uid = "use_age_restriction_for_antags" + desc = list( + "Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection.", + "Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS." + ) + +/decl/config/num/respawn_delay + uid = "respawn_delay" + default_value = 30 + min_value = 0 + desc = "Respawn delay in minutes before one may respawn as a crew member." + +/decl/config/num/cult_ghostwriter_req_cultists + uid = "cult_ghostwriter_req_cultists" + default_value = 10 + desc = "Sets the minimum number of cultists needed for ghosts to write in blood." + +/decl/config/num/character_slots + uid = "character_slots" + default_value = 10 + desc = "Sets the number of available character slots." + +/decl/config/num/loadout_slots + uid = "loadout_slots" + default_value = 3 + desc = "Sets the number of loadout slots per character." + +/decl/config/num/max_maint_drones + uid = "max_maint_drones" + desc = "This many drones can be active at the same time." + default_value = 5 + +/decl/config/num/drone_build_time + uid = "drone_build_time" + desc = "A drone will become available every X ticks since last drone spawn. Default is 2 minutes." + default_value = 1200 + +/decl/config/num/max_character_aspects + uid = "max_character_aspects" + default_value = 5 + desc = "Remove the # to define a different cap for aspect points in chargen." + +/decl/config/text/irc_bot_host + uid = "irc_bot_host" + default_value = "localhost" + desc = "Host where the IRC bot is hosted. Port 45678 needs to be open." + +/decl/config/text/main_irc + uid = "main_irc" + default_value = "#main" + desc = "IRC channel to send information to. Leave blank to disable." + +/decl/config/text/admin_irc + uid = "admin_irc" + desc = "IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc." + +// server name (for world name / status) +/decl/config/text/server_name + uid = "server_name" + desc = "Server name: This appears at the top of the screen in-game." + default_value = "Nebula 13" + +/decl/config/text/server + uid = "server" + desc = "Set a server location for world reboot. Don't include the byond://, just give the address and port." + +/decl/config/text/serverurl + uid = "serverurl" + desc = list( + "Set a server URL for the IRC bot to use; like SERVER, don't include the byond://", + "Unlike SERVER, this one shouldn't break auto-reconnect." + ) + +/decl/config/text/banappeals + uid = "banappeals" + desc = "Ban appeals URL - usually for a forum or wherever people should go to contact your admins." + +/decl/config/text/wikiurl + uid = "wikiurl" + desc = "Wiki address." + +/decl/config/text/forumurl + uid = "forumurl" + desc = "Discussion forum address." + +/decl/config/text/discordurl + uid = "discordurl" + desc = "Discord server permanent invite address." + +/decl/config/text/githuburl + uid = "githuburl" + desc = "GitHub address." + +/decl/config/text/issuereporturl + uid = "issuereporturl" + desc = "GitHub new issue address." + +/decl/config/text/hosted_by + uid = "hostedby" + desc = "Set a hosted by name for UNIX platforms." + +/decl/config/toggle/panic_bunker + uid = "panic_bunker" + desc = "Is the panic bunker currently on by default?" + +/decl/config/text/panic_bunker_message + uid = "panic_bunker_message" + default_value = "Sorry! The panic bunker is enabled. Please head to our Discord or forum to get yourself added to the panic bunker bypass." + desc = "A message when user did not pass the panic bunker." + +/decl/config/toggle/do_not_prevent_spam + uid = "do_not_prevent_spam" + desc = "Uncomment this to DISABLE action spam kicking. Not recommended; this helps protect from spam attacks." + +/decl/config/toggle/no_throttle_localhost + uid = "no_throttle_localhost" + desc = list( + "Whether or not to make localhost immune to throttling.", + "Localhost will still be throttled internally; it just won't be affected by it." + ) + +/decl/config/toggle/on/abandon_allowed + uid = "abandon_allowed" + desc = "Comment to disable respawning by default." + +/decl/config/toggle/on/ooc_allowed + uid = "ooc_allowed" + desc = "Comment to disable the OOC channel by default." + +/decl/config/toggle/on/looc_allowed + uid = "looc_allowed" + desc = "Comment to disable the LOOC channel by default." + +/decl/config/toggle/on/dooc_allowed + uid = "dooc_allowed" + desc = "Comment to disable the dead OOC channel by default." + +/decl/config/toggle/on/dsay_allowed + uid = "dsay_allowed" + desc = "Comment to disable ghost chat by default." + +/decl/config/toggle/on/aooc_allowed + uid = "aooc_allowed" + desc = "Comment to disable the AOOC channel by default." + +/decl/config/toggle/on/enter_allowed + uid = "enter_allowed" + desc = "Comment to prevent anyone from joining the round by default." + +/decl/config/toggle/on/allow_ai + uid = "allow_ai" + desc = "Allow AI job." + +/decl/config/toggle/on/allow_drone_spawn + uid = "allow_drone_spawn" + desc = "Allow ghosts to join as maintenance drones." + +/decl/config/toggle/hub_visibility + uid = "hub_visibility" + desc = "Hub visibility: If you want to be visible on the hub, uncomment the below line and be sure that Dream Daemon is set to visible. This can be changed in-round as well with toggle-hub-visibility if Dream Daemon is set correctly." + +/decl/config/toggle/hub_visibility/update_post_value_set() + . = ..() + world.update_hub_visibility() + +/decl/config/toggle/usewhitelist + uid = "usewhitelist" + desc = list( + "Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions.", + "Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans)." + ) + +/decl/config/toggle/load_jobs_from_txt + uid = "load_jobs_from_txt" + desc = "Toggle for having jobs load up from the .txt" + +/decl/config/toggle/disable_player_mice + uid = "disable_player_mice" + +/decl/config/toggle/uneducated_mice + uid = "uneducated_mice" + desc = "Set to 1 to prevent newly-spawned mice from understanding human speech." + +/decl/config/toggle/use_alien_whitelist + uid = "usealienwhitelist" + desc = "Uncomment to restrict non-admins from using humanoid alien races." + +/decl/config/toggle/use_alien_whitelist_sql + uid = "usealienwhitelist_sql" + desc = "Uncomment to use the alien whitelist system with SQL instead. (requires the above uncommented as well)." + +/decl/config/toggle/forbid_singulo_possession + uid = "forbid_singulo_possession" + desc = "Remove the # mark infront of this to forbid admins from posssessing the singularity." + +/decl/config/toggle/use_loyalty_implants + uid = "use_loyalty_implants" + desc = "Remove the # in front of this config option to have loyalty implants spawn by default on your server." + +/decl/config/toggle/no_click_cooldown + uid = "no_click_cooldown" + +/decl/config/toggle/disable_webhook_embeds + uid = "disable_webhook_embeds" + desc = "Uncomment to make Discord webhooks send in plaintext rather than as embeds." + +/decl/config/toggle/delist_when_no_admins + uid = "delist_when_no_admins" + desc = "Uncomment this to remove the server from the hub." + +/decl/config/toggle/wait_for_sigusr1_reboot + uid = "wait_for_sigusr1_reboot" + desc = "Uncomment to make Dream Daemon refuse to reboot for any reason other than SIGUSR1." + +/decl/config/toggle/use_irc_bot + uid = "use_irc_bot" + desc = "Uncomment to enable sending data to the IRC bot." + +/decl/config/toggle/show_typing_indicator_for_whispers + uid = "show_typing_indicator_for_whispers" + desc = "Uncomment this to show a typing indicator for people writing whispers." + +/decl/config/toggle/announce_shuttle_dock_to_irc + uid = "announce_shuttle_dock_to_irc" + desc = "Uncomment this line to announce shuttle dock announcements to the main IRC channel, if MAIN_IRC has also been setup." + +/decl/config/toggle/guests_allowed + uid = "guests_allowed" + desc = "Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting)." + +/decl/config/toggle/on/ban_legacy_system + uid = "ban_legacy_system" + desc = "Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system." + +/decl/config/toggle/on/admin_legacy_system + uid = "admin_legacy_system" + desc = "Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system." + +/decl/config/toggle/on/jobs_have_minimal_access + uid = "jobs_have_minimal_access" + desc = "Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments." diff --git a/code/datums/config/config_types/config_voting.dm b/code/datums/config/config_types/config_voting.dm new file mode 100644 index 00000000000..32f59f4cee2 --- /dev/null +++ b/code/datums/config/config_types/config_voting.dm @@ -0,0 +1,79 @@ +/decl/configuration_category/voting + name = "Voting" + desc = "Configuration options relating to votes at runtime." + associated_configuration = list( + /decl/config/num/vote_delay, + /decl/config/num/vote_period, + /decl/config/num/vote_autotransfer_initial, + /decl/config/num/vote_autotransfer_interval, + /decl/config/num/vote_autogamemode_timeleft, + /decl/config/num/vote_no_default, + /decl/config/num/vote_no_dead, + /decl/config/num/vote_no_dead_crew_transfer, + /decl/config/toggle/vote_restart, + /decl/config/toggle/vote_mode, + /decl/config/toggle/allow_map_switching, + /decl/config/toggle/auto_map_vote + ) + +/decl/config/num/vote_delay + uid = "vote_delay" + default_value = 6000 + desc = "Min delay (deciseconds) between voting sessions (default 10 minutes)." + +/decl/config/num/vote_period + uid = "vote_period" + default_value = 600 + desc = "Time period (deciseconds) which voting session will last (default 1 minute)." + +/decl/config/num/vote_autotransfer_initial + uid = "vote_autotransfer_initial" + default_value = 108000 + desc = "Autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes)." + +/decl/config/num/vote_autotransfer_interval + uid = "vote_autotransfer_interval" + default_value = 18000 + desc = "Autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes)." + +/decl/config/num/vote_autogamemode_timeleft + uid = "vote_autogamemode_timeleft" + default_value = 100 + desc = "Time left (seconds) before round start when automatic gamemote vote is called (default 160)." + +/decl/config/num/vote_no_default + uid = "vote_no_default" + default_value = FALSE + config_flags = CONFIG_FLAG_BOOL | CONFIG_FLAG_HAS_VALUE + desc = "Players' votes default to 'No vote' (otherwise, default to 'No change')." + +/decl/config/num/vote_no_dead + uid = "vote_no_dead" + default_value = FALSE + config_flags = CONFIG_FLAG_BOOL | CONFIG_FLAG_HAS_VALUE + desc = "Prevents dead players from voting or starting votes." + +/decl/config/num/vote_no_dead_crew_transfer + uid = "vote_no_dead_crew_transfer" + default_value = FALSE + config_flags = CONFIG_FLAG_BOOL | CONFIG_FLAG_HAS_VALUE + desc = "Prevents players not in-round from voting on crew transfer votes." + +/decl/config/toggle/vote_restart + uid = "allow_vote_restart" + desc = "Allow players to initiate a restart vote." + +/decl/config/toggle/vote_mode + uid = "allow_vote_mode" + desc = "Allow players to initate a mode-change start." + +/decl/config/toggle/allow_map_switching + uid = "allow_map_switching" + desc = list( + "Uncomment to enable map voting; you'll need to use the script at tools/server.sh or an equivalent for it to take effect.", + "You'll also likely need to enable WAIT_FOR_SIGUSR1 below." + ) + +/decl/config/toggle/auto_map_vote + uid = "auto_map_vote" + desc = "Uncomment to enable an automatic map vote and switch at end of round. MAP_SWITCHING must also be enabled." diff --git a/code/datums/extensions/access_provider.dm b/code/datums/extensions/access_provider.dm index f9f367c070e..845ff159f48 100644 --- a/code/datums/extensions/access_provider.dm +++ b/code/datums/extensions/access_provider.dm @@ -13,6 +13,6 @@ /datum/extension/access_provider/proc/unregister_id(atom/movable/to_unregister) LAZYREMOVE(registered_ids, to_unregister) -/datum/extension/access_provider/proc/GetIdCards() +/datum/extension/access_provider/proc/GetIdCards(list/exceptions) for(var/atom/movable/registered_id in registered_ids) - LAZYDISTINCTADD(., registered_id.GetIdCards()) + LAZYDISTINCTADD(., registered_id.GetIdCards(exceptions)) diff --git a/code/datums/extensions/assembly/assembly_power.dm b/code/datums/extensions/assembly/assembly_power.dm index 55b32b40127..f336f079f92 100644 --- a/code/datums/extensions/assembly/assembly_power.dm +++ b/code/datums/extensions/assembly/assembly_power.dm @@ -10,7 +10,8 @@ /datum/extension/assembly/proc/battery_power(var/power_usage = 0) apc_powered = FALSE for(var/obj/item/stock_parts/computer/battery_module/battery_module in parts) - if(battery_module.check_functionality() && battery_module.battery.checked_use(power_usage * CELLRATE)) + var/obj/item/cell/battery = battery_module.get_cell() + if(battery_module.check_functionality() && battery?.checked_use(power_usage * CELLRATE)) return TRUE // Tries to use power from APC, if present. @@ -32,9 +33,10 @@ // At this point, we know that APC can power us for this tick. Check if we also need to charge our battery, and then actually use the power. for(var/obj/item/stock_parts/computer/battery_module/battery_module in parts) - if(battery_module.check_functionality() && (battery_module.battery.charge < battery_module.battery.maxcharge) && power_usage > 0) + var/obj/item/cell/battery = battery_module.get_cell() + if(battery_module.check_functionality() && battery && (battery.charge < battery.maxcharge) && power_usage > 0) power_usage += tesla_link.passive_charging_rate - battery_module.battery.give(tesla_link.passive_charging_rate * CELLRATE) + battery.give(tesla_link.passive_charging_rate * CELLRATE) A.use_power_oneoff(power_usage, EQUIP) return TRUE @@ -50,7 +52,7 @@ /datum/extension/assembly/proc/handle_power() last_power_usage = calculate_power_usage() - // First tries to charge from an APC, if APC is unavailable switches to battery power. + // First tries to charge from an APC, if APC is unavailable switches to battery power. // If neither works the computer fails. if(apc_power(last_power_usage)) return if(battery_power(last_power_usage)) return diff --git a/code/datums/extensions/cell/cell.dm b/code/datums/extensions/cell/cell.dm new file mode 100644 index 00000000000..57065b58507 --- /dev/null +++ b/code/datums/extensions/cell/cell.dm @@ -0,0 +1,166 @@ +/datum/extension/loaded_cell + expected_type = /obj/item + base_type = /datum/extension/loaded_cell + VAR_PRIVATE/weakref/loaded_cell_ref + var/load_sound = 'sound/weapons/guns/interaction/energy_magin.ogg' + var/unload_sound = 'sound/weapons/guns/interaction/smg_magout.ogg' + var/requires_tool + var/expected_cell_type = /obj/item/cell/device + var/load_delay = 1 SECOND + var/unload_delay + var/can_modify = TRUE + +/datum/extension/loaded_cell/New(datum/holder, _expected_cell_type, _create_cell_type, _override_cell_capacity) + ..(holder) + if(ispath(_expected_cell_type)) + if(!ispath(_expected_cell_type, /obj/item/cell)) + PRINT_STACK_TRACE("Non-cell type supplied to [type] as expected cell type.") + expected_cell_type = _expected_cell_type + if(ispath(_create_cell_type)) + if(!ispath(_expected_cell_type, expected_cell_type)) + PRINT_STACK_TRACE("Non-expected type supplied to [type] as premade cell type.") + loaded_cell_ref = weakref(new _create_cell_type(holder, _override_cell_capacity)) + +/datum/extension/loaded_cell/Destroy() + var/obj/item/cell/existing_cell = loaded_cell_ref?.resolve() + if(istype(existing_cell) && !QDELETED(existing_cell) && existing_cell.loc == holder) + qdel(existing_cell) + return ..() + +/datum/extension/loaded_cell/proc/get_cell() + var/obj/item/cell/cell = loaded_cell_ref?.resolve() + if(istype(cell) && !QDELETED(cell) && cell.loc == holder) + return cell + +/datum/extension/loaded_cell/proc/has_tool_unload_interaction(var/obj/item/tool) + return requires_tool && IS_TOOL(tool, requires_tool) + +/datum/extension/loaded_cell/proc/try_load(var/mob/user, var/obj/item/cell/cell) + + // Check inputs. + var/obj/item/holder_item = holder + if(!istype(cell) || !istype(user) || QDELETED(cell) || QDELETED(user) || user.incapacitated()) + return FALSE + + if(!can_modify) + to_chat(user, SPAN_WARNING("\The [holder] power supply cannot be replaced.")) + return TRUE + + // Check type. + if(!istype(cell, expected_cell_type)) + var/obj/item/expected_cell = expected_cell_type + to_chat(user, SPAN_WARNING("\The [holder] will only accept \a [initial(expected_cell.name)].")) + return TRUE // technically a valid interaction. + + // Check existing cell ref. + var/obj/item/cell/existing_cell = loaded_cell_ref?.resolve() + if(istype(existing_cell) && !QDELETED(existing_cell) && existing_cell.loc == holder) + to_chat(user, SPAN_WARNING("\The [holder] already has \a [existing_cell] loaded.")) + return TRUE // technically a valid interaction. + + // Apply delays. + if(load_delay && !do_after(user, load_delay, holder)) + return FALSE + + // Recheck existing cell ref. + if(!istype(cell) || !istype(user) || QDELETED(cell) || QDELETED(user) || user.incapacitated()) + return FALSE + // Recheck existing cell ref. + existing_cell = loaded_cell_ref?.resolve() + if(istype(existing_cell) && !QDELETED(existing_cell) && existing_cell.loc == holder) + to_chat(user, SPAN_WARNING("\The [holder] already has \a [existing_cell] loaded.")) + return TRUE // technically a valid interaction. + + // Load the cell. + if(user.try_unequip(cell, holder, FALSE)) + user.visible_message(SPAN_NOTICE("\The [user] slots \the [cell] into \the [holder].")) + loaded_cell_ref = weakref(cell) + if(load_sound) + playsound(user.loc, pick(load_sound), 25, 1) + holder_item.update_icon() + return TRUE + return FALSE + +/datum/extension/loaded_cell/proc/try_unload(var/mob/user, var/obj/item/tool) + + // Check inputs. + var/obj/item/holder_item = holder + if(!istype(user) || QDELETED(user) || user.incapacitated()) + return FALSE + + if(!can_modify) + if(tool) + to_chat(user, SPAN_WARNING("\The [holder]'s power supply cannot be removed.")) + return TRUE // Tool interactions should get a warning, inhand interactions should just default to regular attack_hand. + return FALSE + + // Check existing cell. + var/obj/item/cell/existing_cell = loaded_cell_ref?.resolve() + if(!istype(existing_cell) || QDELETED(existing_cell) || existing_cell.loc != holder) + to_chat(user, SPAN_WARNING("\The [holder] has no cell loaded.")) + if(loaded_cell_ref) + loaded_cell_ref = null + holder_item.update_icon() + return TRUE // technically a valid interaction. + + // Apply tool checks. + if(requires_tool) + // No tool provided means we're probably using an empty hand - don't print a warning if it's a tool based removal. + if(!istype(tool) || QDELETED(tool)) + return FALSE + if(!IS_TOOL(tool, requires_tool)) + var/decl/tool_archetype/tool_arch = GET_DECL(requires_tool) + to_chat(user, SPAN_WARNING("\The [holder] requires \a [tool_arch.name] to remove the cell.")) + return TRUE // technically a valid interaction. + if(unload_delay && !tool.do_tool_interaction(requires_tool, user, holder, unload_delay)) + return FALSE + else if(istype(tool)) + return FALSE + // Apply general delay. + else if(unload_delay && !do_after(user, unload_delay, holder)) + return FALSE + + // Recheck inputs. + if(!istype(user) || QDELETED(user) || user.incapacitated()) + return FALSE + // Recheck existing cell. + existing_cell = loaded_cell_ref?.resolve() + if(!istype(existing_cell) || QDELETED(existing_cell) || existing_cell.loc != holder) + to_chat(user, SPAN_WARNING("\The [holder] has no cell loaded.")) + if(loaded_cell_ref) + loaded_cell_ref = null + holder_item.update_icon() + return TRUE // technically a valid interaction. + + // Unload the cell. + user.visible_message( + SPAN_NOTICE("\The [user] removes \the [existing_cell] from \the [holder]."), + SPAN_NOTICE("You remove \the [existing_cell] from \the [holder].") + ) + existing_cell.dropInto(get_turf(holder)) + user.put_in_active_hand(existing_cell) + holder_item.update_icon() + if(unload_sound) + playsound(user.loc, pick(unload_sound), 25, TRUE) + return TRUE + +/datum/extension/loaded_cell/proc/get_examine_text(var/obj/item/cell/current_cell) + . = list() + if(current_cell) + . += SPAN_NOTICE("\The [holder] has \a [current_cell] installed.") + . += SPAN_NOTICE("\The [holder] is [round(current_cell.percent())]% charged.") + if(can_modify) + if(requires_tool) + var/decl/tool_archetype/needed_tool = GET_DECL(requires_tool) + . += SPAN_NOTICE("\The [holder] power supply requires \a [needed_tool.name] to remove.") + else + . += SPAN_NOTICE("Hold \the [holder] in an off-hand and click it with an empty hand to remove the power supply.") + else + . += SPAN_NOTICE("\The [holder] power supply cannot be removed.") + else + var/obj/item/cell = expected_cell_type + . += SPAN_WARNING("\The [holder] has no power source installed.") + if(can_modify) + . += SPAN_NOTICE("\The [holder] is compatible with \a [initial(cell.name)].") + else + . += SPAN_NOTICE("\The [holder] power supply cannot be replaced.") diff --git a/code/datums/extensions/cell/cell_panel.dm b/code/datums/extensions/cell/cell_panel.dm new file mode 100644 index 00000000000..184c1f7e2df --- /dev/null +++ b/code/datums/extensions/cell/cell_panel.dm @@ -0,0 +1,20 @@ +/datum/extension/loaded_cell/panel + var/panel_open = FALSE + +// We hook the try_unload() proc to do our panel opening and closing. +/datum/extension/loaded_cell/panel/has_tool_unload_interaction(var/obj/item/tool) + return IS_TOOL(tool, TOOL_SCREWDRIVER) + +/datum/extension/loaded_cell/panel/try_unload(var/mob/user, var/obj/item/tool) + if(!istype(user) || QDELETED(user) || user.incapacitated()) + return FALSE + if(tool) + panel_open = !panel_open + to_chat(user, SPAN_NOTICE("You [panel_open ? "open" : "close"] \the [holder]'s battery compartment.")) + var/obj/item/holder_item = holder + holder_item.update_icon() + return TRUE + return panel_open && ..() + +/datum/extension/loaded_cell/panel/get_examine_text() + . = ..() + SPAN_NOTICE("\The [holder]'s battery compartment is [panel_open ? "open" : "closed"]. Use a screwdriver to [panel_open ? "close" : "open"] it.") diff --git a/code/datums/extensions/cell/cell_secured.dm b/code/datums/extensions/cell/cell_secured.dm new file mode 100644 index 00000000000..5a5e8cf55c1 --- /dev/null +++ b/code/datums/extensions/cell/cell_secured.dm @@ -0,0 +1,4 @@ +// Must be removed with a screwdriver. +/datum/extension/loaded_cell/secured + requires_tool = TOOL_SCREWDRIVER + unload_delay = 1 SECOND diff --git a/code/datums/extensions/cell/cell_unremovable.dm b/code/datums/extensions/cell/cell_unremovable.dm new file mode 100644 index 00000000000..892a8cf5b16 --- /dev/null +++ b/code/datums/extensions/cell/cell_unremovable.dm @@ -0,0 +1,3 @@ +// Cannot be removed or replaced. +/datum/extension/loaded_cell/unremovable + can_modify = FALSE diff --git a/code/datums/extensions/deity_be_near.dm b/code/datums/extensions/deity_be_near.dm index fa8f07b6a46..06d3616710d 100644 --- a/code/datums/extensions/deity_be_near.dm +++ b/code/datums/extensions/deity_be_near.dm @@ -9,9 +9,9 @@ /datum/extension/deity_be_near/New(var/datum/holder, var/mob/living/deity/connect) ..() - events_repository.register(/decl/observ/moved, holder,src, .proc/check_movement) + events_repository.register(/decl/observ/moved, holder,src, PROC_REF(check_movement)) connected_deity = connect - events_repository.register(/decl/observ/destroyed, holder, src, .proc/dead_deity) + events_repository.register(/decl/observ/destroyed, holder, src, PROC_REF(dead_deity)) var/obj/O = holder O.desc += "
This item deals damage to its wielder the [keep_away_instead ? "closer" : "farther"] it is from a deity structure" diff --git a/code/datums/extensions/event_registration.dm b/code/datums/extensions/event_registration.dm index 4daa92636e3..b483bd79a25 100644 --- a/code/datums/extensions/event_registration.dm +++ b/code/datums/extensions/event_registration.dm @@ -10,8 +10,8 @@ /datum/extension/event_registration/New(datum/holder, decl/observ/event, datum/target, callproc) ..() - event.register(target, src, .proc/trigger) - events_repository.register(/decl/observ/destroyed, target, src, .proc/qdel_self) + event.register(target, src, PROC_REF(trigger)) + events_repository.register(/decl/observ/destroyed, target, src, PROC_REF(qdel_self)) src.event = event src.target = target src.callproc = callproc @@ -36,15 +36,15 @@ ..() src.given_area = given_area register_shuttles() - events_repository.register_global(/decl/observ/shuttle_added, src, .proc/shuttle_added) + events_repository.register_global(/decl/observ/shuttle_added, src, PROC_REF(shuttle_added)) /datum/extension/event_registration/shuttle_stationary/proc/register_shuttles() if(given_area in SSshuttle.shuttle_areas) for(var/shuttle_name in SSshuttle.shuttles) var/datum/shuttle/shuttle_datum = SSshuttle.shuttles[shuttle_name] if(given_area in shuttle_datum.shuttle_area) - events_repository.register(/decl/observ/shuttle_moved, shuttle_datum, src, .proc/shuttle_moved) - events_repository.register(/decl/observ/shuttle_pre_move, shuttle_datum, src, .proc/shuttle_pre_move) + events_repository.register(/decl/observ/shuttle_moved, shuttle_datum, src, PROC_REF(shuttle_moved)) + events_repository.register(/decl/observ/shuttle_pre_move, shuttle_datum, src, PROC_REF(shuttle_pre_move)) LAZYADD(shuttles_registered, shuttle_datum) /datum/extension/event_registration/shuttle_stationary/proc/unregister_shuttles() @@ -55,8 +55,8 @@ /datum/extension/event_registration/shuttle_stationary/proc/shuttle_added(datum/shuttle/shuttle) if(given_area in shuttle.shuttle_area) - events_repository.register(/decl/observ/shuttle_moved, shuttle, src, .proc/shuttle_moved) - events_repository.register(/decl/observ/shuttle_pre_move, shuttle, src, .proc/shuttle_pre_move) + events_repository.register(/decl/observ/shuttle_moved, shuttle, src, PROC_REF(shuttle_moved)) + events_repository.register(/decl/observ/shuttle_pre_move, shuttle, src, PROC_REF(shuttle_pre_move)) LAZYADD(shuttles_registered, shuttle) /datum/extension/event_registration/shuttle_stationary/Destroy() diff --git a/code/datums/extensions/eye/_eye.dm b/code/datums/extensions/eye/_eye.dm index 59fc3d66404..1676604607b 100644 --- a/code/datums/extensions/eye/_eye.dm +++ b/code/datums/extensions/eye/_eye.dm @@ -21,7 +21,7 @@ /datum/extension/eye/proc/look(var/mob/new_looker, var/list/eye_args) if(new_looker.eyeobj || current_looker) return FALSE - + LAZYINSERT(eye_args, get_turf(new_looker), 1) // Make sure that a loc is provided to the eye. if(!extension_eye) @@ -43,29 +43,29 @@ unlook_action.Grant(current_looker) // Checks for removing the user from the eye outside of unlook actions. - events_repository.register(/decl/observ/moved, holder, src, /datum/extension/eye/proc/unlook) - events_repository.register(/decl/observ/moved, current_looker, src, /datum/extension/eye/proc/unlook) + events_repository.register(/decl/observ/moved, holder, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + events_repository.register(/decl/observ/moved, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) - events_repository.register(/decl/observ/destroyed, current_looker, src, /datum/extension/eye/proc/unlook) - events_repository.register(/decl/observ/destroyed, extension_eye, src, /datum/extension/eye/proc/unlook) + events_repository.register(/decl/observ/destroyed, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + events_repository.register(/decl/observ/destroyed, extension_eye, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) if(isliving(current_looker)) - events_repository.register(/decl/observ/stat_set, current_looker, src, /datum/extension/eye/proc/unlook) - events_repository.register(/decl/observ/logged_out, current_looker, src, /datum/extension/eye/proc/unlook) + events_repository.register(/decl/observ/stat_set, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + events_repository.register(/decl/observ/logged_out, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) return TRUE /datum/extension/eye/proc/unlook() - events_repository.unregister(/decl/observ/moved, holder, src, /datum/extension/eye/proc/unlook) - events_repository.unregister(/decl/observ/moved, current_looker, src, /datum/extension/eye/proc/unlook) - - events_repository.unregister(/decl/observ/destroyed, current_looker, src, /datum/extension/eye/proc/unlook) - events_repository.unregister(/decl/observ/destroyed, extension_eye, src, /datum/extension/eye/proc/unlook) + events_repository.unregister(/decl/observ/moved, holder, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + events_repository.unregister(/decl/observ/moved, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + + events_repository.unregister(/decl/observ/destroyed, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + events_repository.unregister(/decl/observ/destroyed, extension_eye, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) if(isliving(current_looker)) - events_repository.unregister(/decl/observ/stat_set, current_looker, src, /datum/extension/eye/proc/unlook) - events_repository.unregister(/decl/observ/logged_out, current_looker, src, /datum/extension/eye/proc/unlook) + events_repository.unregister(/decl/observ/stat_set, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) + events_repository.unregister(/decl/observ/logged_out, current_looker, src, TYPE_PROC_REF(/datum/extension/eye, unlook)) QDEL_NULL(extension_eye) diff --git a/code/datums/extensions/hattable.dm b/code/datums/extensions/hattable.dm deleted file mode 100644 index a12f3fc2916..00000000000 --- a/code/datums/extensions/hattable.dm +++ /dev/null @@ -1,65 +0,0 @@ -// Note that humans handle hats on their own without this extension. -// This is primarily for diona nymphs and maintenance drones. -/datum/extension/hattable - base_type = /datum/extension/hattable - flags = EXTENSION_FLAG_IMMEDIATE - var/list/offsets - var/obj/item/hat - -/datum/extension/hattable/New(var/datum/holder, var/new_offsets) - offsets = islist(new_offsets) ? new_offsets : list(0, 0) - ..() - -/datum/extension/hattable/proc/wear_hat(var/mob/wearer, var/obj/item/clothing/head/new_hat) - if(hat || !istype(new_hat)) - return FALSE - hat = new_hat - hat.forceMove(wearer) - hat.equipped(wearer) - wearer.update_icon() - return TRUE - -/datum/extension/hattable/proc/get_hat_overlay(var/mob/wearer, var/apply_offsets = TRUE) - var/image/I = hat?.get_mob_overlay(wearer, slot_head_str) - if(I && apply_offsets) - I.pixel_x += offsets[1] - I.pixel_y += offsets[2] - return I - -/datum/extension/hattable/proc/drop_hat(var/mob/wearer) - if((hat in wearer) && !QDELETED(hat)) - wearer.remove_from_mob(hat) - hat = null - wearer.update_icon() - -var/global/list/mob_hat_cache = list() -/datum/extension/hattable/directional/proc/offset_image(var/image/I) - - if(!istype(I)) - return - - var/mob/owner = holder - if(!istype(owner)) - return I - - var/cache_key = "[I.icon]-[I.icon_state]-[json_encode(offsets)]-[owner.icon]" - if(!global.mob_hat_cache[cache_key]) - var/icon/final = icon(owner.icon, "template") // whoever makes a mob hattable should also check it has a template state in its image - for(var/dir in offsets) - var/list/facing_list = offsets[dir] - var/icon/canvas = icon(owner.icon, "template") - var/use_dir = text2num(dir) - canvas.Blend(icon(I.icon, I.icon_state, dir = use_dir), ICON_OVERLAY, facing_list[1]+1, facing_list[2]+1) - final.Insert(canvas, dir = use_dir) - global.mob_hat_cache[cache_key] = final - - I.icon = global.mob_hat_cache[cache_key] - I.icon_state = "" - for(var/thing in I.overlays) - I.overlays -= thing - I.overlays += offset_image(thing) - - return I - -/datum/extension/hattable/directional/get_hat_overlay(var/mob/wearer, var/apply_offsets = TRUE) - return offset_image(..(wearer, FALSE)) diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index 6cfcba37dab..1442577ec67 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -53,14 +53,14 @@ user.visible_message("\The [user] holsters \the [holstered].", "You holster \the [holstered].") atom_holder.SetName("occupied [initial(atom_holder.name)]") atom_holder.update_icon() - events_repository.register(/decl/observ/moved, holstered, src, .proc/check_holster) - events_repository.register(/decl/observ/destroyed, holstered, src, .proc/clear_holster) + events_repository.register(/decl/observ/moved, holstered, src, PROC_REF(check_holster)) + events_repository.register(/decl/observ/destroyed, holstered, src, PROC_REF(clear_holster)) return 1 return 0 /datum/extension/holster/proc/clear_holster() - events_repository.unregister(/decl/observ/moved, holstered, src, .proc/check_holster) - events_repository.unregister(/decl/observ/destroyed, holstered, src, .proc/clear_holster) + events_repository.unregister(/decl/observ/moved, holstered, src, PROC_REF(check_holster)) + events_repository.unregister(/decl/observ/destroyed, holstered, src, PROC_REF(clear_holster)) holstered = null atom_holder.SetName(initial(atom_holder.name)) diff --git a/code/datums/extensions/lockable.dm b/code/datums/extensions/lockable.dm index c929c96b60a..581838e4e0a 100644 --- a/code/datums/extensions/lockable.dm +++ b/code/datums/extensions/lockable.dm @@ -125,7 +125,7 @@ if (prob(user.skill_fail_chance(SKILL_DEVICES, 40, SKILL_EXPERT))) l_setshort = FALSE user.show_message(SPAN_NOTICE("Internal memory reset. Please give it a few seconds to reinitialize."), 1) - addtimer(CALLBACK(src, /datum/extension/lockable/proc/reset_memory), 3 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/extension/lockable, reset_memory)), 3 SECONDS) return TRUE else user.show_message(SPAN_WARNING("Unable to reset internal memory."), 1) diff --git a/code/datums/extensions/multitool/items/clothing.dm b/code/datums/extensions/multitool/items/clothing.dm index c3c3ee6db28..b82e6825dd7 100644 --- a/code/datums/extensions/multitool/items/clothing.dm +++ b/code/datums/extensions/multitool/items/clothing.dm @@ -1,13 +1,18 @@ -/obj/item/clothing/under/Initialize() +/obj/item/clothing/Initialize() . = ..() - set_extension(src, /datum/extension/interactive/multitool/items/clothing) + if(ACCESSORY_SLOT_SENSORS in valid_accessory_slots) + set_extension(src, /datum/extension/interactive/multitool/items/clothing) /datum/extension/interactive/multitool/items/clothing/interact(var/obj/item/multitool/M, var/mob/user) if(extension_status(user) != STATUS_INTERACTIVE) return - var/obj/item/clothing/under/u = holder - if(u.has_sensor == SUIT_NO_SENSORS) - to_chat(user, SPAN_WARNING("\The [u] doesn't have suit sensors.")) + var/obj/item/clothing/uniform = holder + if(!istype(uniform)) + to_chat(user, SPAN_WARNING("\The [user] is not wearing an appropriate uniform.")) return - u.has_sensor = u.has_sensor == SUIT_LOCKED_SENSORS ? SUIT_HAS_SENSORS : SUIT_LOCKED_SENSORS - user.visible_message(SPAN_NOTICE("\The [user] [u.has_sensor == SUIT_LOCKED_SENSORS ? "" : "un"]locks \the [u]'s suit sensor controls."), range = 2) + var/obj/item/clothing/accessory/vitals_sensor/sensor = locate() in uniform.accessories + if(!sensor) + to_chat(user, SPAN_WARNING("\The [uniform] doesn't have a vitals sensors attached.")) + return + sensor.toggle_sensors_locked() + user.visible_message(SPAN_NOTICE("\The [user] [sensor.get_sensors_locked() ? "" : "un"]locks \the [user]'s suit sensor controls."), range = 2) diff --git a/code/datums/extensions/scent/_scent.dm b/code/datums/extensions/scent/_scent.dm index b7ef9d3873d..3b1a52e50ee 100644 --- a/code/datums/extensions/scent/_scent.dm +++ b/code/datums/extensions/scent/_scent.dm @@ -6,7 +6,7 @@ Scent intensity *****/ /decl/scent_intensity - var/cooldown = 5 MINUTES + var/cooldown = 5 MINUTES var/intensity = 1 /decl/scent_intensity/proc/PrintMessage(var/mob/user, var/descriptor, var/scent) @@ -121,18 +121,24 @@ To add a scent extension to an atom using a reagent's info, where R. is the reag *****/ /proc/set_scent_by_reagents(var/atom/smelly_atom) + var/decl/material/smelliest = get_smelliest_reagent(smelly_atom.reagents) + if(smelliest) + set_extension(smelly_atom, /datum/extension/scent/custom, smelliest.scent, smelliest.scent_intensity, smelliest.scent_descriptor, smelliest.scent_range) + +// Returns the smelliest reagent of a reagent holder. +/proc/get_smelliest_reagent(var/datum/reagents/holder) var/decl/material/smelliest var/decl/material/scent_intensity - if(!smelly_atom.reagents || !smelly_atom.reagents.total_volume) + if(!holder || !holder.total_volume) return - for(var/reagent_type in smelly_atom.reagents.reagent_volumes) + for(var/reagent_type in holder.reagent_volumes) var/decl/material/R = GET_DECL(reagent_type) if(!R.scent) continue var/decl/scent_intensity/SI = GET_DECL(R.scent_intensity) - var/r_scent_intensity = REAGENT_VOLUME(smelly_atom.reagents, reagent_type) * SI.intensity + var/r_scent_intensity = REAGENT_VOLUME(holder, reagent_type) * SI.intensity if(r_scent_intensity > scent_intensity) smelliest = R - scent_intensity = r_scent_intensity - if(smelliest) - set_extension(smelly_atom, /datum/extension/scent/custom, smelliest.scent, smelliest.scent_intensity, smelliest.scent_descriptor, smelliest.scent_range) \ No newline at end of file + scent_intensity = r_scent_intensity + + return smelliest \ No newline at end of file diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 5c7561285b1..37e7fb12bea 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -36,8 +36,8 @@ var/global/datum/getrev/revdata = new() to_chat(src, "Client Version: [byond_version]") if(revdata.revision) var/server_revision = revdata.revision - if(config.githuburl) - server_revision = "[server_revision]" + if(get_config_value(/decl/config/text/githuburl)) + server_revision = "[server_revision]" to_chat(src, "Server Revision: [server_revision] - [revdata.branch] - [revdata.date]") else to_chat(src, "Server Revision: Revision Unknown") diff --git a/code/datums/inventory_slots/_inventory_slot.dm b/code/datums/inventory_slots/_inventory_slot.dm index 23a16c3e79e..0a4e0463fa2 100644 --- a/code/datums/inventory_slots/_inventory_slot.dm +++ b/code/datums/inventory_slots/_inventory_slot.dm @@ -18,10 +18,13 @@ var/skip_on_strip_display = FALSE var/requires_slot_flags var/requires_organ_tag + var/quick_equip_priority = 0 // Higher priority means it will be checked first. var/mob_overlay_layer var/alt_mob_overlay_layer + var/use_overlay_fallback_slot = TRUE + /datum/inventory_slot/Destroy(force) _holding = null return ..() @@ -71,13 +74,13 @@ return if(alt_mob_overlay_layer) if(_holding) - user.set_current_mob_overlay((_holding.use_alt_layer ? alt_mob_overlay_layer : mob_overlay_layer), _holding.get_mob_overlay(user, slot_id), FALSE) + user.set_current_mob_overlay((_holding.use_alt_layer ? alt_mob_overlay_layer : mob_overlay_layer), _holding.get_mob_overlay(user, slot_id, use_fallback_if_icon_missing = use_overlay_fallback_slot), FALSE) user.set_current_mob_overlay((_holding.use_alt_layer ? mob_overlay_layer : alt_mob_overlay_layer), null, redraw_mob) else user.set_current_mob_overlay(mob_overlay_layer, null, FALSE) user.set_current_mob_overlay(alt_mob_overlay_layer, null, redraw_mob) else - user.set_current_mob_overlay(mob_overlay_layer, _holding?.get_mob_overlay(user, slot_id), redraw_mob) + user.set_current_mob_overlay(mob_overlay_layer, _holding?.get_mob_overlay(user, slot_id, use_fallback_if_icon_missing = use_overlay_fallback_slot), redraw_mob) /datum/inventory_slot/proc/set_slot(var/obj/item/prop) _holding = prop diff --git a/code/datums/inventory_slots/inventory_gripper.dm b/code/datums/inventory_slots/inventory_gripper.dm index c6513451f5f..df08bcdb02a 100644 --- a/code/datums/inventory_slots/inventory_gripper.dm +++ b/code/datums/inventory_slots/inventory_gripper.dm @@ -2,9 +2,14 @@ var/hand_sort_priority = 1 var/can_use_held_item = TRUE var/dexterity = DEXTERITY_FULL + var/covering_slot_flags + /// If set, use this icon_state for the hand slot overlay; otherwise, use slot_id. + var/hand_overlay + quick_equip_priority = -1 // you quick-equip stuff by holding it in a gripper, so this ought to be dead last + // For reference, grippers do not use ui_loc, they have it set dynamically during /datum/hud/proc/rebuild_hands() -/datum/inventory_slot/gripper/proc/get_dexterity() +/datum/inventory_slot/gripper/proc/get_dexterity(var/silent) return dexterity /datum/inventory_slot/gripper/GetCloneArgs() @@ -26,7 +31,7 @@ return "[pronouns.He] [pronouns.is] holding [_holding.get_examine_line()] in [pronouns.his] [E?.name || lowertext(slot_name)]." /datum/inventory_slot/gripper/can_equip_to_slot(var/mob/user, var/obj/item/prop, var/disable_warning) - return ..() && user.check_dexterity(DEXTERITY_HOLD_ITEM) + return ..() && user.check_dexterity(DEXTERITY_EQUIP_ITEM, silent = disable_warning) // Hand subtypes below /datum/inventory_slot/gripper/mouth @@ -38,6 +43,9 @@ ui_label = "M" hand_sort_priority = 3 +/datum/inventory_slot/gripper/mouth/simple + requires_organ_tag = null + /datum/inventory_slot/gripper/mouth/can_equip_to_slot(mob/user, obj/item/prop, disable_warning, ignore_equipped) . = ..() && prop.w_class <= user.can_pull_size @@ -70,6 +78,7 @@ requires_organ_tag = BP_L_HAND overlay_slot = BP_L_HAND ui_label = "L" + covering_slot_flags = SLOT_HAND_LEFT /datum/inventory_slot/gripper/right_hand slot_name = "Right Hand" @@ -77,3 +86,4 @@ requires_organ_tag = BP_R_HAND overlay_slot = BP_R_HAND ui_label = "R" + covering_slot_flags = SLOT_HAND_RIGHT diff --git a/code/datums/inventory_slots/slots/slot_back.dm b/code/datums/inventory_slots/slots/slot_back.dm index c9963af670e..cc65742561b 100644 --- a/code/datums/inventory_slots/slots/slot_back.dm +++ b/code/datums/inventory_slots/slots/slot_back.dm @@ -6,6 +6,11 @@ requires_organ_tag = BP_CHEST requires_slot_flags = SLOT_BACK mob_overlay_layer = HO_BACK_LAYER + quick_equip_priority = 14 + +/datum/inventory_slot/back/simple + requires_organ_tag = null + use_overlay_fallback_slot = FALSE /datum/inventory_slot/back/get_examined_string(mob/owner, mob/user, distance, hideflags, decl/pronouns/pronouns) if(_holding) diff --git a/code/datums/inventory_slots/slots/slot_belt.dm b/code/datums/inventory_slots/slots/slot_belt.dm index 6eb7629e282..c2521798b6c 100644 --- a/code/datums/inventory_slots/slots/slot_belt.dm +++ b/code/datums/inventory_slots/slots/slot_belt.dm @@ -7,17 +7,21 @@ requires_slot_flags = SLOT_LOWER_BODY mob_overlay_layer = HO_BELT_LAYER alt_mob_overlay_layer = HO_BELT_LAYER_ALT + quick_equip_priority = 4 /datum/inventory_slot/belt/can_equip_to_slot(var/mob/user, var/obj/item/prop, var/disable_warning, var/ignore_equipped) . = ..() if(.) - // If they have a uniform slot, they need a uniform to wear a belt. + // Things with this flag can be worn on the belt slot without a uniform. + if(prop.item_flags & ITEM_FLAG_IS_BELT) + return TRUE + // Otherwise, if they have a uniform slot, they need a uniform to wear a belt. var/datum/inventory_slot/check_slot = user.get_inventory_slot_datum(slot_w_uniform_str) - if(check_slot && !check_slot.get_equipped_item()) - if(!disable_warning) - to_chat(user, SPAN_WARNING("You need to be wearing something on your body before you can wear \the [prop].")) - return FALSE - return (prop.item_flags & ITEM_FLAG_IS_BELT) + if(!check_slot || check_slot.get_equipped_item()) + return TRUE + if(!disable_warning) + to_chat(user, SPAN_WARNING("You need to be wearing something on your body before you can wear \the [prop].")) + return FALSE /datum/inventory_slot/belt/get_examined_string(mob/owner, mob/user, distance, hideflags, decl/pronouns/pronouns) if(_holding) diff --git a/code/datums/inventory_slots/slots/slot_ears.dm b/code/datums/inventory_slots/slots/slot_ears.dm index d4619022b77..b6dd92dd37f 100644 --- a/code/datums/inventory_slots/slots/slot_ears.dm +++ b/code/datums/inventory_slots/slots/slot_ears.dm @@ -9,6 +9,7 @@ requires_organ_tag = BP_HEAD requires_slot_flags = SLOT_EARS mob_overlay_layer = HO_L_EAR_LAYER + quick_equip_priority = 7 /datum/inventory_slot/ear/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) for(var/slot in global.airtight_slots) @@ -42,3 +43,4 @@ slot_id = slot_r_ear_str ui_loc = ui_r_ear mob_overlay_layer = HO_R_EAR_LAYER + quick_equip_priority = 6 diff --git a/code/datums/inventory_slots/slots/slot_glasses.dm b/code/datums/inventory_slots/slots/slot_glasses.dm index 6a7dfce9057..0068fac4a1e 100644 --- a/code/datums/inventory_slots/slots/slot_glasses.dm +++ b/code/datums/inventory_slots/slots/slot_glasses.dm @@ -10,6 +10,7 @@ requires_slot_flags = SLOT_EYES mob_overlay_layer = HO_GLASSES_LAYER alt_mob_overlay_layer = HO_GOGGLES_LAYER + quick_equip_priority = 5 /datum/inventory_slot/glasses/get_examined_string(mob/owner, mob/user, distance, hideflags, decl/pronouns/pronouns) if(_holding && !(hideflags & HIDEEYES)) diff --git a/code/datums/inventory_slots/slots/slot_gloves.dm b/code/datums/inventory_slots/slots/slot_gloves.dm index c2c09e951c9..3877aaf32cf 100644 --- a/code/datums/inventory_slots/slots/slot_gloves.dm +++ b/code/datums/inventory_slots/slots/slot_gloves.dm @@ -11,13 +11,14 @@ ) covering_flags = SLOT_HANDS requires_slot_flags = SLOT_HANDS + quick_equip_priority = 8 /datum/inventory_slot/gloves/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/suit = user.get_equipped_item(slot_wear_suit_str) if(_holding && !(suit && suit.flags_inv & HIDEGLOVES)) - user.set_current_mob_overlay(HO_GLOVES_LAYER, _holding.get_mob_overlay(user, slot_gloves_str), redraw_mob) + user.set_current_mob_overlay(HO_GLOVES_LAYER, _holding.get_mob_overlay(user, slot_gloves_str, use_fallback_if_icon_missing = use_overlay_fallback_slot), redraw_mob) return - var/mob_blood_overlay = user.get_bodytype().get_blood_overlays(src) + var/mob_blood_overlay = user.get_bodytype()?.get_blood_overlays(src) if(mob_blood_overlay) var/blood_color for(var/obj/item/organ/external/grabber in user.get_hands_organs()) diff --git a/code/datums/inventory_slots/slots/slot_head.dm b/code/datums/inventory_slots/slots/slot_head.dm index d6b63dd77e2..3d375147147 100644 --- a/code/datums/inventory_slots/slots/slot_head.dm +++ b/code/datums/inventory_slots/slots/slot_head.dm @@ -8,6 +8,12 @@ covering_flags = SLOT_HEAD requires_slot_flags = SLOT_HEAD mob_overlay_layer = HO_HEAD_LAYER + quick_equip_priority = 9 + +/datum/inventory_slot/head/simple + requires_organ_tag = null + can_be_hidden = FALSE + ui_loc = "LEFT+1:16,BOTTOM:5" /datum/inventory_slot/head/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) if(prop?.flags_inv & (HIDEMASK|BLOCK_ALL_HAIR)) diff --git a/code/datums/inventory_slots/slots/slot_id.dm b/code/datums/inventory_slots/slots/slot_id.dm index 29466c29c55..c660fa56413 100644 --- a/code/datums/inventory_slots/slots/slot_id.dm +++ b/code/datums/inventory_slots/slots/slot_id.dm @@ -5,6 +5,7 @@ slot_id = slot_wear_id_str requires_slot_flags = SLOT_ID mob_overlay_layer = HO_ID_LAYER + quick_equip_priority = 13 /datum/inventory_slot/id/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/clothing/under/under = user.get_equipped_item(slot_w_uniform_str) diff --git a/code/datums/inventory_slots/slots/slot_mask.dm b/code/datums/inventory_slots/slots/slot_mask.dm index bc87168a22b..7772cc4b5a4 100644 --- a/code/datums/inventory_slots/slots/slot_mask.dm +++ b/code/datums/inventory_slots/slots/slot_mask.dm @@ -9,6 +9,7 @@ requires_slot_flags = SLOT_FACE can_be_hidden = TRUE mob_overlay_layer = HO_FACEMASK_LAYER + quick_equip_priority = 10 /datum/inventory_slot/mask/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) if(prop?.flags_inv & BLOCK_ALL_HAIR) diff --git a/code/datums/inventory_slots/slots/slot_pockets.dm b/code/datums/inventory_slots/slots/slot_pockets.dm index 8fe19bdc08a..9a075cd7e85 100644 --- a/code/datums/inventory_slots/slots/slot_pockets.dm +++ b/code/datums/inventory_slots/slots/slot_pockets.dm @@ -7,6 +7,7 @@ skip_on_strip_display = TRUE requires_organ_tag = BP_CHEST requires_slot_flags = SLOT_POCKET + quick_equip_priority = 2 /datum/inventory_slot/pocket/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) return @@ -32,3 +33,4 @@ slot_name = "Right Pocket" ui_loc = ui_storage2 slot_id = slot_r_store_str + quick_equip_priority = 1 diff --git a/code/datums/inventory_slots/slots/slot_shoes.dm b/code/datums/inventory_slots/slots/slot_shoes.dm index 963d9c0abb6..9ba3252eb8e 100644 --- a/code/datums/inventory_slots/slots/slot_shoes.dm +++ b/code/datums/inventory_slots/slots/slot_shoes.dm @@ -9,14 +9,15 @@ BP_R_FOOT ) requires_slot_flags = SLOT_FEET + quick_equip_priority = 3 /datum/inventory_slot/shoes/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/suit = user.get_equipped_item(slot_wear_suit_str) var/obj/item/uniform = user.get_equipped_item(slot_w_uniform_str) if(_holding && !((suit && suit.flags_inv & HIDESHOES) || (uniform && uniform.flags_inv & HIDESHOES))) - user.set_current_mob_overlay(HO_SHOES_LAYER, _holding.get_mob_overlay(user, slot_shoes_str), redraw_mob) + user.set_current_mob_overlay(HO_SHOES_LAYER, _holding.get_mob_overlay(user, slot_shoes_str, use_fallback_if_icon_missing = use_overlay_fallback_slot), redraw_mob) return - var/mob_blood_overlay = user.get_bodytype().get_blood_overlays(src) + var/mob_blood_overlay = user.get_bodytype()?.get_blood_overlays(src) if(mob_blood_overlay) var/blood_color for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT)) diff --git a/code/datums/inventory_slots/slots/slot_suit.dm b/code/datums/inventory_slots/slots/slot_suit.dm index 5319ac7ec70..f7b1342c4b3 100644 --- a/code/datums/inventory_slots/slots/slot_suit.dm +++ b/code/datums/inventory_slots/slots/slot_suit.dm @@ -8,6 +8,7 @@ requires_organ_tag = BP_CHEST requires_slot_flags = SLOT_OVER_BODY mob_overlay_layer = HO_SUIT_LAYER + quick_equip_priority = 11 /datum/inventory_slot/suit/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) if(prop) diff --git a/code/datums/inventory_slots/slots/slot_uniform.dm b/code/datums/inventory_slots/slots/slot_uniform.dm index 694682db3a0..b254028a7c4 100644 --- a/code/datums/inventory_slots/slots/slot_uniform.dm +++ b/code/datums/inventory_slots/slots/slot_uniform.dm @@ -13,13 +13,14 @@ ) requires_organ_tag = BP_CHEST requires_slot_flags = SLOT_UPPER_BODY + quick_equip_priority = 12 /datum/inventory_slot/uniform/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) if(prop?.flags_inv & HIDESHOES) user.update_equipment_overlay(slot_shoes_str, FALSE) var/obj/item/suit = user.get_equipped_item(slot_wear_suit_str) if(_holding && (!suit || !(suit.flags_inv & HIDEJUMPSUIT))) - user.set_current_mob_overlay(HO_UNIFORM_LAYER, _holding.get_mob_overlay(user, slot_w_uniform_str), redraw_mob) + user.set_current_mob_overlay(HO_UNIFORM_LAYER, _holding.get_mob_overlay(user, slot_w_uniform_str, use_fallback_if_icon_missing = use_overlay_fallback_slot), redraw_mob) else user.set_current_mob_overlay(HO_UNIFORM_LAYER, null, redraw_mob) diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index b387310fcec..94c7bba26be 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -213,19 +213,23 @@ else if(href_list["remove_antagonist"]) var/decl/special_role/antag = locate(href_list["remove_antagonist"]) - if(antag) antag.remove_antagonist(src) + if(istype(antag)) + antag.remove_antagonist(src) else if(href_list["equip_antagonist"]) var/decl/special_role/antag = locate(href_list["equip_antagonist"]) - if(antag) antag.equip(src.current) + if(istype(antag)) + antag.equip_role(src.current) else if(href_list["unequip_antagonist"]) var/decl/special_role/antag = locate(href_list["unequip_antagonist"]) - if(antag) antag.unequip(src.current) + if(istype(antag)) + antag.unequip_role(src.current) else if(href_list["move_antag_to_spawn"]) var/decl/special_role/antag = locate(href_list["move_antag_to_spawn"]) - if(antag) antag.place_mob(src.current) + if(istype(antag)) + antag.place_mob(src.current) else if (href_list["role_edit"]) var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in SSjobs.titles_to_datums diff --git a/code/datums/move_intent/move_intent.dm b/code/datums/move_intent/move_intent.dm index c9641068e71..87e521f5e33 100644 --- a/code/datums/move_intent/move_intent.dm +++ b/code/datums/move_intent/move_intent.dm @@ -21,7 +21,7 @@ /decl/move_intent/creep/Initialize() . = ..() - move_delay = config.creep_delay + move_delay = get_config_value(/decl/config/num/movement_creep) /decl/move_intent/walk name = "Walk" @@ -29,7 +29,7 @@ /decl/move_intent/walk/Initialize() . = ..() - move_delay = config.walk_delay + move_delay = get_config_value(/decl/config/num/movement_walk) /decl/move_intent/run name = "Run" @@ -38,4 +38,4 @@ /decl/move_intent/run/Initialize() . = ..() - move_delay = config.run_delay + move_delay = get_config_value(/decl/config/num/movement_run) diff --git a/code/datums/movement/mob.dm b/code/datums/movement/mob.dm index b66388cab6a..6450f821a63 100644 --- a/code/datums/movement/mob.dm +++ b/code/datums/movement/mob.dm @@ -217,7 +217,7 @@ else mod *= 0.8 - return config.minimum_sprint_cost + (config.skill_sprint_cost_range * mod) + return get_config_value(/decl/config/num/movement_min_sprint_cost) + get_config_value(/decl/config/num/movement_skill_sprint_cost_range) * mod // Misc. helpers /mob/proc/MayEnterTurf(var/turf/T) diff --git a/code/datums/observation/dir_set.dm b/code/datums/observation/dir_set.dm index 03e221a365c..edec53d036d 100644 --- a/code/datums/observation/dir_set.dm +++ b/code/datums/observation/dir_set.dm @@ -18,7 +18,7 @@ // Listen to the parent if possible. if(. && istype(dir_changer.loc, /atom/movable)) // We don't care about registering to turfs. - register(dir_changer.loc, dir_changer, /atom/proc/recursive_dir_set) + register(dir_changer.loc, dir_changer, TYPE_PROC_REF(/atom, recursive_dir_set)) /********************* * Direction Handling * @@ -28,8 +28,8 @@ . = ..() var/decl/observ/dir_set/dir_set_event = GET_DECL(/decl/observ/dir_set) if(dir_set_event.has_listeners(am)) - events_repository.register(/decl/observ/dir_set, src, am, /atom/proc/recursive_dir_set) + events_repository.register(/decl/observ/dir_set, src, am, TYPE_PROC_REF(/atom, recursive_dir_set)) /atom/movable/Exited(var/atom/movable/am, atom/new_loc) . = ..() - events_repository.unregister(/decl/observ/dir_set, src, am, /atom/proc/recursive_dir_set) + events_repository.unregister(/decl/observ/dir_set, src, am, TYPE_PROC_REF(/atom, recursive_dir_set)) diff --git a/code/datums/observation/helpers.dm b/code/datums/observation/helpers.dm index b0a04383972..89330ecc50b 100644 --- a/code/datums/observation/helpers.dm +++ b/code/datums/observation/helpers.dm @@ -24,9 +24,9 @@ qdel(src) /proc/register_all_movement(var/event_source, var/listener) - events_repository.register(/decl/observ/moved, event_source, listener, /atom/movable/proc/recursive_move) - events_repository.register(/decl/observ/dir_set, event_source, listener, /atom/proc/recursive_dir_set) + events_repository.register(/decl/observ/moved, event_source, listener, TYPE_PROC_REF(/atom/movable, recursive_move)) + events_repository.register(/decl/observ/dir_set, event_source, listener, TYPE_PROC_REF(/atom, recursive_dir_set)) /proc/unregister_all_movement(var/event_source, var/listener) - events_repository.unregister(/decl/observ/moved, event_source, listener, /atom/movable/proc/recursive_move) - events_repository.unregister(/decl/observ/dir_set, event_source, listener, /atom/proc/recursive_dir_set) + events_repository.unregister(/decl/observ/moved, event_source, listener, TYPE_PROC_REF(/atom/movable, recursive_move)) + events_repository.unregister(/decl/observ/dir_set, event_source, listener, TYPE_PROC_REF(/atom, recursive_dir_set)) diff --git a/code/datums/observation/moved.dm b/code/datums/observation/moved.dm index b61aefffd4a..19557c43c5e 100644 --- a/code/datums/observation/moved.dm +++ b/code/datums/observation/moved.dm @@ -18,7 +18,7 @@ // Listen to the parent if possible. if(. && istype(mover.loc, expected_type)) - register(mover.loc, mover, /atom/movable/proc/recursive_move) + register(mover.loc, mover, TYPE_PROC_REF(/atom/movable, recursive_move)) /******************** * Movement Handling * @@ -32,8 +32,8 @@ . = ..() var/decl/observ/moved/moved_event = GET_DECL(/decl/observ/moved) if(moved_event.has_listeners(am)) - events_repository.register(/decl/observ/moved, src, am, /atom/movable/proc/recursive_move) + events_repository.register(/decl/observ/moved, src, am, TYPE_PROC_REF(/atom/movable, recursive_move)) /atom/movable/Exited(var/atom/movable/am, atom/new_loc) . = ..() - events_repository.unregister(/decl/observ/moved, src, am, /atom/movable/proc/recursive_move) + events_repository.unregister(/decl/observ/moved, src, am, TYPE_PROC_REF(/atom/movable, recursive_move)) diff --git a/code/datums/outfits/_defines.dm b/code/datums/outfits/_defines.dm index 90defc13771..3f2c3d51ae9 100644 --- a/code/datums/outfits/_defines.dm +++ b/code/datums/outfits/_defines.dm @@ -3,6 +3,7 @@ #define OUTFIT_HAS_BACKPACK BITFLAG(1) #define OUTFIT_EXTENDED_SURVIVAL BITFLAG(2) #define OUTFIT_RESET_EQUIPMENT BITFLAG(3) +#define OUTFIT_HAS_VITALS_SENSOR BITFLAG(4) #define OUTFIT_ADJUSTMENT_SKIP_POST_EQUIP BITFLAG(0) #define OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR BITFLAG(1) diff --git a/code/datums/outfits/jobs/generic.dm b/code/datums/outfits/jobs/generic.dm index f69de63ccf8..d18d8b514f5 100644 --- a/code/datums/outfits/jobs/generic.dm +++ b/code/datums/outfits/jobs/generic.dm @@ -23,7 +23,7 @@ shoes = /obj/item/clothing/shoes/workboots pda_type = /obj/item/modular_computer/pda/engineering pda_slot = slot_l_store_str - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR /decl/hierarchy/outfit/job/generic/engineer/Initialize() . = ..() diff --git a/code/datums/outfits/jobs/job.dm b/code/datums/outfits/jobs/job.dm index 8394fc4ee75..80311b8a23a 100644 --- a/code/datums/outfits/jobs/job.dm +++ b/code/datums/outfits/jobs/job.dm @@ -11,13 +11,4 @@ pda_slot = slot_belt_str pda_type = /obj/item/modular_computer/pda - flags = OUTFIT_HAS_BACKPACK - -/decl/hierarchy/outfit/job/equip_id(var/mob/living/carbon/human/H, var/rank, var/assignment, var/equip_adjustments, var/datum/job/job) - var/obj/item/card/id/C = ..() - if(!C) - return - if(H.mind) - if(H.mind.initial_account) - C.associated_account_number = H.mind.initial_account.account_number - return C + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_HAS_VITALS_SENSOR diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index 1d81c10d1b0..476c5d7e16d 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -6,7 +6,7 @@ uniform = /obj/item/clothing/under/color/grey back = /obj/item/tank/jetpack/oxygen mask = /obj/item/clothing/mask/breath - flags = OUTFIT_HAS_JETPACK|OUTFIT_RESET_EQUIPMENT + outfit_flags = OUTFIT_HAS_JETPACK|OUTFIT_RESET_EQUIPMENT /decl/hierarchy/outfit/soviet_soldier name = "Soviet soldier" @@ -35,7 +35,7 @@ l_ear = /obj/item/radio/headset uniform = /obj/item/clothing/under/clown l_pocket = /obj/item/bikehorn - flags = OUTFIT_HAS_BACKPACK|OUTFIT_RESET_EQUIPMENT + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_RESET_EQUIPMENT | OUTFIT_HAS_VITALS_SENSOR /decl/hierarchy/outfit/clown/Initialize() . = ..() diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 5a835c006ee..072bf4b7656 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -53,7 +53,7 @@ var/global/list/outfits_decls_by_type_ var/id_pda_assignment var/list/backpack_overrides - var/flags = OUTFIT_RESET_EQUIPMENT + var/outfit_flags = OUTFIT_RESET_EQUIPMENT /decl/hierarchy/outfit/Initialize() . = ..() @@ -62,21 +62,38 @@ var/global/list/outfits_decls_by_type_ outfits_decls_by_type_[type] = src dd_insertObjectList(outfits_decls_, src) +// This proc is structured slightly strangely because I will be adding pants to it. +/decl/hierarchy/outfit/validate() + . = ..() + if(uniform && (outfit_flags & OUTFIT_HAS_VITALS_SENSOR)) + if(!ispath(uniform, /obj/item/clothing)) + . += "outfit is flagged for sensors, but uniform cannot take accessories" + var/succeeded = FALSE + var/obj/item/sensor = new /obj/item/clothing/accessory/vitals_sensor + if(uniform) + var/obj/item/clothing/wear_uniform = new uniform // sadly we need to read a list + if(wear_uniform.can_attach_accessory(sensor)) + succeeded = TRUE + qdel(wear_uniform) + if(!succeeded) + . += "outfit is flagged for sensors, but uniform does not accept sensors" + qdel(sensor) + /decl/hierarchy/outfit/proc/pre_equip(mob/living/carbon/human/H) - if(flags & OUTFIT_RESET_EQUIPMENT) + if(outfit_flags & OUTFIT_RESET_EQUIPMENT) H.delete_inventory(TRUE) /decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H) - if(flags & OUTFIT_HAS_JETPACK) + if(outfit_flags & OUTFIT_HAS_JETPACK) var/obj/item/tank/jetpack/J = locate(/obj/item/tank/jetpack) in H if(!J) return J.toggle() J.toggle_valve() -/decl/hierarchy/outfit/proc/equip(mob/living/carbon/human/H, var/rank, var/assignment, var/equip_adjustments) +/decl/hierarchy/outfit/proc/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) equip_base(H, equip_adjustments) - + equip_id(H, assignment, equip_adjustments, job, rank) for(var/path in backpack_contents) var/number = backpack_contents[path] for(var/i=0,i 0, cnt--) + var/obj/item/I = locate(i) in container_contents + if (I && I.reagents) + container_contents -= I + I.reagents.trans_to_holder(buffer,I.reagents.total_volume) + qdel(I) //Find fruits if (LAZYLEN(fruit)) diff --git a/code/datums/repositories/atom_info.dm b/code/datums/repositories/atom_info.dm index c21c764b753..a15c4fd3739 100644 --- a/code/datums/repositories/atom_info.dm +++ b/code/datums/repositories/atom_info.dm @@ -26,13 +26,7 @@ var/global/repository/atom_info/atom_info_repository = new() var/atom/instance if(!matter_cache[key]) instance = get_instance_of(path, material, amount) - var/matter_list = instance.building_cost() - if(istype(instance, /obj/item/ammo_magazine) || istype(instance, /obj/item/storage)) - for(var/obj/thing in instance) - var/list/thing_matter = thing.building_cost() - for(var/mat in thing_matter) - matter_cache[mat] += thing_matter[mat] - matter_cache[key] = matter_list + matter_cache[key] = instance.get_contained_matter() if(!combined_worth_cache[key]) instance = instance || get_instance_of(path, material, amount) combined_worth_cache[key] = instance.get_combined_monetary_worth() diff --git a/code/datums/repositories/crew/binary.dm b/code/datums/repositories/crew/binary.dm index c4399ea37e0..847e3b0c982 100644 --- a/code/datums/repositories/crew/binary.dm +++ b/code/datums/repositories/crew/binary.dm @@ -1,5 +1,5 @@ /* Binary */ -/crew_sensor_modifier/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = FALSE if(!H.isSynthetic() && H.should_have_organ(BP_HEART)) var/obj/item/organ/internal/heart/O = H.get_organ(BP_HEART, /obj/item/organ/internal/heart) @@ -19,11 +19,11 @@ /crew_sensor_modifier/binary/jamming priority = 5 -/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/alive/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = FALSE return MOD_SUIT_SENSORS_HANDLED -/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) crew_data["alert"] = TRUE return MOD_SUIT_SENSORS_HANDLED @@ -37,7 +37,7 @@ /crew_sensor_modifier/binary/jamming/random/major error_prob = 100 -/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/binary/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(error_prob)) crew_data["alert"] = pick(TRUE, FALSE) diff --git a/code/datums/repositories/crew/crew.dm b/code/datums/repositories/crew/crew.dm index e0becfd3f77..8fc83a2f712 100644 --- a/code/datums/repositories/crew/crew.dm +++ b/code/datums/repositories/crew/crew.dm @@ -21,10 +21,10 @@ var/global/datum/repository/crew/crew_repository = new() tracking_modifiers.Enqueue(new/crew_sensor_modifier/tracking()) modifier_queues = list() - modifier_queues[general_modifiers] = 0 - modifier_queues[binary_modifiers] = SUIT_SENSOR_BINARY - modifier_queues[vital_modifiers] = SUIT_SENSOR_VITAL - modifier_queues[tracking_modifiers] = SUIT_SENSOR_TRACKING + modifier_queues[general_modifiers] = VITALS_SENSOR_OFF + modifier_queues[binary_modifiers] = VITALS_SENSOR_BINARY + modifier_queues[vital_modifiers] = VITALS_SENSOR_VITAL + modifier_queues[tracking_modifiers] = VITALS_SENSOR_TRACKING modifier_queues_by_type = list() modifier_queues_by_type[/crew_sensor_modifier/general] = general_modifiers @@ -49,19 +49,21 @@ var/global/datum/repository/crew/crew_repository = new() cache_data_alert[num2text(z_level)] = FALSE var/tracked = scan() - for(var/obj/item/clothing/under/C in tracked) - var/turf/pos = get_turf(C) - if(C.has_sensor && pos && pos.z == z_level && C.sensor_mode != SUIT_SENSOR_OFF) - if(ishuman(C.loc)) - var/mob/living/carbon/human/H = C.loc - if(H.get_equipped_item(slot_w_uniform_str) != C) - continue - - var/list/crewmemberData = list("sensor_type"=C.sensor_mode, "stat"=H.stat, "area"="", "x"=-1, "y"=-1, "z"=-1, "ref"="\ref[H]") - if(!(run_queues(H, C, pos, crewmemberData) & MOD_SUIT_SENSORS_REJECTED)) - crewmembers[++crewmembers.len] = crewmemberData - if (crewmemberData["alert"]) - cache_data_alert[num2text(z_level)] = TRUE + for(var/obj/item/clothing/accessory/vitals_sensor/sensor as anything in tracked) + var/turf/pos = get_turf(sensor) + if(!pos || pos.z != z_level || sensor.sensor_mode == VITALS_SENSOR_OFF) + continue + var/mob/living/carbon/human/H = sensor.loc?.loc + if(!istype(H)) + continue + var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) + if(!istype(uniform) || !(sensor in uniform.accessories)) + continue + var/list/crewmemberData = list("sensor_type" = sensor.sensor_mode, "stat"=H.stat, "area"="", "x"=-1, "y"=-1, "z"=-1, "ref"="\ref[H]") + if(!(run_queues(H, sensor, pos, crewmemberData) & MOD_SUIT_SENSORS_REJECTED)) + crewmembers[++crewmembers.len] = crewmemberData + if (crewmemberData["alert"]) + cache_data_alert[num2text(z_level)] = TRUE crewmembers = sortTim(crewmembers, /proc/cmp_list_name_key_asc) @@ -80,39 +82,37 @@ var/global/datum/repository/crew/crew_repository = new() . = cache_data_alert[num2text(z_level)] /datum/repository/crew/proc/scan() - var/list/tracked = list() for(var/mob/living/carbon/human/H in SSmobs.mob_list) - var/obj/item/clothing/under/C = H.get_equipped_item(slot_w_uniform_str) - if(istype(C) && C.has_sensor) - tracked |= C - return tracked + var/sensor = H.get_vitals_sensor() + if(sensor) + LAZYDISTINCTADD(., sensor) -/datum/repository/crew/proc/run_queues(H, C, pos, crewmemberData) +/datum/repository/crew/proc/run_queues(H, S, pos, crewmemberData) for(var/modifier_queue in modifier_queues) if(crewmemberData["sensor_type"] >= modifier_queues[modifier_queue]) - . = process_crew_data(modifier_queue, H, C, pos, crewmemberData) + . = process_crew_data(modifier_queue, H, S, pos, crewmemberData) if(. & MOD_SUIT_SENSORS_REJECTED) return -/datum/repository/crew/proc/process_crew_data(var/datum/priority_queue/modifiers, var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/datum/repository/crew/proc/process_crew_data(var/datum/priority_queue/modifiers, var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) var/current_priority = INFINITY var/list/modifiers_of_this_priority = list() for(var/crew_sensor_modifier/csm in modifiers.L) if(csm.priority < current_priority) - . = check_queue(modifiers_of_this_priority, H, C, pos, crew_data) + . = check_queue(modifiers_of_this_priority, H, S, pos, crew_data) if(. != MOD_SUIT_SENSORS_NONE) return current_priority = csm.priority modifiers_of_this_priority += csm - return check_queue(modifiers_of_this_priority, H, C, pos, crew_data) + return check_queue(modifiers_of_this_priority, H, S, pos, crew_data) -/datum/repository/crew/proc/check_queue(var/list/modifiers_of_this_priority, H, C, pos, crew_data) +/datum/repository/crew/proc/check_queue(var/list/modifiers_of_this_priority, H, S, pos, crew_data) while(modifiers_of_this_priority.len) var/crew_sensor_modifier/pcsm = pick(modifiers_of_this_priority) modifiers_of_this_priority -= pcsm - if(pcsm.may_process_crew_data(H, C, pos)) - . = pcsm.process_crew_data(H, C, pos, crew_data) + if(pcsm.may_process_crew_data(H, S, pos)) + . = pcsm.process_crew_data(H, S, pos, crew_data) if(. != MOD_SUIT_SENSORS_NONE) return return MOD_SUIT_SENSORS_NONE diff --git a/code/datums/repositories/crew/crew_sensor_modifier.dm b/code/datums/repositories/crew/crew_sensor_modifier.dm index 753e429e83d..3dec235a49b 100644 --- a/code/datums/repositories/crew/crew_sensor_modifier.dm +++ b/code/datums/repositories/crew/crew_sensor_modifier.dm @@ -13,8 +13,8 @@ may_process_proc = null . = ..() -/crew_sensor_modifier/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos) - return holder && may_process_proc ? call(holder, may_process_proc)(H, C, pos) : TRUE +/crew_sensor_modifier/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos) + return holder && may_process_proc ? call(holder, may_process_proc)(H, S, pos) : TRUE -/crew_sensor_modifier/proc/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/proc/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) return MOD_SUIT_SENSORS_HANDLED diff --git a/code/datums/repositories/crew/general.dm b/code/datums/repositories/crew/general.dm index a2c09ddab37..c66e670ff43 100644 --- a/code/datums/repositories/crew/general.dm +++ b/code/datums/repositories/crew/general.dm @@ -1,5 +1,5 @@ /* General */ -/crew_sensor_modifier/general/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) crew_data["name"] = H.get_authentification_name(if_no_id="Unknown") crew_data["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job") crew_data["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job") @@ -9,23 +9,23 @@ /crew_sensor_modifier/general/jamming priority = 5 -/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/off/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() // This works only because general is checked first and crew_data["sensor_type"] is used to check if whether any additional data should be included. - crew_data["sensor_type"] = SUIT_SENSOR_OFF + crew_data["sensor_type"] = VITALS_SENSOR_OFF return MOD_SUIT_SENSORS_REJECTED -/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/binary/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() - crew_data["sensor_type"] = SUIT_SENSOR_BINARY + crew_data["sensor_type"] = VITALS_SENSOR_BINARY -/crew_sensor_modifier/general/jamming/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() - crew_data["sensor_type"] = SUIT_SENSOR_VITAL + crew_data["sensor_type"] = VITALS_SENSOR_VITAL -/crew_sensor_modifier/general/jamming/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() - crew_data["sensor_type"] = SUIT_SENSOR_TRACKING + crew_data["sensor_type"] = VITALS_SENSOR_TRACKING /* Random */ /crew_sensor_modifier/general/jamming/random @@ -40,9 +40,9 @@ random_sensor_type_prob = 60 random_assignment_prob = 40 -/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/general/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(random_sensor_type_prob)) - crew_data["sensor_type"] = pick(SUIT_SENSOR_OFF, SUIT_SENSOR_BINARY, SUIT_SENSOR_VITAL, SUIT_SENSOR_TRACKING) + crew_data["sensor_type"] = pick(VITALS_SENSOR_OFF, VITALS_SENSOR_BINARY, VITALS_SENSOR_VITAL, VITALS_SENSOR_TRACKING) if(prob(random_assignment_prob)) crew_data["assignment"] = pick("Agent", "Infiltrator", "Passenger", "Crewman", "Unknown") diff --git a/code/datums/repositories/crew/tracking.dm b/code/datums/repositories/crew/tracking.dm index 76b1bca025e..7f509e91ab5 100644 --- a/code/datums/repositories/crew/tracking.dm +++ b/code/datums/repositories/crew/tracking.dm @@ -1,5 +1,5 @@ /* Tracking */ -/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) if(pos) var/area/A = get_area(pos) crew_data["area"] = A.proper_name @@ -12,8 +12,8 @@ /crew_sensor_modifier/tracking/jamming priority = 5 -/crew_sensor_modifier/tracking/jamming/localize/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) - return ..(H, C, get_turf(holder), crew_data) +/crew_sensor_modifier/tracking/jamming/localize/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) + return ..(H, S, get_turf(holder), crew_data) /crew_sensor_modifier/tracking/jamming/random var/shift_range = 7 @@ -27,7 +27,7 @@ /crew_sensor_modifier/tracking/jamming/random/major shift_range = 21 -/crew_sensor_modifier/tracking/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/tracking/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) if(world.time > next_shift_change) next_shift_change = world.time + rand(30 SECONDS, 2 MINUTES) x_shift = rand(-shift_range, shift_range) @@ -36,4 +36,4 @@ var/new_x = clamp(pos.x + x_shift, 1, world.maxx) var/new_y = clamp(pos.y + y_shift, 1, world.maxy) pos = locate(new_x, new_y, pos.z) - return ..(H, C, pos, crew_data) + return ..(H, S, pos, crew_data) diff --git a/code/datums/repositories/crew/vital.dm b/code/datums/repositories/crew/vital.dm index 9e7aab0f869..3cc781486c1 100644 --- a/code/datums/repositories/crew/vital.dm +++ b/code/datums/repositories/crew/vital.dm @@ -1,5 +1,5 @@ /* Vital */ -/crew_sensor_modifier/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) crew_data["true_pulse"] = -1 crew_data["pulse"] = "N/A" crew_data["pulse_span"] = "neutral" @@ -100,12 +100,12 @@ /crew_sensor_modifier/vital/jamming priority = 5 -/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/healthy/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() set_healthy(crew_data) return MOD_SUIT_SENSORS_HANDLED -/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/dead/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() set_dead(crew_data) return MOD_SUIT_SENSORS_HANDLED @@ -120,7 +120,7 @@ /crew_sensor_modifier/vital/jamming/random/major error_prob = 100 -/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos, var/list/crew_data) +/crew_sensor_modifier/vital/jamming/random/process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos, var/list/crew_data) . = ..() if(prob(error_prob)) pick(set_healthy(crew_data), set_dead(crew_data)) diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index 4c97482a93e..0bc268c1a66 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -40,6 +40,22 @@ var/global/repository/decls/decls_repository = new RETURN_TYPE(/decl) . = get_decl(fetched_decl_ids[decl_id], validate_decl_type) +// This proc and get_decl_by_id_or_var() are being added solely to grandfather in decls saved to player saves under name +// rather than UID. They should be considered deprecated for this purpose - uid and get_decl_by_id() should be used instead. +/repository/decls/proc/get_decl_by_var(var/decl_value, var/decl_prototype, var/check_var = "name") + var/list/all_decls = get_decls_of_type(decl_prototype) + var/decl/prototype = all_decls[all_decls[1]] // Can't just grab the prototype as it may be abstract + if(!(check_var in prototype.vars)) + CRASH("Attempted to retrieve a decl by a var that does not exist on the decl type ('[check_var]')") + for(var/decl_type in all_decls) + var/decl/decl = all_decls[decl_type] + if(decl.vars[check_var] == decl_value) + return decl + +/repository/decls/proc/get_decl_by_id_or_var(var/decl_id, var/decl_prototype, var/check_var = "name") + RETURN_TYPE(/decl) + return get_decl_by_id(decl_id, validate_decl_type = FALSE) || get_decl_by_var(decl_id, decl_prototype, check_var) + /repository/decls/proc/get_decl_path_by_id(decl_id) . = fetched_decl_ids[decl_id] diff --git a/code/datums/repositories/follow.dm b/code/datums/repositories/follow.dm index c4d037f70be..11393225a41 100644 --- a/code/datums/repositories/follow.dm +++ b/code/datums/repositories/follow.dm @@ -36,7 +36,7 @@ var/global/repository/follow/follow_repository = new() followed_objects_assoc[AM] = follow_holder followed_objects.Add(follow_holder) - events_repository.register(/decl/observ/destroyed, AM, src, /repository/follow/proc/remove_subject) + events_repository.register(/decl/observ/destroyed, AM, src, TYPE_PROC_REF(/repository/follow, remove_subject)) /repository/follow/proc/remove_subject(var/atom/movable/AM) cache = null @@ -46,7 +46,7 @@ var/global/repository/follow/follow_repository = new() followed_objects_assoc -= AM followed_objects.Remove(follow_holder) - events_repository.unregister(/decl/observ/destroyed, AM, src, /repository/follow/proc/remove_subject) + events_repository.unregister(/decl/observ/destroyed, AM, src, TYPE_PROC_REF(/repository/follow, remove_subject)) qdel(follow_holder) @@ -175,7 +175,7 @@ var/global/repository/follow/follow_repository = new() /datum/follow_holder/brain sort_order = 3 - followed_type = /mob/living/carbon/brain + followed_type = /mob/living/brain suffix = "Brain" /datum/follow_holder/alien diff --git a/code/datums/sound_player.dm b/code/datums/sound_player.dm index 82cc8890e2c..3c93089fb07 100644 --- a/code/datums/sound_player.dm +++ b/code/datums/sound_player.dm @@ -128,10 +128,10 @@ listeners = list() listener_status = list() - events_repository.register(/decl/observ/destroyed, source, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/destroyed, source, src, TYPE_PROC_REF(/datum, qdel_self)) if(ismovable(source)) - proxy_listener = new(source, /datum/sound_token/proc/PrivAddListener, /datum/sound_token/proc/PrivLocateListeners, range, proc_owner = src) + proxy_listener = new(source, TYPE_PROC_REF(/datum/sound_token, PrivAddListener), TYPE_PROC_REF(/datum/sound_token, PrivLocateListeners), range, proc_owner = src) proxy_listener.register_turfs() /datum/sound_token/Destroy() @@ -169,7 +169,7 @@ listeners = null listener_status = null - events_repository.unregister(/decl/observ/destroyed, source, src, /datum/proc/qdel_self) + events_repository.unregister(/decl/observ/destroyed, source, src, TYPE_PROC_REF(/datum, qdel_self)) QDEL_NULL(proxy_listener) source = null @@ -217,16 +217,16 @@ listeners += listener - events_repository.register(/decl/observ/moved, listener, src, /datum/sound_token/proc/PrivUpdateListenerLoc) - events_repository.register(/decl/observ/destroyed, listener, src, /datum/sound_token/proc/PrivRemoveListener) + events_repository.register(/decl/observ/moved, listener, src, TYPE_PROC_REF(/datum/sound_token, PrivUpdateListenerLoc)) + events_repository.register(/decl/observ/destroyed, listener, src, TYPE_PROC_REF(/datum/sound_token, PrivRemoveListener)) PrivUpdateListenerLoc(listener, FALSE) /datum/sound_token/proc/PrivRemoveListener(var/atom/listener, var/sound/null_sound) null_sound = null_sound || new(channel = sound.channel) sound_to(listener, null_sound) - events_repository.unregister(/decl/observ/moved, listener, src, /datum/sound_token/proc/PrivUpdateListenerLoc) - events_repository.unregister(/decl/observ/destroyed, listener, src, /datum/sound_token/proc/PrivRemoveListener) + events_repository.unregister(/decl/observ/moved, listener, src, TYPE_PROC_REF(/datum/sound_token, PrivUpdateListenerLoc)) + events_repository.unregister(/decl/observ/destroyed, listener, src, TYPE_PROC_REF(/datum/sound_token, PrivRemoveListener)) listeners -= listener listener_status -= listener diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 287226fa743..b1143cd2e2c 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -65,7 +65,7 @@ /decl/hierarchy/supply_pack/medical/blood name = "Refills - Synthetic Blood" - contains = list(/obj/item/chems/ivbag/nanoblood = 4) + contains = list(/obj/item/chems/ivbag/blood/nanoblood = 4) containername = "synthetic blood crate" /decl/hierarchy/supply_pack/medical/bodybag diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 8cb4c18873b..4e03952f164 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -22,7 +22,7 @@ /obj/item/chems/glass/paint/purple, /obj/item/chems/glass/paint/black, /obj/item/chems/glass/paint/white, - /obj/item/contraband/poster, + /obj/item/poster, /obj/item/stack/package_wrap/fifty = 2, /obj/item/stack/package_wrap/gift/fifty = 2 ) diff --git a/code/datums/supplypacks/operations.dm b/code/datums/supplypacks/operations.dm index 68962df00d4..e8c748c515e 100644 --- a/code/datums/supplypacks/operations.dm +++ b/code/datums/supplypacks/operations.dm @@ -15,11 +15,13 @@ /decl/hierarchy/supply_pack/operations/contraband num_contained = 5 - contains = list(/obj/item/seeds/bloodtomatoseed, - /obj/item/storage/pill_bottle/zoom, - /obj/item/storage/pill_bottle/happy, - /obj/item/storage/pill_bottle/gleam, - /obj/item/chems/drinks/bottle/pwine) + contains = list( + /obj/item/seeds/bloodtomatoseed, + /obj/item/storage/pill_bottle/zoom, + /obj/item/storage/pill_bottle/happy, + /obj/item/storage/pill_bottle/gleam, + /obj/item/chems/drinks/bottle/pwine + ) name = "UNLISTED - Contraband crate" containername = "unlabeled crate" diff --git a/code/datums/trading/__trading_defines.dm b/code/datums/trading/__trading_defines.dm index ead3d66ddff..29b244ba8a6 100644 --- a/code/datums/trading/__trading_defines.dm +++ b/code/datums/trading/__trading_defines.dm @@ -1,20 +1,47 @@ -#define TRADER_THIS_TYPE 1 -#define TRADER_SUBTYPES_ONLY 2 -#define TRADER_ALL 3 -#define TRADER_BLACKLIST 4 -#define TRADER_BLACKLIST_SUB 8 -#define TRADER_BLACKLIST_ALL 12 +#define TRADER_THIS_TYPE BITFLAG(0) +#define TRADER_SUBTYPES_ONLY BITFLAG(1) +#define TRADER_ALL (TRADER_THIS_TYPE|TRADER_SUBTYPES_ONLY) +#define TRADER_BLACKLIST BITFLAG(2) +#define TRADER_BLACKLIST_SUB BITFLAG(3) +#define TRADER_BLACKLIST_ALL (TRADER_BLACKLIST|TRADER_BLACKLIST_SUB) -#define TRADER_WANTED_ONLY 1 //Do they only trade for wanted goods? -#define TRADER_MONEY 2 //Do they only accept money in return for goods. -#define TRADER_GOODS 4 //Do they accept goods in return for other goods. -#define TRADER_WANTED_ALL 8 //Like TRADER_WANTED_ONLY but they buy all possible wanted goods rather than a subset. +#define TRADER_WANTED_ONLY BITFLAG(0) // Do they only trade for wanted goods? +#define TRADER_MONEY BITFLAG(1) // Do they only accept money in return for goods. +#define TRADER_GOODS BITFLAG(2) // Do they accept goods in return for other goods. +#define TRADER_WANTED_ALL BITFLAG(3) // Like TRADER_WANTED_ONLY but they buy all possible wanted goods rather than a subset. +#define TRADER_BRIBABLE BITFLAG(4) // Determines if the trader can be bribed (stations cannot as they can't leave) + +// Tokens for constructing the hail tags (usually generic, species name or silicon). +// When merchants hail a person they use "trade_hail_[some token]". +#define TRADER_HAIL_START "trade_hail_" +#define TRADER_HAIL_GENERIC_END "generic" +#define TRADER_HAIL_SILICON_END "silicon" +#define TRADER_HAIL_GENERIC TRADER_HAIL_START + TRADER_HAIL_GENERIC_END // Default hail response token. +#define TRADER_HAIL_SILICON TRADER_HAIL_START + TRADER_HAIL_SILICON_END // Used when hailed by a robot or AI. +#define TRADER_HAIL_DENY TRADER_HAIL_START + "deny" // Used When merchant denies a hail. //Possible response defines for when offering an item for something -#define TRADER_NO_MONEY "trade_no_money" -#define TRADER_NO_GOODS "trade_no_goods" -#define TRADER_NOT_ENOUGH "trade_not_enough" -#define TRADER_NO_BLACKLISTED "trade_blacklist" -#define TRADER_FOUND_UNWANTED "trade_found_unwanted" +#define TRADER_NO_MONEY "trade_no_money" // Used when money is offered to a trader who does not accept money. +#define TRADER_NO_GOODS "trade_no_goods" // Used when goods are offered to a trader who does not accept goodds. +#define TRADER_NOT_ENOUGH "trade_not_enough" // Used when there is not enough money for the trade. +#define TRADER_NO_BLACKLISTED "trade_blacklist" // Used when a blacklisted item is offered by the player. +#define TRADER_FOUND_UNWANTED "trade_found_unwanted" // Used when an unwanted item is offered by the player. +#define TRADER_TRADE_COMPLETE "trade_complete" // When a trade is made successfully. +#define TRADER_HOW_MUCH "how_much" // When a merchant tells the player how much something is. +#define TRADER_WHAT_WANT "what_want" // What the person says when they are asked if they want something +#define TRADER_COMPLIMENT_DENY "compliment_deny" // When the merchant refuses a compliment +#define TRADER_COMPLIMENT_ACCEPT "compliment_accept" // When the merchant accepts a compliment +#define TRADER_INSULT_GOOD "insult_good" // When the player insults a merchant while they are on good disposition +#define TRADER_INSULT_BAD "insult_bad" // When a player insults a merchatn when they are not on good disposition +#define TRADER_BRIBE_REFUSAL "bribe_refusal" // When the trader refuses a bribe to stay longer. +#define TRADER_BRIBE_ACCEPT "bribe_accept" // When the trader accepts a bribe to stay longer. -#define TRADER_DEFAULT_NAME "Default" //Whether to just generate a name from the premade lists. \ No newline at end of file +// Tokens replaced with strings at runtime. +#define TRADER_TOKEN_ORIGIN "$ORIGIN$" // The selected origin of the trader station. +#define TRADER_TOKEN_VALUE "$VALUE$" // The value of the trade. +#define TRADER_TOKEN_CURRENCY "$CURRENCY$" // The plural name of the currency in use +#define TRADER_TOKEN_CUR_SINGLE "$CURRENCY_SINGULAR$" // The singular name of the unit of currency in use. +#define TRADER_TOKEN_ITEM "$ITEM$" // The relevant item being traded or offered. +#define TRADER_TOKEN_MERCHANT "$MERCHANT$" // The name of the current trader. +#define TRADER_TOKEN_MOB "$MOB$" // The player currently interacting with the trader. +#define TRADER_TOKEN_TIME "$TIME$" // How much longer a successful bribe has gained. diff --git a/code/datums/trading/_trader.dm b/code/datums/trading/_trader.dm index 527d62b4f0e..d567776ebd3 100644 --- a/code/datums/trading/_trader.dm +++ b/code/datums/trading/_trader.dm @@ -1,84 +1,51 @@ /datum/trader - var/name = "unsuspicious trader" //The name of the trader in question - var/origin = "some place" //The place that they are trading from - var/list/possible_origins //Possible names of the trader origin - var/disposition = 0 //The current disposition of them to us. - var/trade_flags = TRADER_MONEY //Flags - var/name_language //If this is set to a language name this will generate a name from the language - var/icon/portrait //The icon that shows up in the menu TODO: IMPLEMENT OR REMOVE - var/trader_currency - var/datum/trade_hub/hub - - var/list/wanted_items = list() //What items they enjoy trading for. Structure is (type = known/unknown) - var/list/possible_wanted_items //List of all possible wanted items. Structure is (type = mode) - var/list/possible_trading_items //List of all possible trading items. Structure is (type = mode) - var/list/trading_items = list() //What items they are currently trading away. - var/list/blacklisted_trade_items = list(/mob/living/carbon/human) - //Things they will automatically refuse - - var/list/speech = list() //The list of all their replies and messages. Structure is (id = talk) - /*SPEECH IDS: - hail_generic When merchants hail a person - hail_[race] Race specific hails - hail_deny When merchant denies a hail - - insult_good When the player insults a merchant while they are on good disposition - insult_bad When a player insults a merchatn when they are not on good disposition - complement_accept When the merchant accepts a complement - complement_deny When the merchant refuses a complement - - how_much When a merchant tells the player how much something is. - trade_complete When a trade is made - trade_refuse When a trade is refused - - what_want What the person says when they are asked if they want something - - */ - var/want_multiplier = 2 //How much wanted items are multiplied by when traded for - var/margin = 1.2 //Multiplier to price when selling to player - var/price_rng = 10 //Percentage max variance in sell prices. - var/insult_drop = 5 //How far disposition drops on insult - var/compliment_increase = 5 //How far compliments increase disposition - var/refuse_comms = 0 //Whether they refuse further communication - - var/mob_transfer_message = "You are transported to ORIGIN." //What message gets sent to mobs that get sold. - - var/static/list/blacklisted_types = list( - /obj, - /obj/structure, - /obj/machinery, - /obj/screen, - /obj/effect, - /obj/item, - /obj/item/twohanded, - /obj/item/organ, - /obj/item/organ/internal, - /obj/item/organ/external, - /obj/item/storage, - /obj/item/storage/internal, - /obj/item/chems, - /obj/item/chems/glass, - /obj/item/chems/food, - /obj/item/chems/food/old, - /obj/item/chems/food/grown, - /obj/item/chems/food/variable, - /obj/item/chems/condiment, - /obj/item/chems/drinks, - /obj/item/chems/drinks/bottle + abstract_type = /datum/trader + var/name = "unsuspicious trader" // The name of the trader in question + var/origin = "some place" // The place that they are trading from + var/list/possible_origins // Possible names of the trader origin + var/disposition = 0 // The current disposition of them to us. + var/trade_flags = TRADER_MONEY // Various flags for allowing or denying offers/interactions. + var/name_language // Language decl to use for trader name. If null, will use the generic name generator. + var/icon/portrait // The icon that shows up in the menu TODO: IMPLEMENT OR REMOVE + var/trader_currency // Currency decl to use. If blank, defaults to map. + var/datum/trade_hub/hub // Current associated trade hub, if any. + + var/list/wanted_items = list() // What items they enjoy trading for. Structure is (type = known/unknown) + var/list/possible_wanted_items // List of all possible wanted items. Structure is (type = mode) + var/list/possible_trading_items // List of all possible trading items. Structure is (type = mode) + var/list/trading_items = list() // What items they are currently trading away. + + // The list of all their replies and messages. + // Structure is (id = talk). Check __trading_defines.dm for specific tokens. + var/list/speech = list() + + var/want_multiplier = 2 // How much wanted items are multiplied by when traded for + var/margin = 1.2 // Multiplier to price when selling to player + var/price_rng = 10 // Percentage max variance in sell prices. + var/insult_drop = 5 // How far disposition drops on insult + var/compliment_increase = 5 // How far compliments increase disposition + var/refuse_comms = 0 // Whether they refuse further communication + + // What message gets sent to mobs that get sold. + var/mob_transfer_message = "You are transported to " + TRADER_TOKEN_ORIGIN + "." + + // Things they will automatically refuse + var/list/blacklisted_trade_items = list( + /mob/living/carbon/human ) /datum/trader/New() ..() if(!ispath(trader_currency, /decl/currency)) trader_currency = global.using_map.default_currency - if(name_language) - if(name_language == TRADER_DEFAULT_NAME) - name = capitalize(pick(global.first_names_female + global.first_names_male)) + " " + capitalize(pick(global.last_names)) - else - var/decl/language/L = GET_DECL(name_language) - if(istype(L)) - name = L.get_random_name(pick(MALE,FEMALE)) - if(possible_origins && possible_origins.len) + if(ispath(name_language, /decl/language)) + var/decl/language/L = GET_DECL(name_language) + if(istype(L)) + name = L.get_random_name(pick(MALE,FEMALE)) + if(!name) + name = capitalize(pick(global.first_names_female + global.first_names_male)) + " " + capitalize(pick(global.last_names)) + + if(length(possible_origins)) origin = pick(possible_origins) for(var/i in 3 to 6) @@ -107,39 +74,40 @@ if(new_item) pool |= new_item +// This is horrendous. TODO: cache all of this shit. +// May be possible to mutate trading_pool as this is passed in from the lists defined on the datum. /datum/trader/proc/get_possible_item(var/list/trading_pool) - if(!trading_pool || !trading_pool.len) + if(!length(trading_pool)) return var/list/possible = list() - for(var/type in trading_pool) - var/status = trading_pool[type] + for(var/trade_type in trading_pool) + var/status = trading_pool[trade_type] if(status & TRADER_THIS_TYPE) - possible += type + possible += trade_type if(status & TRADER_SUBTYPES_ONLY) - possible += subtypesof(type) + possible += subtypesof(trade_type) if(status & TRADER_BLACKLIST) - possible -= type + possible -= trade_type if(status & TRADER_BLACKLIST_SUB) - possible -= subtypesof(type) - + possible -= subtypesof(trade_type) + for(var/trade_type in possible) + var/atom/check_type = trade_type + if(!TYPE_IS_SPAWNABLE(check_type)) + possible -= check_type if(length(possible)) - var/picked = pick_n_take(possible) - while(length(possible) && (picked in blacklisted_types)) - picked = pick_n_take(possible) - if(!(picked in blacklisted_types)) - return picked + return pick(possible) /datum/trader/proc/get_response(var/key, var/default) if(speech && speech[key]) . = speech[key] else . = default - . = replacetext(., "MERCHANT", name) - . = replacetext(., "ORIGIN", origin) + . = replacetext(., TRADER_TOKEN_MERCHANT, name) + . = replacetext(., TRADER_TOKEN_ORIGIN, origin) var/decl/currency/cur = GET_DECL(trader_currency) - . = replacetext(.,"CURRENCY_SINGULAR", cur.name_singular) - . = replacetext(.,"CURRENCY", cur.name) + . = replacetext(.,TRADER_TOKEN_CUR_SINGLE, cur.name_singular) + . = replacetext(.,TRADER_TOKEN_CURRENCY, cur.name) /datum/trader/proc/print_trading_items(var/num) num = clamp(num,1,trading_items.len) @@ -199,12 +167,12 @@ for(var/item in offers) var/atom/movable/offer = item var/is_wanted = 0 - if((trade_flags & TRADER_WANTED_ONLY) && is_type_in_list(offer,wanted_items)) + if((trade_flags & TRADER_WANTED_ONLY) && is_type_in_list(offer, wanted_items)) is_wanted = 2 - if((trade_flags & TRADER_WANTED_ALL) && is_type_in_list(offer,possible_wanted_items)) + if((trade_flags & TRADER_WANTED_ALL) && is_type_in_list(offer, possible_wanted_items)) is_wanted = 1 - if(blacklisted_trade_items && blacklisted_trade_items.len && is_type_in_list(offer,blacklisted_trade_items)) - return 0 + if(length(blacklisted_trade_items) && is_type_in_list(offer, blacklisted_trade_items)) + return TRADER_NO_BLACKLISTED if(istype(offer,/obj/item/cash)) if(!(trade_flags & TRADER_MONEY)) @@ -212,7 +180,7 @@ else if(!(trade_flags & TRADER_GOODS)) return TRADER_NO_GOODS - else if((trade_flags & TRADER_WANTED_ONLY|TRADER_WANTED_ALL) && !is_wanted) + else if((trade_flags & (TRADER_WANTED_ONLY|TRADER_WANTED_ALL)) && !is_wanted) return TRADER_FOUND_UNWANTED offer_worth += get_buy_price(offer, is_wanted - 1, skill) @@ -233,11 +201,11 @@ if(H.species) specific = H.species.name else if(issilicon(user)) - specific = "silicon" - if(!speech["hail_[specific]"]) - specific = "generic" - . = get_response("hail_[specific]", "Greetings, MOB!") - . = replacetext(., "MOB", user.name) + specific = TRADER_HAIL_SILICON_END + if(!speech["[TRADER_HAIL_START][specific]"]) + specific = TRADER_HAIL_GENERIC_END + . = get_response("[TRADER_HAIL_START][specific]", "Greetings, " + TRADER_TOKEN_MOB + "!") + . = replacetext(., TRADER_TOKEN_MOB, user.name) /datum/trader/proc/can_hail() if(!refuse_comms && prob(-disposition)) @@ -249,23 +217,23 @@ if(prob(-disposition/10)) refuse_comms = 1 if(disposition > 50) - return get_response("insult_good","What? I thought we were cool!") + return get_response(TRADER_INSULT_GOOD,"What? I thought we were cool!") else - return get_response("insult_bad", "Right back at you asshole!") + return get_response(TRADER_INSULT_BAD, "Right back at you asshole!") /datum/trader/proc/compliment() if(prob(-disposition)) - return get_response("compliment_deny", "Fuck you!") + return get_response(TRADER_COMPLIMENT_DENY, "Fuck you!") if(prob(100-disposition)) disposition += rand(compliment_increase, compliment_increase * 2) - return get_response("compliment_accept", "Thank you!") + return get_response(TRADER_COMPLIMENT_ACCEPT, "Thank you!") /datum/trader/proc/trade(var/list/offers, var/num, var/turf/location) if(offers && offers.len) for(var/offer in offers) if(ismob(offer)) var/text = mob_transfer_message - to_chat(offer, replacetext(text, "ORIGIN", origin)) + to_chat(offer, replacetext(text, TRADER_TOKEN_ORIGIN, origin)) qdel(offer) var/type = trading_items[num] @@ -278,14 +246,14 @@ return M /datum/trader/proc/how_much_do_you_want(var/num, skill = SKILL_MAX) - . = get_response("how_much", "Hmm.... how about VALUE CURRENCY?") - . = replacetext(.,"VALUE",get_item_value(num, skill)) - . = replacetext(.,"ITEM", atom_info_repository.get_name_for(trading_items[num])) + . = get_response(TRADER_HOW_MUCH, "Hmm.... how about " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + "?") + . = replacetext(.,TRADER_TOKEN_VALUE,get_item_value(num, skill)) + . = replacetext(.,TRADER_TOKEN_ITEM, atom_info_repository.get_name_for(trading_items[num])) /datum/trader/proc/what_do_you_want() if(!(trade_flags & TRADER_GOODS)) return get_response(TRADER_NO_GOODS, "I don't deal in goods.") - . = get_response("what_want", "Hm, I want") + . = get_response(TRADER_WHAT_WANT, "Hm, I want") var/list/want_english = list() for(var/wtype in wanted_items) var/item_name = atom_info_repository.get_name_for(wtype) @@ -313,8 +281,18 @@ for(var/offer in offers) qdel(offer) + +/datum/trader/proc/is_bribable() + SHOULD_CALL_PARENT(TRUE) + return (trade_flags & TRADER_BRIBABLE) + +/datum/trader/proc/is_bribed(var/staylength) + return get_response(TRADER_BRIBE_REFUSAL, "How about... no?") + /datum/trader/proc/bribe_to_stay_longer(var/amt) - return get_response("bribe_refusal", "How about... no?") + if(is_bribable()) + return is_bribed(round(amt/100)) + return get_response(TRADER_BRIBE_REFUSAL, "How about... no?") /datum/trader/Destroy(force) if(hub) diff --git a/code/datums/trading/traders/ai.dm b/code/datums/trading/traders/ai.dm index 469a112daf8..5bdc07be534 100644 --- a/code/datums/trading/traders/ai.dm +++ b/code/datums/trading/traders/ai.dm @@ -10,23 +10,21 @@ They sell generic supplies and ask for generic supplies. name = "AI" origin = "Trading Beacon" name_language = /decl/language/human/common - trade_flags = TRADER_MONEY|TRADER_GOODS - speech = list("hail_generic" = "Greetings, I am MERCHANT, Artifical Intelligence onboard ORIGIN, tasked with trading goods in return for CURRENCY and supplies.", - "hail_deny" = "We are sorry, your connection has been blacklisted. Have a nice day.", - - "trade_complete" = "Thank you for your patronage.", - "trade_not_enough" = "I'm sorry, your offer is not worth what you are asking for.", - "trade_blacklisted" = "You have offered a blacklisted item. My laws do not allow me to trade for that.", - "how_much" = "ITEM will cost you roughly VALUE CURRENCY, or something of equal worth.", - "what_want" = "I have logged need for", - - "compliment_deny" = "I'm sorry, I am not allowed to let compliments affect the trade.", - "compliment_accept" = "Thank you, but that will not not change our business interactions.", - "insult_good" = "I do not understand, are we not on good terms?", - "insult_bad" = "I do not understand, are you insulting me?", - - "bribe_refusal" = "You have given me money to stay, however, I am a station. I do not leave.", - ) + trade_flags = TRADER_MONEY | TRADER_GOODS + speech = list( + TRADER_HAIL_GENERIC = "Greetings, I am " + TRADER_TOKEN_MERCHANT + ", Artifical Intelligence onboard " + TRADER_TOKEN_ORIGIN + ", tasked with trading goods in return for " + TRADER_TOKEN_CURRENCY + " and supplies.", + TRADER_HAIL_DENY = "We are sorry, your connection has been blacklisted. Have a nice day.", + TRADER_TRADE_COMPLETE = "Thank you for your patronage.", + TRADER_NOT_ENOUGH = "I'm sorry, your offer is not worth what you are asking for.", + TRADER_NO_BLACKLISTED = "You have offered a blacklisted item. My laws do not allow me to trade for that.", + TRADER_HOW_MUCH = TRADER_TOKEN_ITEM + " will cost you roughly " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ", or something of equal worth.", + TRADER_WHAT_WANT = "I have logged need for", + TRADER_COMPLIMENT_DENY = "I'm sorry, I am not allowed to let compliments affect the trade.", + TRADER_COMPLIMENT_ACCEPT = "Thank you, but that will not not change our business interactions.", + TRADER_INSULT_GOOD = "I do not understand, are we not on good terms?", + TRADER_INSULT_BAD = "I do not understand, are you insulting me?", + TRADER_BRIBE_REFUSAL = "You have given me money to stay, however, I am a station. I do not leave.", + ) possible_wanted_items = list( /obj/item = TRADER_SUBTYPES_ONLY, /obj/item/assembly = TRADER_BLACKLIST_ALL, diff --git a/code/datums/trading/traders/books.dm b/code/datums/trading/traders/books.dm index 5bc123f0fa1..4744ac979e7 100644 --- a/code/datums/trading/traders/books.dm +++ b/code/datums/trading/traders/books.dm @@ -1,7 +1,14 @@ /datum/trader/books name = "strange book merchant" origin = "Uzed Buks" - possible_origins = list("Uzed Buks", "Ango & Mango (Still not a fruit shop stop wizh so many asking!)", "Prepipipi's Gently Used Books", "real-books.com.au", "We Sell Paper Wizh Words On", "Meeeena's Paper Recycling") + possible_origins = list( + "Uzed Buks", + "Ango & Mango (Still not a fruit shop stop wizh so many asking!)", + "Prepipipi's Gently Used Books", + "real-books.com.au", + "We Sell Paper Wizh Words On", + "Meeeena's Paper Recycling" + ) trade_flags = TRADER_MONEY possible_wanted_items = list() price_rng = 30 @@ -30,17 +37,17 @@ /obj/item/book/skill/medical/anatomy = TRADER_SUBTYPES_ONLY ) - speech = list("hail_generic" = "Yes hello hello! Many fine paperstacks for sale! Please buy!", - "hail_deny" = "Not in! I'm not here! Go away!!", - - "insult_good" = "Zhat hurts friend!", - "insult_bad" = "Ohhhhhh!! Why you picking a fight?! You will lose!", - "compliment_accept" = "You make my ears red you do! Hehehe!", - "compliment_deny" = "Haha! Nice try, but I am not falling for zhe smoozhy talk zhe fourzh time today!", - - "how_much" = "Hmmmmm, I give zhis to you for maybe... VALUE CURRENCY.", - "trade_complete" = "Yesssss zhank you for transactionings!!", - "trade_refuse" = "No! No no no no!", - "trade_blacklist" = "Aaaaaa! No want, no want! Go away!", - "trade_found_unwanted" = "Hmmm, no. Do not want.", - "trade_not_enough" = "Not enough! More! More!") + speech = list( + TRADER_HAIL_GENERIC = "Yes hello hello! Many fine paperstacks for sale! Please buy!", + TRADER_HAIL_DENY = "Not in! I'm not here! Go away!!", + TRADER_NO_GOODS = "No! No no no! Not goods! MONEY!", + TRADER_INSULT_GOOD = "Zhat hurts friend!", + TRADER_INSULT_BAD = "Ohhhhhh!! Why you picking a fight?! You will lose!", + TRADER_COMPLIMENT_ACCEPT = "You make my ears red you do! Hehehe!", + TRADER_COMPLIMENT_DENY = "Haha! Nice try, but I am not falling for zhe smoozhy talk zhe fourzh time today!", + TRADER_HOW_MUCH = "Hmmmmm, I give zhis to you for maybe... " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_TRADE_COMPLETE = "Yesssss zhank you for transactionings!", + TRADER_NO_BLACKLISTED = "Aaaaaa! No want, no want! Go away!", + TRADER_NOT_ENOUGH = "Not enough! More! More!", + TRADER_BRIBE_REFUSAL = "Zhis is a station, stupid!" + ) diff --git a/code/datums/trading/traders/food.dm b/code/datums/trading/traders/food.dm index 6325df8a7f4..2e52282d2e0 100644 --- a/code/datums/trading/traders/food.dm +++ b/code/datums/trading/traders/food.dm @@ -1,28 +1,34 @@ /datum/trader/pizzaria name = "Pizza Shop Employee" - name_language = TRADER_DEFAULT_NAME origin = "Pizzeria" - possible_origins = list("Papa Joe's", "Pizza Ship", "Dominator Pizza", "Little Kaezars", "Pizza Planet", "Cheese Louise", "Little Taste o' Neo-Italy", "Pizza Gestapo") + possible_origins = list( + "Papa Joseph's", + "Pizza Ship", + "Dominator Pizza", + "Little Kaezars", + "Pizza Planet", + "Cheese Louise", + "Little Taste o' Neo-Italy", + "Pizza Gestapo" + ) trade_flags = TRADER_MONEY possible_wanted_items = list() //They are a pizza shop, not a bargainer. possible_trading_items = list(/obj/item/chems/food/sliceable/pizza = TRADER_SUBTYPES_ONLY) - speech = list("hail_generic" = "Hello! Welcome to ORIGIN, may I take your order?", - "hail_deny" = "Beeeep... I'm sorry, your connection has been severed.", - - "trade_complete" = "Thank you for choosing ORIGIN!", - "trade_no_goods" = "I'm sorry but we only take cash.", - "trade_blacklisted" = "Sir that's... highly illegal.", - "trade_not_enough" = "Uhh... that's not enough money for pizza.", - "how_much" = "That pizza will cost you VALUE CURRENCY.", - - "compliment_deny" = "That's a bit forward, don't you think?", - "compliment_accept" = "Thanks, sir! You're very nice!", - "insult_good" = "Please stop that, sir.", - "insult_bad" = "Sir, just because I'm contractually obligated to keep you on the line for a minute doesn't mean I have to take this.", - - "bribe_refusal" = "Uh... thanks for the cash, sir. As long as you're in the area, we'll be here...", - ) + speech = list( + TRADER_HAIL_GENERIC = "Hello! Welcome to " + TRADER_TOKEN_ORIGIN + ", may I take your order?", + TRADER_HAIL_DENY = "Beeeep... I'm sorry, your connection has been severed.", + TRADER_TRADE_COMPLETE = "Thank you for choosing " + TRADER_TOKEN_ORIGIN + "!", + TRADER_NO_GOODS = "I'm sorry but we only take cash.", + TRADER_NO_BLACKLISTED = "Sir that's... highly illegal.", + TRADER_NOT_ENOUGH = "Uhh... that's not enough money for pizza.", + TRADER_HOW_MUCH = "That pizza will cost you " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_COMPLIMENT_DENY = "That's a bit forward, don't you think?", + TRADER_COMPLIMENT_ACCEPT = "Thanks, sir! You're very nice!", + TRADER_INSULT_GOOD = "Please stop that, sir.", + TRADER_INSULT_BAD = "Sir, just because I'm contractually obligated to keep you on the line for a minute doesn't mean I have to take this.", + TRADER_BRIBE_REFUSAL = "Uh... thanks for the cash, sir. As long as you're in the area, we'll be here...", + ) /datum/trader/pizzaria/trade(var/list/offers, var/num, var/turf/location) . = ..() @@ -35,10 +41,13 @@ /datum/trader/ship/chinese name = "Chinese Restaurant" - name_language = TRADER_DEFAULT_NAME origin = "Captain Panda Bistro" - possible_origins = list("888 Shanghai Kitchen", "Mr. Lee's Greater Hong Kong", "The House of the Venerable and Inscrutable Colonel", "Lucky Dragon") - trade_flags = TRADER_MONEY + possible_origins = list( + "888 Shanghai Kitchen", + "Mr. Lee's Greater Hong Kong", + "The House of the Venerable and Inscrutable Colonel", + "Lucky Dragon" + ) possible_wanted_items = list() possible_trading_items = list( /obj/item/chems/food/meatkabob = TRADER_THIS_TYPE, @@ -50,35 +59,35 @@ /obj/item/chems/drinks/dry_ramen = TRADER_THIS_TYPE ) - var/list/fortunes = list("Today it's up to you to create the peacefulness you long for.", - "If you refuse to accept anything but the best, you very often get it.", - "A smile is your passport into the hearts of others.", - "Hard work pays off in the future, laziness pays off now.", - "Change can hurt, but it leads a path to something better.", - "Hidden in a valley beside an open stream- This will be the type of place where you will find your dream.", - "Never give up. You're not a failure if you don't give up.", - "Love can last a lifetime, if you want it to.", - "The love of your life is stepping into your planet this summer.", - "Your ability for accomplishment will follow with success.", - "Please help me, I'm trapped in a fortune cookie factory!") - - speech = list("hail_generic" = "There are two things constant in life, death and Chinese food. How may I help you?", - "hail_deny" = "We do not take orders from rude customers.", - - "trade_complete" = "Thank you, sir, for your patronage.", - "trade_blacklist" = "No, that is very odd. Why would you trade that away?", - "trade_no_goods" = "I only accept money transfers.", - "trade_not_enough" = "No, I am sorry, that is not possible. I need to make a living.", - "how_much" = "I give you ITEM, for VALUE CURRENCY. No more, no less.", - - "compliment_deny" = "That was an odd thing to say. You are very odd.", - "compliment_accept" = "Good philosophy, see good in bad, I like.", - "insult_good" = "As a man said long ago, \"When anger rises, think of the consequences.\" Think on that.", - "insult_bad" = "I do not need to take this from you.", + var/list/fortunes = list( + "Today it's up to you to create the peacefulness you long for.", + "If you refuse to accept anything but the best, you very often get it.", + "A smile is your passport into the hearts of others.", + "Hard work pays off in the future, laziness pays off now.", + "Change can hurt, but it leads a path to something better.", + "Hidden in a valley beside an open stream- This will be the type of place where you will find your dream.", + "Never give up. You're not a failure if you don't give up.", + "Love can last a lifetime, if you want it to.", + "The love of your life is stepping into your planet this summer.", + "Your ability for accomplishment will follow with success.", + "Please help me, I'm trapped in a fortune cookie factory!" + ) - "bribe_refusal" = "Hm... I'll think about it.", - "bribe_accept" = "Oh yes! I think I'll stay a few more minutes, then.", - ) + speech = list( + TRADER_HAIL_GENERIC = "There are two things constant in life, death and Chinese food. How may I help you?", + TRADER_HAIL_DENY = "We do not take orders from rude customers.", + TRADER_TRADE_COMPLETE = "Thank you, sir, for your patronage.", + TRADER_NO_BLACKLISTED = "No, that is very odd. Why would you trade that away?", + TRADER_NO_GOODS = "I only accept money transfers.", + TRADER_NOT_ENOUGH = "No, I am sorry, that is not possible. I need to make a living.", + TRADER_HOW_MUCH = "I give you " + TRADER_TOKEN_ITEM + ", for " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ". No more, no less.", + TRADER_COMPLIMENT_DENY = "That was an odd thing to say. You are very odd.", + TRADER_COMPLIMENT_ACCEPT = "Good philosophy, see good in bad, I like.", + TRADER_INSULT_GOOD = "As a man said long ago, \"When anger rises, think of the consequences.\" Think on that.", + TRADER_INSULT_BAD = "I do not need to take this from you.", + TRADER_BRIBE_REFUSAL = "Hm... I'll think about it.", + TRADER_BRIBE_ACCEPT = "Oh yes! I think I'll stay a few more minutes, then.", + ) /datum/trader/ship/chinese/trade(var/list/offers, var/num, var/turf/location) . = ..() @@ -89,8 +98,15 @@ /datum/trader/grocery name = "Grocer" - name_language = TRADER_DEFAULT_NAME - possible_origins = list("HyTee", "Kreugars", "Spaceway", "Privaxs", "FutureValue", "Phyvendyme", "Seller's Market") + possible_origins = list( + "HyTee", + "Kreugars", + "Spaceway", + "Privaxs", + "FutureValue", + "Phyvendyme", + "Seller's Market" + ) trade_flags = TRADER_MONEY possible_trading_items = list( @@ -98,7 +114,6 @@ /obj/item/chems/drinks/cans = TRADER_SUBTYPES_ONLY, /obj/item/chems/drinks/bottle = TRADER_SUBTYPES_ONLY, /obj/item/chems/drinks/bottle/small = TRADER_BLACKLIST, - /obj/item/chems/food/checker = TRADER_BLACKLIST_ALL, /obj/item/chems/food/fruit_slice = TRADER_BLACKLIST, /obj/item/chems/food/slice = TRADER_BLACKLIST_ALL, /obj/item/chems/food/grown = TRADER_BLACKLIST_ALL, @@ -108,45 +123,47 @@ /obj/item/chems/food/variable = TRADER_BLACKLIST_ALL ) - speech = list("hail_generic" = "Hello, welcome to ORIGIN, grocery store of the future!", - "hail_deny" = "I'm sorry, we've blacklisted your communications due to rude behavior.", - - "trade_complete" = "Thank you for shopping at ORIGIN!", - "trade_blacklist" = "I... wow, that's... no, sir. No.", - "trade_no_goods" = "ORIGIN only accepts cash, sir.", - "trade_not_enough" = "That is not enough money, sir.", - "how_much" = "Sir, that'll cost you VALUE CURRENCY. Will that be all?", - - "compliment_deny" = "Sir, this is a professional environment. Please don't make me get my manager.", - "compliment_accept" = "Thank you, sir!", - "insult_good" = "Sir, please do not make a scene.", - "insult_bad" = "Sir, I WILL get my manager if you don't calm down.", - - "bribe_refusal" = "Of course sir! ORIGIN is always here for you!", - ) + speech = list( + TRADER_HAIL_GENERIC = "Hello, welcome to " + TRADER_TOKEN_ORIGIN + ", grocery store of the future!", + TRADER_HAIL_DENY = "I'm sorry, we've blacklisted your communications due to rude behavior.", + TRADER_TRADE_COMPLETE = "Thank you for shopping at " + TRADER_TOKEN_ORIGIN + "!", + TRADER_NO_BLACKLISTED = "I... wow, that's... no, sir. No.", + TRADER_NO_GOODS = TRADER_TOKEN_ORIGIN + " only accepts cash, sir.", + TRADER_NOT_ENOUGH = "That is not enough money, sir.", + TRADER_HOW_MUCH = "Sir, that'll cost you " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ". Will that be all?", + TRADER_COMPLIMENT_DENY = "Sir, this is a professional environment. Please don't make me get my manager.", + TRADER_COMPLIMENT_ACCEPT = "Thank you, sir!", + TRADER_INSULT_GOOD = "Sir, please do not make a scene.", + TRADER_INSULT_BAD = "Sir, I WILL get my manager if you don't calm down.", + TRADER_BRIBE_REFUSAL = "Of course sir! " + TRADER_TOKEN_ORIGIN + " is always here for you!", + ) /datum/trader/bakery name = "Pastry Chef" - name_language = TRADER_DEFAULT_NAME origin = "Bakery" - possible_origins = list("Cakes By Design", "Corner Bakery Local", "My Favorite Cake & Pastry Cafe", "Mama Joes Bakery", "Sprinkles and Fun", "Cakestrosity") - - speech = list("hail_generic" = "Hello, welcome to ORIGIN! We serve baked goods, including pies, cakes, and anything sweet!", - "hail_deny" = "Our food is a privilege, not a right. Goodbye.", - - "trade_complete" = "Thank you for your purchase! Come again if you're hungry for more!", - "trade_blacklist" = "We only accept money. Not... that.", - "trade_no_goods" = "Cash for cakes! That's our business!", - "trade_not_enough" = "Our dishes are much more expensive than that, sir.", - "how_much" = "That lovely dish will cost you VALUE CURRENCY.", - - "compliment_deny" = "Oh wow, how nice of you...", - "compliment_accept" = "You're almost as sweet as my pies!", - "insult_good" = "My pies are NOT knockoffs!", - "insult_bad" = "Well, aren't you a sour apple?", + possible_origins = list( + "Cakes By Design", + "Corner Bakery Local", + "My Favorite Cake & Pastry Cafe", + "Mama Joes Bakery", + "Sprinkles and Fun", + "Cakestrosity" + ) - "bribe_refusal" = "Oh ho ho! I'd never think of taking ORIGIN on the road!", - ) + speech = list( + TRADER_HAIL_GENERIC = "Hello, welcome to " + TRADER_TOKEN_ORIGIN + "! We serve baked goods, including pies, cakes, and anything sweet!", + TRADER_HAIL_DENY = "Our food is a privilege, not a right. Goodbye.", + TRADER_TRADE_COMPLETE = "Thank you for your purchase! Come again if you're hungry for more!", + TRADER_NO_BLACKLISTED = "We only accept money. Not... that.", + TRADER_NO_GOODS = "Cash for cakes! That's our business!", + TRADER_NOT_ENOUGH = "Our dishes are much more expensive than that, sir.", + TRADER_HOW_MUCH = "That lovely dish will cost you " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_COMPLIMENT_DENY = "Oh wow, how nice of you...", + TRADER_COMPLIMENT_ACCEPT = "You're almost as sweet as my pies!", + TRADER_INSULT_GOOD = "My pies are NOT knockoffs!", + TRADER_INSULT_BAD = "Well, aren't you a sour apple?", + TRADER_BRIBE_REFUSAL = "Oh ho ho! I'd never think of taking " + TRADER_TOKEN_ORIGIN + " on the road!", + ) possible_trading_items = list( /obj/item/chems/food/slice/birthdaycake/filled = TRADER_THIS_TYPE, /obj/item/chems/food/slice/carrotcake/filled = TRADER_THIS_TYPE, diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index e8f1b0b2df7..e4fd109c083 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -1,27 +1,31 @@ /datum/trader/ship/toyshop name = "Toy Shop Employee" - name_language = TRADER_DEFAULT_NAME origin = "Toy Shop" - trade_flags = TRADER_GOODS|TRADER_MONEY|TRADER_WANTED_ONLY - possible_origins = list("Toys R Ours", "LET'S GO", "Kay-Cee Toys", "Build-a-Cat", "Magic Box", "The Positronic's Dungeon and Baseball Card Shop") - speech = list("hail_generic" = "Uhh... hello? Welcome to ORIGIN, I hope you have a, uhh.... good shopping trip.", - "hail_deny" = "Nah, you're not allowed here. At all", - - "trade_complete" = "Thanks for shopping... here... at ORIGIN.", - "trade_blacklist" = "Uuuhhh.... no.", - "trade_found_unwanted" = "Nah! That's not what I'm looking for. Something rarer.", - "trade_not_enough" = "Just 'cause they're made of cardboard doesn't mean they don't cost money...", - "how_much" = "Uhh... I'm thinking like... VALUE. Right? Or something rare that complements my interest.", - "what_want" = "Ummmm..... I guess I want", - - "compliment_deny" = "Ha! Very funny! You should write your own television show.", - "compliment_accept" = "Why yes, I do work out.", - "insult_good" = "Well, well, well. Guess we learned who was the troll here.", - "insult_bad" = "I've already written a nasty Spacebook post in my mind about you.", - - "bribe_refusal" = "Nah. I need to get moving as soon as uhh... possible.", - "bribe_accept" = "You know what, I wasn't doing anything for TIME minutes anyways.", - ) + trade_flags = TRADER_GOODS | TRADER_MONEY | TRADER_WANTED_ONLY | TRADER_BRIBABLE + possible_origins = list( + "Toys R Ours", + "LET'S GO", + "Kay-Cee Toys", + "Build-a-Cat", + "Magic Box", + "The Positronic's Dungeon and Baseball Card Shop" + ) + speech = list( + TRADER_HAIL_GENERIC = "Uhh... hello? Welcome to " + TRADER_TOKEN_ORIGIN + ", I hope you have a, uhh.... good shopping trip.", + TRADER_HAIL_DENY = "Nah, you're not allowed here. At all", + TRADER_TRADE_COMPLETE = "Thanks for shopping... here... at " + TRADER_TOKEN_ORIGIN + ".", + TRADER_NO_BLACKLISTED = "Uuuhhh.... no.", + TRADER_FOUND_UNWANTED = "Nah! That's not what I'm looking for. Something rarer.", + TRADER_NOT_ENOUGH = "Just 'cause they're made of cardboard doesn't mean they don't cost money...", + TRADER_HOW_MUCH = "Uhh... I'm thinking like... " + TRADER_TOKEN_VALUE + ". Right? Or something rare that complements my interest.", + TRADER_WHAT_WANT = "Ummmm..... I guess I want", + TRADER_COMPLIMENT_DENY = "Ha! Very funny! You should write your own television show.", + TRADER_COMPLIMENT_ACCEPT = "Why yes, I do work out.", + TRADER_INSULT_GOOD = "Well, well, well. Guess we learned who was the troll here.", + TRADER_INSULT_BAD = "I've already written a nasty Spacebook post in my mind about you.", + TRADER_BRIBE_REFUSAL = "Nah. I need to get moving as soon as uhh... possible.", + TRADER_BRIBE_ACCEPT = "You know what, I wasn't doing anything for " + TRADER_TOKEN_TIME + " minutes anyways.", + ) possible_wanted_items = list( /obj/item/toy/figure = TRADER_THIS_TYPE, @@ -49,27 +53,32 @@ /datum/trader/ship/electronics name = "Electronic Shop Employee" - name_language = TRADER_DEFAULT_NAME origin = "Electronic Shop" - possible_origins = list("Best Sale", "Overstore", "Oldegg", "Circuit Citadel", "Silicon Village", "Positronic Solutions LLC", "Sunvolt Inc.") - - speech = list("hail_generic" = "Hello, sir! Welcome to ORIGIN, I hope you find what you are looking for.", - "hail_deny" = "Your call has been disconnected.", - - "trade_complete" = "Thank you for shopping at ORIGIN, would you like to get the extended warranty as well?", - "trade_blacklist" = "Sir, this is a /electronics/ store.", - "trade_no_goods" = "As much as I'd love to buy that from you, I can't.", - "trade_not_enough" = "Your offer isn't adequate, sir.", - "how_much" = "Your total comes out to VALUE CURRENCY.", - - "compliment_deny" = "Hahaha! Yeah... funny...", - "compliment_accept" = "That's very nice of you!", - "insult_good" = "That was uncalled for, sir. Don't make me get my manager.", - "insult_bad" = "Sir, I am allowed to hang up the phone if you continue, sir.", + possible_origins = list( + "Best Sale", + "Overstore", + "Oldegg", + "Circuit Citadel", + "Silicon Village", + "Positronic Solutions LLC", + "Sunvolt Inc." + ) - "bribe_refusal" = "Sorry, sir, but I can't really do that.", - "bribe_accept" = "Why not! Glad to be here for a few more minutes.", - ) + speech = list( + TRADER_HAIL_GENERIC = "Hello, sir! Welcome to " + TRADER_TOKEN_ORIGIN + ", I hope you find what you are looking for.", + TRADER_HAIL_DENY = "Your call has been disconnected.", + TRADER_TRADE_COMPLETE = "Thank you for shopping at " + TRADER_TOKEN_ORIGIN + ", would you like to get the extended warranty as well?", + TRADER_NO_BLACKLISTED = "Sir, this is a /electronics/ store.", + TRADER_NO_GOODS = "As much as I'd love to buy that from you, I can't.", + TRADER_NOT_ENOUGH = "Your offer isn't adequate, sir.", + TRADER_HOW_MUCH = "Your total comes out to " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_COMPLIMENT_DENY = "Hahaha! Yeah... funny...", + TRADER_COMPLIMENT_ACCEPT = "That's very nice of you!", + TRADER_INSULT_GOOD = "That was uncalled for, sir. Don't make me get my manager.", + TRADER_INSULT_BAD = "Sir, I am allowed to hang up the phone if you continue, sir.", + TRADER_BRIBE_REFUSAL = "Sorry, sir, but I can't really do that.", + TRADER_BRIBE_ACCEPT = "Why not! Glad to be here for a few more minutes.", + ) possible_trading_items = list( /obj/item/stock_parts/computer/battery_module = TRADER_SUBTYPES_ONLY, @@ -93,30 +102,31 @@ /* Clothing stores: each a different type. A hat/glove store, a shoe store, and a jumpsuit store. */ - /datum/trader/ship/clothingshop name = "Clothing Store Employee" - name_language = TRADER_DEFAULT_NAME origin = "Clothing Store" - possible_origins = list("Space Eagle", "Banana Democracy", "Forever 22", "Textiles Factory Warehouse Outlet", "Blocks Brothers") - speech = list("hail_generic" = "Hello, sir! Welcome to ORIGIN!", - "hail_Vox" = "Well hello, sir! I don't believe we have any clothes that fit you... but you can still look!", - "hail_deny" = "We do not trade with rude customers. Consider yourself blacklisted.", - - "trade_complete" = "Thank you for shopping at ORIGIN. Remember: We cannot accept returns without the original tags!", - "trade_blacklist" = "Hm, how about no?", - "trade_no_goods" = "We don't buy, sir. Only sell.", - "trade_not_enough" = "Sorry, ORIGIN policy to not accept trades below our marked prices.", - "how_much" = "Your total comes out to VALUE CURRENCY.", - - "compliment_deny" = "Excuse me?", - "compliment_accept" = "Aw, you're so nice!", - "insult_good" = "Sir.", - "insult_bad" = "Wow. I don't have to take this.", - - "bribe_refusal" = "ORIGIN policy clearly states we cannot stay for more than the designated time.", - "bribe_accept" = "Hm.... sure! We'll have a few minutes of 'engine troubles'.", - ) + possible_origins = list( + "Space Eagle", + "Banana Democracy", + "Forever 22", + "Textiles Factory Warehouse Outlet", + "Blocks Brothers" + ) + speech = list( + TRADER_HAIL_GENERIC = "Hello, sir! Welcome to " + TRADER_TOKEN_ORIGIN + "!", + TRADER_HAIL_DENY = "We do not trade with rude customers. Consider yourself blacklisted.", + TRADER_TRADE_COMPLETE = "Thank you for shopping at " + TRADER_TOKEN_ORIGIN + ". Remember: We cannot accept returns without the original tags!", + TRADER_NO_BLACKLISTED = "Hm, how about no?", + TRADER_NO_GOODS = "We don't buy, sir. Only sell.", + TRADER_NOT_ENOUGH = "Sorry, " + TRADER_TOKEN_ORIGIN + " policy to not accept trades below our marked prices.", + TRADER_HOW_MUCH = "Your total comes out to " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_COMPLIMENT_DENY = "Excuse me?", + TRADER_COMPLIMENT_ACCEPT = "Aw, you're so nice!", + TRADER_INSULT_GOOD = "Sir.", + TRADER_INSULT_BAD = "Wow. I don't have to take this.", + TRADER_BRIBE_REFUSAL = TRADER_TOKEN_ORIGIN + " policy clearly states we cannot stay for more than the designated time.", + TRADER_BRIBE_ACCEPT = "Hm.... sure! We'll have a few minutes of 'engine troubles'.", + ) possible_trading_items = list( /obj/item/clothing/under = TRADER_SUBTYPES_ONLY, @@ -137,7 +147,13 @@ ) /datum/trader/ship/clothingshop/shoes - possible_origins = list("Foot Safe", "Paysmall", "Popular Footwear", "Grimbly's Shoes", "Right Steps") + possible_origins = list( + "Foot Safe", + "Paysmall", + "Popular Footwear", + "Grimbly's Shoes", + "Right Steps" + ) possible_trading_items = list( /obj/item/clothing/shoes = TRADER_SUBTYPES_ONLY, /obj/item/clothing/shoes/chameleon = TRADER_BLACKLIST, @@ -151,7 +167,12 @@ ) /datum/trader/ship/clothingshop/hatglovesaccessories - possible_origins = list("Baldie's Hats and Accessories", "The Right Fit", "Like a Glove", "Space Fashion") + possible_origins = list( + "Baldie's Hats and Accessories", + "The Right Fit", + "Like a Glove", + "Space Fashion" + ) possible_trading_items = list( /obj/item/clothing/accessory = TRADER_ALL, /obj/item/clothing/accessory/badge = TRADER_BLACKLIST_ALL, @@ -186,116 +207,130 @@ Sells devices, odds and ends, and medical stuff */ /datum/trader/devices name = "Drugstore Employee" - name_language = TRADER_DEFAULT_NAME origin = "Drugstore" - possible_origins = list("Buy 'n Save", "Drug Carnival", "C&B", "Fentles", "Dr. Goods", "Beevees", "McGillicuddy's") + possible_origins = list( + "Buy 'n Save", + "Drug Carnival", + "C&B", + "Fentles", + "Dr. Goods", + "Beevees", + "McGillicuddy's" + ) possible_trading_items = list( - /obj/item/flashlight = TRADER_ALL, - /obj/item/kit/paint = TRADER_SUBTYPES_ONLY, - /obj/item/aicard = TRADER_THIS_TYPE, - /obj/item/binoculars = TRADER_THIS_TYPE, - /obj/item/cable_painter = TRADER_THIS_TYPE, - /obj/item/flash = TRADER_THIS_TYPE, - /obj/item/paint_sprayer = TRADER_THIS_TYPE, - /obj/item/multitool = TRADER_THIS_TYPE, - /obj/item/lightreplacer = TRADER_THIS_TYPE, - /obj/item/megaphone = TRADER_THIS_TYPE, - /obj/item/paicard = TRADER_THIS_TYPE, - /obj/item/scanner/health = TRADER_THIS_TYPE, - /obj/item/scanner/breath = TRADER_THIS_TYPE, - /obj/item/scanner/gas = TRADER_ALL, - /obj/item/scanner/spectrometer = TRADER_ALL, - /obj/item/scanner/reagent = TRADER_ALL, - /obj/item/scanner/xenobio = TRADER_THIS_TYPE, - /obj/item/suit_cooling_unit = TRADER_THIS_TYPE, - /obj/item/t_scanner = TRADER_THIS_TYPE, - /obj/item/taperecorder = TRADER_THIS_TYPE, - /obj/item/batterer = TRADER_THIS_TYPE, - /obj/item/synthesized_instrument/violin = TRADER_THIS_TYPE, - /obj/item/hailer = TRADER_THIS_TYPE, - /obj/item/uv_light = TRADER_THIS_TYPE, - /obj/item/mmi = TRADER_ALL, - /obj/item/robotanalyzer = TRADER_THIS_TYPE, - /obj/item/chems/toner_cartridge = TRADER_THIS_TYPE, - /obj/item/camera_film = TRADER_THIS_TYPE, - /obj/item/camera = TRADER_THIS_TYPE, - /obj/item/destTagger = TRADER_THIS_TYPE, - /obj/item/gps = TRADER_THIS_TYPE, - /obj/item/measuring_tape = TRADER_THIS_TYPE, - /obj/item/ano_scanner = TRADER_THIS_TYPE, - /obj/item/core_sampler = TRADER_THIS_TYPE, - /obj/item/depth_scanner = TRADER_THIS_TYPE, - /obj/item/pinpointer/radio = TRADER_THIS_TYPE, - /obj/item/stack/medical/advanced = TRADER_BLACKLIST - ) - speech = list("hail_generic" = "Hello, hello! Bits and bobs and everything in between, I hope you find what you're looking for!", - "hail_silicon" = "Ah! Hello, robot. We only sell things that, ah.... people can hold in their hands, unfortunately. You are still allowed to buy, though!", - "hail_deny" = "Oh no. I don't want to deal with YOU.", - - "trade_complete" = "Thank you! Now remember, there isn't any return policy here, so be careful with that!", - "trade_blacklist" = "Hm. Well that would be illegal, so no.", - "trade_no_goods" = "I'm sorry, I only sell goods.", - "trade_not_enough" = "Gotta pay more than that to get that!", - "how_much" = "Well... I bought it for a lot, but I'll give it to you for VALUE.", - - "compliment_deny" = "Uh... did you say something?", - "compliment_accept" = "Mhm! I can agree to that!", - "insult_good" = "Wow, where was that coming from?", - "insult_bad" = "Don't make me blacklist your connection.", - - "bribe_refusal" = "Well, as much as I'd love to say 'yes', you realize I operate on a station, correct?", - ) + /obj/item/flashlight = TRADER_ALL, + /obj/item/kit/paint = TRADER_SUBTYPES_ONLY, + /obj/item/aicard = TRADER_THIS_TYPE, + /obj/item/binoculars = TRADER_THIS_TYPE, + /obj/item/cable_painter = TRADER_THIS_TYPE, + /obj/item/flash = TRADER_THIS_TYPE, + /obj/item/paint_sprayer = TRADER_THIS_TYPE, + /obj/item/multitool = TRADER_THIS_TYPE, + /obj/item/lightreplacer = TRADER_THIS_TYPE, + /obj/item/megaphone = TRADER_THIS_TYPE, + /obj/item/paicard = TRADER_THIS_TYPE, + /obj/item/scanner/health = TRADER_THIS_TYPE, + /obj/item/scanner/breath = TRADER_THIS_TYPE, + /obj/item/scanner/gas = TRADER_ALL, + /obj/item/scanner/spectrometer = TRADER_ALL, + /obj/item/scanner/reagent = TRADER_ALL, + /obj/item/scanner/xenobio = TRADER_THIS_TYPE, + /obj/item/suit_cooling_unit = TRADER_THIS_TYPE, + /obj/item/t_scanner = TRADER_THIS_TYPE, + /obj/item/taperecorder = TRADER_THIS_TYPE, + /obj/item/batterer = TRADER_THIS_TYPE, + /obj/item/synthesized_instrument/violin = TRADER_THIS_TYPE, + /obj/item/hailer = TRADER_THIS_TYPE, + /obj/item/uv_light = TRADER_THIS_TYPE, + /obj/item/organ/internal/brain_interface = TRADER_SUBTYPES_ONLY, + /obj/item/robotanalyzer = TRADER_THIS_TYPE, + /obj/item/chems/toner_cartridge = TRADER_THIS_TYPE, + /obj/item/camera_film = TRADER_THIS_TYPE, + /obj/item/camera = TRADER_THIS_TYPE, + /obj/item/destTagger = TRADER_THIS_TYPE, + /obj/item/gps = TRADER_THIS_TYPE, + /obj/item/measuring_tape = TRADER_THIS_TYPE, + /obj/item/ano_scanner = TRADER_THIS_TYPE, + /obj/item/core_sampler = TRADER_THIS_TYPE, + /obj/item/depth_scanner = TRADER_THIS_TYPE, + /obj/item/pinpointer/radio = TRADER_THIS_TYPE, + /obj/item/stack/medical/advanced = TRADER_BLACKLIST + ) + speech = list( + TRADER_HAIL_GENERIC = "Hello, hello! Bits and bobs and everything in between, I hope you find what you're looking for!", + TRADER_HAIL_SILICON = "Ah! Hello, robot. We only sell things that, ah.... people can hold in their hands, unfortunately. You are still allowed to buy, though!", + TRADER_HAIL_DENY = "Oh no. I don't want to deal with YOU.", + TRADER_TRADE_COMPLETE = "Thank you! Now remember, there isn't any return policy here, so be careful with that!", + TRADER_NO_BLACKLISTED = "Hm. Well that would be illegal, so no.", + TRADER_NO_GOODS = "I'm sorry, I only sell goods.", + TRADER_NOT_ENOUGH = "Gotta pay more than that to get that!", + TRADER_HOW_MUCH = "Well... I bought it for a lot, but I'll give it to you for " + TRADER_TOKEN_VALUE + ".", + TRADER_COMPLIMENT_DENY = "Uh... did you say something?", + TRADER_COMPLIMENT_ACCEPT = "Mhm! I can agree to that!", + TRADER_INSULT_GOOD = "Wow, where was that coming from?", + TRADER_INSULT_BAD = "Don't make me blacklist your connection.", + TRADER_BRIBE_REFUSAL = "Well, as much as I'd love to say 'yes', you realize I operate on a station, correct?", + ) /datum/trader/ship/robots name = "Robot Seller" - name_language = TRADER_DEFAULT_NAME origin = "Robot Store" - possible_origins = list("AI for the Straight Guy", "Mechanical Buddies", "Bot Chop Shop", "Omni Consumer Projects") + possible_origins = list( + "AI for the Straight Guy", + "Mechanical Buddies", + "Bot Chop Shop", + "Omni Consumer Projects" + ) possible_trading_items = list( /obj/item/bot_kit = TRADER_THIS_TYPE, /obj/item/paicard = TRADER_THIS_TYPE, /obj/item/aicard = TRADER_THIS_TYPE, /mob/living/bot = TRADER_SUBTYPES_ONLY ) - speech = list("hail_generic" = "Welcome to ORIGIN! Let me walk you through our fine robotic selection!", - "hail_silicon" = "Welcome to ORIGIN! Let- oh, you're a synth! Well, your money is good anyway. Welcome, welcome!", - "hail_deny" = "ORIGIN no longer wants to speak to you.", - - "trade_complete" = "I hope you enjoy your new robot!", - "trade_blacklist"= "I work with robots, sir. Not that.", - "trade_no_goods" = "You gotta buy the robots, sir. I don't do trades.", - "trade_not_enough" = "You're coming up short on cash.", - "how_much" = "My fine selection of robots will cost you VALUE!", - - "compliment_deny"= "Well, I almost believed that.", - "compliment_accept"= "Thank you! My craftsmanship is my life.", - "insult_good" = "Uncalled for.... uncalled for.", - "insult_bad" = "I've programmed AI better at insulting than you!", - - "bribe_refusal" = "I've got too many customers waiting in other sectors, sorry.", - "bribe_accept" = "Hm. Don't keep me waiting too long, though.", - ) + speech = list( + TRADER_HAIL_GENERIC = "Welcome to " + TRADER_TOKEN_ORIGIN + "! Let me walk you through our fine robotic selection!", + TRADER_HAIL_SILICON = "Welcome to " + TRADER_TOKEN_ORIGIN + "! Let- oh, you're a synth! Well, your money is good anyway. Welcome, welcome!", + TRADER_HAIL_DENY = TRADER_TOKEN_ORIGIN + " no longer wants to speak to you.", + TRADER_TRADE_COMPLETE = "I hope you enjoy your new robot!", + TRADER_NO_BLACKLISTED = "I work with robots, sir. Not that.", + TRADER_NO_GOODS = "You gotta buy the robots, sir. I don't do trades.", + TRADER_NOT_ENOUGH = "You're coming up short on cash.", + TRADER_HOW_MUCH = "My fine selection of robots will cost you " + TRADER_TOKEN_VALUE + "!", + TRADER_COMPLIMENT_DENY = "Well, I almost believed that.", + TRADER_COMPLIMENT_ACCEPT = "Thank you! My craftsmanship is my life.", + TRADER_INSULT_GOOD = "Uncalled for.... uncalled for.", + TRADER_INSULT_BAD = "I've programmed AI better at insulting than you!", + TRADER_BRIBE_REFUSAL = "I've got too many customers waiting in other sectors, sorry.", + TRADER_BRIBE_ACCEPT = "Hm. Don't keep me waiting too long, though.", + ) /datum/trader/xeno_shop name = "Xenolife Collector" origin = "CSV Not a Poacher" - trade_flags = TRADER_GOODS|TRADER_MONEY|TRADER_WANTED_ONLY|TRADER_WANTED_ALL - possible_origins = list("XenoHugs", "Exotic Specimen Acquisition", "Skinner Catering Reseller", "Corporate Companionship Division", "Lonely Pete's Exotic Companionship","Space Wei's Exotic Cuisine") - speech = list("hail_generic" = "Welcome! We are always looking to acquire more exotic life forms.", - "hail_deny" = "We no longer wish to speak to you. Please contact our legal representative if you wish to rectify this.", - - "trade_complete" = "Remember to give them attention and food. They are living beings, and you should treat them like so.", - "trade_blacklist" = "Legally I can't do that. Morally... well, I refuse to do that.", - "trade_found_unwanted" = "I only want animals. I don't need food or shiny things. I'm looking for specific ones, at that. Ones I already have the cage and food for.", - "trade_not_enough" = "I'd give you this for free, but I need the money to feed the specimens. So you must pay in full.", - "how_much" = "This is a good choice. I believe it will cost you VALUE CURRENCY.", - "what_want" = "I have the facilities, currently, to support", - - "compliment_deny" = "According to customs on 34 planets I traded with, this constitutes sexual harrasment.", - "compliment_accept" = "Thank you. I needed that.", - "insult_good" = "No need to be upset, I believe we can do business.", - "insult_bad" = "I have traded dogs with more bark than that.", - ) + trade_flags = TRADER_GOODS | TRADER_MONEY | TRADER_WANTED_ONLY | TRADER_WANTED_ALL + possible_origins = list( + "XenoHugs", + "Exotic Specimen Acquisition", + "Skinner Catering Reseller", + "Corporate Companionship Division", + "Lonely Pete's Exotic Companionship", + "Space Wei's Exotic Cuisine" + ) + speech = list( + TRADER_HAIL_GENERIC = "Welcome! We are always looking to acquire more exotic life forms.", + TRADER_HAIL_DENY = "We no longer wish to speak to you. Please contact our legal representative if you wish to rectify this.", + TRADER_TRADE_COMPLETE = "Remember to give them attention and food. They are living beings, and you should treat them like so.", + TRADER_NO_BLACKLISTED = "Legally I can't do that. Morally... well, I refuse to do that.", + TRADER_FOUND_UNWANTED = "I only want animals. I don't need food or shiny things. I'm looking for specific ones, at that. Ones I already have the cage and food for.", + TRADER_NOT_ENOUGH = "I'd give you this for free, but I need the money to feed the specimens. So you must pay in full.", + TRADER_HOW_MUCH = "This is a good choice. I believe it will cost you " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_WHAT_WANT = "I have the facilities, currently, to support", + TRADER_COMPLIMENT_DENY = "According to customs on 34 planets I traded with, this constitutes sexual harassment.", + TRADER_COMPLIMENT_ACCEPT = "Thank you. I needed that.", + TRADER_INSULT_GOOD = "No need to be upset, I believe we can do business.", + TRADER_INSULT_BAD = "I have traded dogs with more bark than that.", + TRADER_BRIBE_REFUSAL = "Uh, this is a station. I'm not going anywhere." + ) possible_wanted_items = list( /mob/living/simple_animal/tindalos = TRADER_THIS_TYPE, @@ -316,25 +351,31 @@ Sells devices, odds and ends, and medical stuff /datum/trader/medical name = "Medical Supplier" origin = "Infirmary of CSV Iniquity" - trade_flags = TRADER_GOODS|TRADER_MONEY|TRADER_WANTED_ONLY + trade_flags = TRADER_GOODS | TRADER_MONEY | TRADER_WANTED_ONLY want_multiplier = 1.2 margin = 2 - possible_origins = list("Dr.Krieger's Practice", "Legit Medical Supplies (No Refund)", "Mom's & Pop's Addictive Opoids", "Legitimate Pharmaceutical Firm", "Designer Drugs by Lil Xanny") - speech = list("hail_generic" = "Huh? How'd you get this number?! Oh well, if you wanna talk biz, I'm listening.", - "hail_deny" = "This is an automated message. Feel free to fuck the right off after the buzzer. *buzz*", - - "trade_complete" = "Good to have business with ya. Remember, no refunds.", - "trade_blacklist" = "Whoa whoa, I don't want this shit, put it away.", - "trade_found_unwanted" = "What the hell do you expect me to do with this junk?", - "trade_not_enough" = "Sorry, pal, full payment upfront, I don't write the rules. Well, I do, but that's beside the point.", - "how_much" = "Hmm, this is one damn fine item, but I'll part with it for VALUE CURRENCY.", - "what_want" = "I could always use some fucking", - - "compliment_deny" = "Haha, how nice of you. Why don't you go fall in an elevator shaft.", - "compliment_accept" = "Damn right I'm awesome, tell me more.", - "insult_good" = "Damn, pal, no need to get snippy.", - "insult_bad" = "*muffled laughter* Sorry, was that you trying to talk shit? Adorable.", - ) + possible_origins = list( + "Dr.Krieger's Practice", + "Legit Medical Supplies (No Refunds)", + "Mom's & Pop's Addictive Opoids", + "Legitimate Pharmaceutical Firm", + "Designer Drugs by Lil Xanny" + ) + speech = list( + TRADER_HAIL_GENERIC = "Huh? How'd you get this number?! Oh well, if you wanna talk biz, I'm listening.", + TRADER_HAIL_DENY = "This is an automated message. Feel free to fuck the right off after the buzzer. *buzz*", + TRADER_TRADE_COMPLETE = "Good to have business with ya. Remember, no refunds.", + TRADER_NO_BLACKLISTED = "Whoa whoa, I don't want this shit, put it away.", + TRADER_FOUND_UNWANTED = "What the hell do you expect me to do with this junk?", + TRADER_NOT_ENOUGH = "Sorry, pal, full payment upfront, I don't write the rules. Well, I do, but that's beside the point.", + TRADER_HOW_MUCH = "Hmm, this is one damn fine item, but I'll part with it for " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_WHAT_WANT = "I could always use some fucking", + TRADER_COMPLIMENT_DENY = "Haha, how nice of you. Why don't you go fall in an elevator shaft.", + TRADER_COMPLIMENT_ACCEPT = "Damn right I'm awesome, tell me more.", + TRADER_INSULT_GOOD = "Damn, pal, no need to get snippy.", + TRADER_INSULT_BAD = "*muffled laughter* Sorry, was that you trying to talk shit? Adorable.", + TRADER_BRIBE_REFUSAL = "Man I live here, I'm not leaving anytime soon." + ) possible_wanted_items = list( /obj/item/chems/drinks/bottle = TRADER_THIS_TYPE, @@ -371,25 +412,30 @@ Sells devices, odds and ends, and medical stuff /datum/trader/mining name = "Rock'n'Drill Mining Inc" origin = "Automated Smelter AH-532" - trade_flags = TRADER_GOODS|TRADER_MONEY|TRADER_WANTED_ONLY|TRADER_WANTED_ALL + trade_flags = TRADER_GOODS | TRADER_MONEY | TRADER_WANTED_ONLY | TRADER_WANTED_ALL want_multiplier = 1.5 margin = 2 - possible_origins = list("Automated Smelter AH-532", "CMV Locust", "The Galactic Foundry Company", "Crucible LLC") - speech = list("hail_generic" = "Welcome to R'n'D Mining. Please place your order.", - "hail_deny" = "There is no response on the line.", - - "trade_complete" = "Transaction complete. Please use our services again", - "trade_blacklist" = "Whoa whoa, I don't want this shit, put it away.", - "trade_found_unwanted" = "Sorry, we are currently not looking to purchase these items.", - "trade_not_enough" = "Sorry, this is an insufficient sum for this purchase.", - "how_much" = "For ONE entry of ITEM the price would be VALUE CURRENCY.", - "what_want" = "We are currently looking to procure", - - "compliment_deny" = "I am afraid this is beyond my competency.", - "compliment_accept" = "Thank you.", - "insult_good" = "Alright, we will reconsider the terms.", - "insult_bad" = "This is not acceptable, please cease.", - ) + possible_origins = list( + "Automated Smelter AH-532", + "CMV Locust", + "The Galactic Foundry Company", + "Crucible LLC" + ) + speech = list( + TRADER_HAIL_GENERIC = "Welcome to R'n'D Mining. Please place your order.", + TRADER_HAIL_DENY = "There is no response on the line.", + TRADER_TRADE_COMPLETE = "Transaction complete. Please use our services again", + TRADER_NO_BLACKLISTED = "Whoa whoa, I don't want this shit, put it away.", + TRADER_FOUND_UNWANTED = "Sorry, we are currently not looking to purchase these items.", + TRADER_NOT_ENOUGH = "Sorry, this is an insufficient sum for this purchase.", + TRADER_HOW_MUCH = "For ONE entry of " + TRADER_TOKEN_ITEM + " the price would be " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_WHAT_WANT = "We are currently looking to procure", + TRADER_COMPLIMENT_DENY = "I am afraid this is beyond my competency.", + TRADER_COMPLIMENT_ACCEPT = "Thank you.", + TRADER_INSULT_GOOD = "Alright, we will reconsider the terms.", + TRADER_INSULT_BAD = "This is not acceptable, please cease.", + TRADER_BRIBE_REFUSAL = "This facility is not mobile. Payment is unnecessary." + ) possible_wanted_items = list( /obj/item/stack/material/ore = TRADER_SUBTYPES_ONLY, diff --git a/code/datums/trading/traders/misc.dm b/code/datums/trading/traders/misc.dm index 80b69e2dbb5..75bdacd68bb 100644 --- a/code/datums/trading/traders/misc.dm +++ b/code/datums/trading/traders/misc.dm @@ -2,26 +2,30 @@ name = "Pet Shop Owner" name_language = /decl/language/human/common origin = "Pet Shop" - trade_flags = TRADER_GOODS|TRADER_MONEY|TRADER_WANTED_ONLY - possible_origins = list("Paws-Out", "Pets-R-Smart", "Tentacle Companions", "Xeno-Pets and Assorted Goods", "Barks and Drools") - speech = list("hail_generic" = "Welcome to my xeno-pet shop! Here you will find many wonderful companions. Some a bit more... aggressive than others. But companions none the less. I also buy pets, or trade them.", - "hail_deny" = "I no longer wish to speak to you.", - - "trade_complete" = "Remember to give them attention and food. They are living beings, and you should treat them like so.", - "trade_blacklist" = "Legally I can' do that. Morally, I refuse to do that.", - "trade_found_unwanted" = "I only want animals. I don't need food or shiny things. I'm looking for specific ones at that. Ones I already have the cage and food for.", - "trade_not_enough" = "I'd give you the animal for free, but I need the money to feed the others. So you must pay in full.", - "how_much" = "This is a fine specimen. I believe it will cost you VALUE CURRENCY.", - "what_want" = "I have the facilities, currently, to support", - - "compliment_deny" = "That was almost charming.", - "compliment_accept" = "Thank you. I needed that.", - "insult_good" = "I ask you to stop. We can be peaceful. I know we can.", - "insult_bad" = "My interactions with you are becoming less than fruitful.", - - "bribe_refusal" = "I'm not going to do that. I have places to be.", - "bribe_accept" = "Hm. It'll be good for the animals, so sure.", - ) + trade_flags = TRADER_GOODS | TRADER_MONEY | TRADER_WANTED_ONLY | TRADER_BRIBABLE + possible_origins = list( + "Paws-Out", + "Pets-R-Smart", + "Tentacle Companions", + "Xeno-Pets and Assorted Goods", + "Barks and Drools" + ) + speech = list( + TRADER_HAIL_GENERIC = "Welcome to my xeno-pet shop! Here you will find many wonderful companions. Some a bit more... aggressive than others. But companions none the less. I also buy pets, or trade them.", + TRADER_HAIL_DENY = "I no longer wish to speak to you.", + TRADER_TRADE_COMPLETE = "Remember to give them attention and food. They are living beings, and you should treat them like so.", + TRADER_NO_BLACKLISTED = "Legally I can' do that. Morally, I refuse to do that.", + TRADER_FOUND_UNWANTED = "I only want animals. I don't need food or shiny things. I'm looking for specific ones at that. Ones I already have the cage and food for.", + TRADER_NOT_ENOUGH = "I'd give you the animal for free, but I need the money to feed the others. So you must pay in full.", + TRADER_HOW_MUCH = "This is a fine specimen. I believe it will cost you " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_WHAT_WANT = "I have the facilities, currently, to support", + TRADER_COMPLIMENT_DENY = "That was almost charming.", + TRADER_COMPLIMENT_ACCEPT = "Thank you. I needed that.", + TRADER_INSULT_GOOD = "I ask you to stop. We can be peaceful. I know we can.", + TRADER_INSULT_BAD = "My interactions with you are becoming less than fruitful.", + TRADER_BRIBE_REFUSAL = "I'm not going to do that. I have places to be.", + TRADER_BRIBE_ACCEPT = "Hm. It'll be good for the animals, so sure.", + ) possible_wanted_items = list( /mob/living/simple_animal/corgi = TRADER_THIS_TYPE, @@ -75,24 +79,30 @@ origin = "Prank Shop" compliment_increase = 0 insult_drop = 0 - possible_origins = list("Yacks and Yucks Shop", "The Shop From Which I Sell Humorous Items", "The Prank Gestalt", "The Clown's Armory", "Uncle Knuckle's Chuckle Bunker", "A Place from Which to do Humorous Business") - speech = list("hail_generic" = "We welcome you to our shop of humorous items. We invite you to partake in the divine experience of being pranked, and pranking someone else.", - "hail_deny" = "We cannot do business with you. We are sorry.", - - "trade_complete" = "We thank you for purchasing something. We enjoyed the experience of you doing so and we hope to learn from it.", - "trade_blacklist"= "We are not allowed to do such. We are sorry.", - "trade_not_enough"="We have sufficiently experienced giving away goods for free. We wish to experience getting money in return.", - "how_much" = "We believe that is worth VALUE CURRENCY.", - "what_want" = "We wish only for the experiences you give us, in all else we want", - - "compliment_deny"= "You are attempting to compliment us.", - "compliment_accept"="You are attempting to compliment us.", - "insult_good" = "You are attempting to insult us, correct?", - "insult_bad" = "We do not understand.", - - "bribe_refusal" = "We are sorry, but we cannot accept.", - "bribe_accept" = "We are happy to say that we accept this bribe.", - ) + possible_origins = list( + "Yacks and Yucks Shop", + "The Shop From Which I Sell Humorous Items", + "The Prank Gestalt", + "The Clown's Armory", + "Uncle Knuckle's Chuckle Bunker", + "A Place from Which to do Humorous Business" + ) + speech = list( + TRADER_HAIL_GENERIC = "We welcome you to our shop of humorous items. We invite you to partake in the divine experience of being pranked, and pranking someone else.", + TRADER_HAIL_DENY = "We cannot do business with you. We are sorry.", + TRADER_TRADE_COMPLETE = "We thank you for purchasing something. We enjoyed the experience of you doing so and we hope to learn from it.", + TRADER_NO_BLACKLISTED = "We are not allowed to trade for these goods. We are sorry.", + TRADER_NO_GOODS = "We are not allowed to trade for these goods. We are sorry.", + TRADER_NOT_ENOUGH = "We have sufficiently experienced giving away goods for free. We wish to experience getting money in return.", + TRADER_HOW_MUCH = "We believe that is worth " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ".", + TRADER_WHAT_WANT = "We wish only for the experiences you give us, in all else we want", + TRADER_COMPLIMENT_DENY = "You are attempting to compliment us.", + TRADER_COMPLIMENT_ACCEPT = "You are attempting to compliment us.", + TRADER_INSULT_GOOD = "You are attempting to insult us, correct?", + TRADER_INSULT_BAD = "We do not understand.", + TRADER_BRIBE_REFUSAL = "We are sorry, but we cannot accept.", + TRADER_BRIBE_ACCEPT = "We are happy to say that we accept this bribe.", + ) possible_trading_items = list( /obj/item/clothing/mask/gas/clown_hat = TRADER_THIS_TYPE, /obj/item/clothing/mask/gas/mime = TRADER_THIS_TYPE, @@ -113,26 +123,34 @@ /datum/trader/ship/replica_shop name = "Replica Store Owner" - name_language = TRADER_DEFAULT_NAME origin = "Replica Store" - possible_origins = list("Ye-Old Armory", "Knights and Knaves", "The Blacksmith", "Historical Human Apparel and Items", "The Pointy End", "Fight Knight's Knightly Nightly Knight Fights", "Elminster's Fine Steel", "The Arms of King Duordan", "Queen's Edict") - speech = list("hail_generic" = "Greetings, traveler! You've the look of one with a keen hunger for human history. Come in, and learn! Mayhaps even... buy?", - "hail_deny" = "I shan't palaver with a man who thumbs his nose at the annals of history. Goodbye.", - - "trade_complete" = "Thank you, mighty warrior. And remember - these may be replicas, but their edges are honed to razor sharpness!", - "trade_blacklist"= "Nay, we accept only the CURRENCY_SINGULAR. Or sovereigns of the king's mint, of course.", - "trade_not_enough"="Alas, traveler, my fine wares cost more than that.", - "how_much" = "For VALUE CURRENCY, I can part with this finest of goods.", - "what_want" = "I have ever longed for", - - "compliment_deny"= "Oh ho ho! Aren't you quite the jester.", - "compliment_accept"="Why, thank you, traveler! Long have I slaved over the anvil to produce these goods.", - "insult_good" = "Hey, bro, I'm just tryin' to make a living here, okay? The Camelot schtick is part of my brand.", - "insult_bad" = "Man, fuck you, then.", - - "bribe_refusal" = "Alas, traveler - I could stay all eve, but I've an client in waiting, and they are not known for patience.", - "bribe_accept" = "Mayhaps I could set a spell longer, and rest my weary feet.", - ) + possible_origins = list( + "Ye-Old Armory", + "Knights and Knaves", + "The Blacksmith", + "Historical Human Apparel and Items", + "The Pointy End", + "Fight Knight's Knightly Nightly Knight Fights", + "Elminster's Fine Steel", + "The Arms of King Duordan", + "Queen's Edict" + ) + speech = list( + TRADER_HAIL_GENERIC = "Greetings, traveler! You've the look of one with a keen hunger for human history. Come in, and learn! Mayhaps even... buy?", + TRADER_HAIL_DENY = "I shan't palaver with a man who thumbs his nose at the annals of history. Goodbye.", + TRADER_TRADE_COMPLETE = "Thank you, mighty warrior. And remember - these may be replicas, but their edges are honed to razor sharpness!", + TRADER_NO_BLACKLISTED = "Nay, we accept only the " + TRADER_TOKEN_CUR_SINGLE + ". Or sovereigns of the king's mint, of course.", + TRADER_NO_GOODS = "Nay, we accept only the " + TRADER_TOKEN_CUR_SINGLE + ". Or sovereigns of the king's mint, of course.", + TRADER_NOT_ENOUGH = "Alas, traveler, my fine wares cost more than that.", + TRADER_HOW_MUCH = "For " + TRADER_TOKEN_VALUE + " " + TRADER_TOKEN_CURRENCY + ", I can part with this finest of goods.", + TRADER_WHAT_WANT = "I have ever longed for", + TRADER_COMPLIMENT_DENY = "Oh ho ho! Aren't you quite the jester.", + TRADER_COMPLIMENT_ACCEPT = "Why, thank you, traveler! Long have I slaved over the anvil to produce these goods.", + TRADER_INSULT_GOOD = "Hey, bro, I'm just tryin' to make a living here, okay? The Camelot schtick is part of my brand.", + TRADER_INSULT_BAD = "Man, fuck you, then.", + TRADER_BRIBE_REFUSAL = "Alas, traveler - I could stay all eve, but I've an client in waiting, and they are not known for patience.", + TRADER_BRIBE_ACCEPT = "Mayhaps I could set a spell longer, and rest my weary feet." + ) possible_trading_items = list( /obj/item/clothing/head/wizard/magus = TRADER_THIS_TYPE, /obj/item/shield/buckler = TRADER_THIS_TYPE, diff --git a/code/datums/trading/traders/ship.dm b/code/datums/trading/traders/ship.dm index 0e0887e6fa3..79166901a84 100644 --- a/code/datums/trading/traders/ship.dm +++ b/code/datums/trading/traders/ship.dm @@ -1,6 +1,8 @@ //Ships are on a time limit as far as being around goes. //They are ALSO the only ones that can appear after round start /datum/trader/ship + abstract_type = /datum/trader/ship + trade_flags = TRADER_MONEY | TRADER_BRIBABLE var/duration_of_stay = 0 var/typical_duration = 20 //minutes (since trader processes only tick once a minute) @@ -14,11 +16,10 @@ duration_of_stay -= 5 return --duration_of_stay > 0 -/datum/trader/ship/bribe_to_stay_longer(var/amt) - if(prob(-disposition)) - return get_response("bribe_refusal", "How about.... no?") +/datum/trader/ship/is_bribable() + return ..() || prob(-disposition) - var/staylength = round(amt/100) +/datum/trader/ship/is_bribed(var/staylength) duration_of_stay += staylength - . = get_response("bribe_accept", "Sure, I'll stay for TIME more minutes.") - . = replacetext(., "TIME", staylength) \ No newline at end of file + . = get_response(TRADER_BRIBE_ACCEPT, "Sure, I'll stay for " + TRADER_TOKEN_TIME + " more minutes.") + . = replacetext(., TRADER_TOKEN_TIME, staylength) diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index b4a4cc110c8..cebfff729ed 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -1,5 +1,6 @@ /datum/trader/ship/unique - trade_flags = TRADER_WANTED_ONLY|TRADER_GOODS + abstract_type = /datum/trader/ship/unique + trade_flags = TRADER_WANTED_ONLY | TRADER_GOODS | TRADER_BRIBABLE want_multiplier = 5 typical_duration = 40 @@ -23,7 +24,7 @@ return --duration_of_stay > 0 /datum/trader/ship/unique/what_do_you_want() - return get_response("what_want", "I don't want anything!") + return get_response(TRADER_WHAT_WANT, "I don't want anything!") /datum/trader/ship/unique/severance name = "Unknown" @@ -41,22 +42,23 @@ blacklisted_trade_items = null - speech = list("hail_generic" = "H-hello. Can you hear me? G-good... I have... specific needs... I have a lot to t-trade with you in return of course.", - "hail_deny" = "--CONNECTION SEVERED--", - - "trade_complete" = "Hahahahahahaha! Thankyouthankyouthankyou!", - "trade_no_money" = "I d-don't NEED cash.", - "trade_not_enough" = "N-no, no no no. M-more than that... more...", - "trade_found_unwanted" = "I d-don't think you GET what I want, fr- from your offer.", - "how_much" = "Meat. I want meat. The kind they don't serve in the- the mess hall.", - "what_want" = "Long p-pork. Yes... that's what I want...", - - "compliment_deny" = "Your lies won't ch-change what I did.", - "compliment_accept" = "Yes... I suppose you're right.", - "insult_good" = "I... probably deserve that.", - "insult_bad" = "Maybe you should c-come here and say that. You'd be worth s-something then.", - ) - mob_transfer_message = "You are transported to ORIGIN, and with a sickening thud, you fall unconscious, never to wake again." + speech = list( + TRADER_HAIL_GENERIC = "H-hello. Can you hear me? G-good... I have... specific needs... I have a lot to t-trade with you in return of course.", + TRADER_HAIL_DENY = "--CONNECTION SEVERED--", + TRADER_TRADE_COMPLETE = "Hahahahahahaha! Thankyouthankyouthankyou!", + TRADER_NO_MONEY = "I d-don't NEED cash.", + TRADER_NOT_ENOUGH = "N-no, no no no. M-more than that... more...", + TRADER_FOUND_UNWANTED = "I d-don't think you GET what I want, fr- from your offer.", + TRADER_HOW_MUCH = "Meat. I want meat. The kind they don't serve in the- the mess hall.", + TRADER_WHAT_WANT = "Long p-pork. Yes... that's what I want...", + TRADER_COMPLIMENT_DENY = "Your lies won't ch-change what I did.", + TRADER_COMPLIMENT_ACCEPT = "Yes... I suppose you're right.", + TRADER_INSULT_GOOD = "I... probably deserve that.", + TRADER_INSULT_BAD = "Maybe you should c-come here and say that. You'd be worth s-something then.", + TRADER_BRIBE_ACCEPT = "Okay. Fine. But... h-hurry. I can only stay another " + TRADER_TOKEN_TIME + "m-minutes.", + TRADER_BRIBE_REFUSAL = "No! N-no, they're getting closer- I have to, I h-have to go soon." + ) + mob_transfer_message = "You are transported to " + TRADER_TOKEN_ORIGIN + ", and with a sickening thud, you fall unconscious, never to wake again." /datum/trader/ship/unique/rock @@ -72,29 +74,35 @@ ) want_multiplier = 5000 - speech = list("hail_generic" = "Blub am MERCHANT. Blub hunger for things. Boo bring them to blub, yes?", - "hail_deny" = "Blub does not want to speak to boo.", - - "trade_complete" = "Blub likes to trade!", - "trade_no_money" = "Boo try to give Blub paper. Blub does not want paper.", - "trade_not_enough" = "Blub hungry for bore than that.", - "trade_found_unwanted" = "Blub only wants bocks. Give bocks.", - "trade_refuse" = "No, Blub will not do that. Blub wants bocks, yes? Give bocks.", - "how_much" = "Blub wants bocks. Boo give bocks. Blub gives stuff blub found.", - "what_want" = "Blub wants bocks. Big bocks, small bocks. Shiny bocks!", - - "compliment_deny" = "Blub is just MERCHANT. What do boo mean?", - "compliment_accept" = "Boo are a bood berson!", - "insult_good" = "Blub do not understand. Blub thought we were briends.", - "insult_bad" = "Blub feels bad now.", - ) + speech = list( + TRADER_HAIL_GENERIC = "Blub am " + TRADER_TOKEN_MERCHANT + ". Blub hunger for things. Boo bring them to blub, yes?", + TRADER_HAIL_DENY = "Blub does not want to speak to boo.", + TRADER_TRADE_COMPLETE = "Blub likes to trade!", + TRADER_NO_MONEY = "Boo try to give Blub paper. Blub does not want paper.", + TRADER_NOT_ENOUGH = "Blub hungry for bore than that.", + TRADER_NO_BLACKLISTED = "Blub not want that! No!", + TRADER_FOUND_UNWANTED = "Blub only wants bocks. Give bocks.", + TRADER_HOW_MUCH = "Blub wants bocks. Boo give bocks. Blub gives stuff blub found.", + TRADER_WHAT_WANT = "Blub wants bocks. Big bocks, small bocks. Shiny bocks!", + TRADER_COMPLIMENT_DENY = "Blub is just " + TRADER_TOKEN_MERCHANT + ". What do boo mean?", + TRADER_COMPLIMENT_ACCEPT = "Boo are a bood berson!", + TRADER_INSULT_GOOD = "Blub do not understand. Blub thought we were briends.", + TRADER_INSULT_BAD = "Blub feels bad now.", + TRADER_BRIBE_ACCEPT = "Blub will stay for " + TRADER_TOKEN_TIME + " binutes bonger.", + TRADER_BRIBE_REFUSAL = "Blub must go. Blub's beople beed blem." + ) //probably could stick soem Howl references in here but like, eh. Haven't seen it in years. /datum/trader/ship/unique/wizard name = "Sorcerer" origin = "A moving castle" - possible_origins = list("An indistinct location", "Unknown location", "The Diamond Sphere", "Beyond the Veil", "Deadverse") - name_language = TRADER_DEFAULT_NAME + possible_origins = list( + "An indistinct location", + "Unknown location", + "The Diamond Sphere", + "Beyond the Veil", + "Deadverse" + ) possible_wanted_items = list( /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, @@ -118,19 +126,24 @@ /obj/item/staff = TRADER_ALL, ) //Probably see about getting some more wizard based shit - speech = list("hail_generic" = "Hello! Are you here on pleasure or business?", - "hail_Golem" = "Interesting... how incredibly interesting... come! Let us do business!", - "hail_deny" = "I'm sorry, but I REALLY don't want to speak to you.", - - "trade_complete" = "Pleasure doing business with you!", - "trade_no_money" = "Cash? Ha! What's cash to a man like me?", - "trade_not_enough" = "Hm, well I do enjoy what you're offering, I prefer a fair trade.", - "trade_found_unwanted" = "What? I want oddities! Don't you understand?", - "how_much" = "I want dark things, brooding things... things that go bump in the night. Things that bleed wrong, live wrong, are wrong.", - "what_want" = "Have anything from a broodish cult?", - - "compliment_deny" = "Like I haven't heard that one before!", - "compliment_accept" = "Haha! Aren't you nice.", - "insult_good" = "Naughty naughty.", - "insult_bad" = "Now where do you get off talking to me like that?", - ) \ No newline at end of file + speech = list( + TRADER_HAIL_GENERIC = "Hello! Are you here on pleasure or business?", + TRADER_HAIL_DENY = "I'm sorry, but I REALLY don't want to speak to you.", + TRADER_TRADE_COMPLETE = "Pleasure doing business with you!", + TRADER_NO_MONEY = "Cash? Ha! What's cash to a man like me?", + TRADER_NOT_ENOUGH = "Hm, well I do enjoy what you're offering, I prefer a fair trade.", + TRADER_FOUND_UNWANTED = "What? I want oddities! Don't you understand?", + TRADER_HOW_MUCH = "I want dark things, brooding things... things that go bump in the night. Things that bleed wrong, live wrong, are wrong.", + TRADER_WHAT_WANT = "Have anything from a broodish cult?", + TRADER_COMPLIMENT_DENY = "Like I haven't heard that one before!", + TRADER_COMPLIMENT_ACCEPT = "Haha! Aren't you nice.", + TRADER_INSULT_GOOD = "Naughty naughty.", + TRADER_INSULT_BAD = "Now where do you get off talking to me like that?", + TRADER_BRIBE_ACCEPT = "Well, if you're not pulling the knob on my staff, I can stay for another " + TRADER_TOKEN_TIME + " minutes.", + TRADER_BRIBE_REFUSAL = "A wizard does not depart early or late, but precisely when they intend to. No.", + TRADER_NO_BLACKLISTED = "I cannot accept such a thing. No trade." + ) + +/datum/trader/ship/unique/wizard/New() + speech[TRADER_HAIL_START + SPECIES_GOLEM] = "Interesting... how incredibly interesting... come! Let us do business!" + ..() diff --git a/code/datums/trading/traders/weaponry.dm b/code/datums/trading/traders/weaponry.dm index 2f9d25d5c04..2dc50d4c074 100644 --- a/code/datums/trading/traders/weaponry.dm +++ b/code/datums/trading/traders/weaponry.dm @@ -1,22 +1,29 @@ /datum/trader/ship/gunshop name = "Gun Shop Employee" - name_language = TRADER_DEFAULT_NAME origin = "Gun Shop" - possible_origins = list("Rooty Tootie's Point-n-Shooties", "Bang-Bang Shop", "Wild Wild West Shop", "Keleshnikov", "Hunting Depot", "Big Game Hunters") - speech = list("hail_generic" = "Hello, hello! I hope you have your permit. Oh, who are we kidding, you're welcome anyway!", - "hail_deny" = "Store policy dictates that you can fuck off.", - - "trade_complete" = "Thanks for buying your guns from ORIGIN!", - "trade_blacklist" = "We may deal in guns, but that doesn't mean we'll trade for illegal goods...", - "trade_no_goods" = "Cash for guns, thats the deal.", - "trade_not_enough" = "Guns are expensive! Give us more if you REALLY want it.", - "how_much" = "Well, I'd love to give this little beauty to you for VALUE.", - - "compliment_deny" = "If we were in the same room right now, I'd probably punch you.", - "compliment_accept" = "Ha! Good one!", - "insult_good" = "I expected better from you. I suppose in that, I was wrong.", - "insult_bad" = "If I had my gun I'd shoot you!" - ) + possible_origins = list( + "Rooty Tootie's Point-n-Shooties", + "Bang-Bang Shop", + "Wild Wild West Shop", + "Keleshnikov", + "Hunting Depot", + "Big Game Hunters" + ) + speech = list( + TRADER_HAIL_GENERIC = "Hello, hello! I hope you have your permit. Oh, who are we kidding, you're welcome anyway!", + TRADER_HAIL_DENY = "Store policy dictates that you can fuck off.", + TRADER_TRADE_COMPLETE = "Thanks for buying your guns from " + TRADER_TOKEN_ORIGIN + "!", + TRADER_NO_BLACKLISTED = "We may deal in guns, but that doesn't mean we'll trade for illegal goods...", + TRADER_NO_GOODS = "Cash for guns, thats the deal.", + TRADER_NOT_ENOUGH = "Guns are expensive! Give us more if you REALLY want it.", + TRADER_HOW_MUCH = "Well, I'd love to give this little beauty to you for " + TRADER_TOKEN_VALUE + ".", + TRADER_COMPLIMENT_DENY = "If we were in the same room right now, I'd probably punch you.", + TRADER_COMPLIMENT_ACCEPT = "Ha! Good one!", + TRADER_INSULT_GOOD = "I expected better from you. I suppose in that, I was wrong.", + TRADER_INSULT_BAD = "If I had my gun I'd shoot you!", + TRADER_BRIBE_ACCEPT = "For that much scratch, I can stay for another " + TRADER_TOKEN_TIME + " minutes.", + TRADER_BRIBE_REFUSAL = "Look, I've got places to be, I can't hang around shooting the shit." + ) possible_trading_items = list( /obj/item/gun/projectile/pistol/holdout = TRADER_ALL, @@ -32,23 +39,30 @@ /datum/trader/ship/egunshop name = "Energy Gun Shop Employee" - name_language = TRADER_DEFAULT_NAME origin = "EGun Shop" - possible_origins = list("The Emperor's Lasgun Shop", "Future Guns", "Solar Army", "Kiefer's Dependable Electric Arms", "Olympus Kingsport") - speech = list("hail_generic" = "Welcome to the future of warfare! ORIGIN, your one-stop shop for energy weaponry!", - "hail_deny" = "I'm sorry, your communication channel has been blacklisted.", - - "trade_complete" = "Thank you, your purchase has been logged and you have automatically liked our Spacebook page.", - "trade_blacklist" = "I'm sorry, is that a joke?", - "trade_no_goods" = "We deal in cash.", - "trade_not_enough" = "State of the art weaponry costs more than that.", - "how_much" = "All our quality weapons are priceless, but I'd give that to you for VALUE.", + possible_origins = list( + "The Emperor's Lasgun Shop", + "Future Guns", + "Solar Army", + "Kiefer's Dependable Electric Arms", + "Olympus Kingsport" + ) + speech = list( + TRADER_HAIL_GENERIC = "Welcome to the future of warfare! " + TRADER_TOKEN_ORIGIN + ", your one-stop shop for energy weaponry!", + TRADER_HAIL_DENY = "I'm sorry, your communication channel has been blacklisted.", + TRADER_TRADE_COMPLETE = "Thank you, your purchase has been logged and you have automatically liked our Spacebook page.", + TRADER_NO_BLACKLISTED = "I'm sorry, is that a joke?", + TRADER_NO_GOODS = "We deal in cash.", + TRADER_NOT_ENOUGH = "State of the art weaponry costs more than that.", + TRADER_HOW_MUCH = "All our quality weapons are priceless, but I'd give that to you for " + TRADER_TOKEN_VALUE + ".", + TRADER_COMPLIMENT_DENY = "If I was dumber I probably would have believed you.", + TRADER_COMPLIMENT_ACCEPT = "Yes, I am very smart.", + TRADER_INSULT_GOOD = "Energy weapons are TWICE the gun kinetic guns are!", + TRADER_INSULT_BAD = "That's... very mean. I won't think twice about blacklisting your channel, so stop.", + TRADER_BRIBE_ACCEPT = "Look, I'm not supposed to, but I guess I can stay for " + TRADER_TOKEN_TIME + " minutes.", + TRADER_BRIBE_REFUSAL = "Sorry, no can do. I'm on a tight schedule." - "compliment_deny" = "If I was dumber I probably would have believed you.", - "compliment_accept" = "Yes, I am very smart.", - "insult_good" = "Energy weapons are TWICE the gun kinetic guns are!", - "insult_bad" = "That's... very mean. I won't think twice about blacklisting your channel, so stop." - ) + ) possible_trading_items = list( /obj/item/gun/energy/taser = TRADER_THIS_TYPE, @@ -66,20 +80,20 @@ /datum/trader/dogan name = "Dogan" origin = "Dogan's Gun Beacon" - speech = list("hail_generic" = "Hello! This is an automatic recording of me, Mr. Dogan! I hope you like the... GUNS... I've got in store for you today.", - "hail_deny" = "I formally welcome you to... NOT... visit our store!", - - "trade_complete" = "Thank you for... PURCHASING... that quality... ITEM... from me!", - "trade_blacklist" = "Thank you for... that quality... ILLEGAL OFFER THAT I WILL REFUSE... from me!", - "trade_no_goods" = "Thank you for... that quality... OFFER THAT ISN'T MONEY THAT I WILL REFUSE... from me!", - "trade_not_enough" = "Thank you for... that quality... OFFER THAT IS NOT ENOUGH... from me!", - "how_much" = "Thank you for... ASKING ME ABOUT MY PRICES... that quality... ITEM is worth VALUE... from me!", - - "compliment_deny" = "Thank you for... that quality... COMPLIMENT... from me!", - "compliment_accept" = "Thank you for... that quality... COMPLIMENT... from me!", - "insult_good" = "Thank you for... that quality... INSULT... from me!", - "insult_bad" = "Thank you for... that quality... INSULT... from me!" - ) + speech = list( + TRADER_HAIL_GENERIC = "Hello! This is an automatic recording of me, Mr. Dogan! I hope you like the... GUNS... I've got in store for you today.", + TRADER_HAIL_DENY = "I formally welcome you to... NOT... visit our store!", + TRADER_TRADE_COMPLETE = "Thank you for... PURCHASING... that quality... " + TRADER_TOKEN_ITEM + "... from me!", + TRADER_NO_BLACKLISTED = "Thank you for... that quality... ILLEGAL OFFER THAT I WILL REFUSE... from me!", + TRADER_NO_GOODS = "Thank you for... that quality... OFFER THAT ISN'T MONEY THAT I WILL REFUSE... from me!", + TRADER_NOT_ENOUGH = "Thank you for... that quality... OFFER THAT IS NOT ENOUGH... from me!", + TRADER_HOW_MUCH = "Thank you for... ASKING ME ABOUT MY PRICES... that quality... " + TRADER_TOKEN_ITEM + " is worth " + TRADER_TOKEN_VALUE + "... from me!", + TRADER_COMPLIMENT_DENY = "Thank you for... that quality... COMPLIMENT... from me!", + TRADER_COMPLIMENT_ACCEPT = "Thank you for... that quality... COMPLIMENT... from me!", + TRADER_INSULT_GOOD = "Thank you for... that quality... INSULT... from me!", + TRADER_INSULT_BAD = "Thank you for... that quality... INSULT... from me!", + TRADER_BRIBE_REFUSAL = "Your... BLATANT BRIBERY... is... UNNECESSARY!" + ) compliment_increase = 0 insult_drop = 0 diff --git a/code/datums/traits/traits.dm b/code/datums/traits/traits.dm index 2cabd2c4684..dc623ae5fce 100644 --- a/code/datums/traits/traits.dm +++ b/code/datums/traits/traits.dm @@ -16,45 +16,62 @@ /mob/living/proc/GetTraits() SHOULD_NOT_SLEEP(TRUE) RETURN_TYPE(/list) - return traits - -/mob/living/carbon/human/GetTraits() - if(traits) - return traits - return species.traits + var/decl/species/our_species = get_species() + return traits || our_species?.traits /mob/living/proc/SetTrait(trait_type, trait_level) SHOULD_NOT_SLEEP(TRUE) + var/decl/species/our_species = get_species() var/decl/trait/T = GET_DECL(trait_type) if(!T.validate_level(trait_level)) return FALSE - LAZYSET(traits, trait_type, trait_level) - return TRUE - -/mob/living/carbon/human/SetTrait(trait_type, trait_level) - var/decl/trait/T = GET_DECL(trait_type) - if(!T.validate_level(trait_level)) - return FALSE - - if(!traits) // If traits haven't been setup before, check if we need to do so now - var/species_level = species.traits[trait_type] + if(our_species && !traits) // If species traits haven't been setup before, check if we need to do so now + var/species_level = our_species.traits[trait_type] if(species_level == trait_level) // Matched the default species trait level, ignore return TRUE - traits = species.traits.Copy() // The setup is to simply copy the species list of traits + traits = our_species.traits.Copy() // The setup is to simply copy the species list of traits - return ..(trait_type, trait_level) - -/mob/living/proc/RemoveTrait(trait_type) - LAZYREMOVE(traits, trait_type) - -/mob/living/carbon/human/RemoveTrait(trait_type) - // If traits haven't been setup, but we're trying to remove a trait that exists on the species then setup traits - if(!traits && (trait_type in species.traits)) - traits = species.traits.Copy() + LAZYSET(traits, trait_type, trait_level) + return TRUE - ..(trait_type) // Could go through the trouble of nulling the traits list if it's again equal to the species list but eh - traits = traits || list() // But we do ensure that humans don't null their traits list, to avoid copying from species again +/mob/living/proc/RemoveTrait(trait_type, canonize = TRUE) + var/decl/species/our_species = get_species() + // If traits haven't been set up, but we're trying to remove a trait that exists on the species then set up traits + if(!traits && LAZYISIN(our_species?.traits, trait_type)) + traits = our_species.traits.Copy() + if(LAZYLEN(traits)) + LAZYREMOVE(traits, trait_type) + // Check if we can just default back to species traits. + if(canonize) + CanonizeTraits() + +/// Removes a trait unless it exists on the species. +/// If it does exist on the species, we reset it to the species' trait level. +/mob/living/proc/RemoveExtrinsicTrait(trait_type) + var/decl/species/our_species = get_species() + if(!LAZYACCESS(our_species?.traits, trait_type)) + RemoveTrait(trait_type) + else if(our_species?.traits[trait_type] != GetTraitLevel(trait_type)) + SetTrait(trait_type, our_species?.traits[trait_type]) + +/// Sets the traits list to null if it's identical to the species list. +/// Returns TRUE if the list was reset and FALSE otherwise. +/mob/living/proc/CanonizeTraits() + if(!traits) // Already in canonical form. + return FALSE + var/decl/species/our_species = get_species() + if(!our_species) // Doesn't apply without a species. + return FALSE + var/list/missing_traits = traits ^ our_species?.traits + var/list/matched_traits = traits & our_species?.traits + if(LAZYLEN(missing_traits)) + return FALSE + for(var/trait in matched_traits) // inside this loop we know our_species exists and has traits + if(traits[trait] != our_species.traits[trait]) + return FALSE + traits = null + return TRUE /decl/trait abstract_type = /decl/trait diff --git a/code/datums/type_cloning.dm b/code/datums/type_cloning.dm index b0aeb132fb2..4ceeea67dfe 100644 --- a/code/datums/type_cloning.dm +++ b/code/datums/type_cloning.dm @@ -6,3 +6,5 @@ /matrix/GetCloneArgs() return list(src) //Matrices handle copies themselves +/image/GetCloneArgs() + return list(src) //Same for images \ No newline at end of file diff --git a/code/datums/underwear/underwear.dm b/code/datums/underwear/underwear.dm index 0ef3cb0dde6..a42fcf1a66f 100644 --- a/code/datums/underwear/underwear.dm +++ b/code/datums/underwear/underwear.dm @@ -66,5 +66,5 @@ UW.icon_state = icon_state for(var/datum/gear_tweak/gt in tweaks) - gt.tweak_item(user, UW, metadata && metadata["[gt]"] ? metadata["[gt]"] : gt.get_default()) + gt.tweak_item(user, UW, ((metadata && metadata["[gt]"]) ? metadata["[gt]"] : gt.get_default())) return UW diff --git a/code/datums/uplink/services.dm b/code/datums/uplink/services.dm index 3a81c4f9149..6bec9ead893 100644 --- a/code/datums/uplink/services.dm +++ b/code/datums/uplink/services.dm @@ -41,7 +41,7 @@ /datum/uplink_item/item/services/fake_update_annoncement/New() ..() item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) - addtimer(CALLBACK(src, .proc/finalize_announce), 2) + addtimer(CALLBACK(src, PROC_REF(finalize_announce)), 2) /datum/uplink_item/item/services/fake_update_annoncement/proc/finalize_announce() name = "[command_name()] Update Announcement" @@ -98,7 +98,7 @@ log_and_message_admins("has activated the service '[service_label]'", user) if(service_duration) - addtimer(CALLBACK(src,/obj/item/uplink_service/proc/deactivate), service_duration) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/uplink_service, deactivate)), service_duration) else deactivate() diff --git a/code/datums/vote/add_antag.dm b/code/datums/vote/add_antag.dm index 1d04ea08cbd..f9b82057ce2 100644 --- a/code/datums/vote/add_antag.dm +++ b/code/datums/vote/add_antag.dm @@ -43,7 +43,7 @@ global.additional_antag_types |= antag_type return - INVOKE_ASYNC(src, .proc/spawn_antags) //There is a sleep in this proc. + INVOKE_ASYNC(src, PROC_REF(spawn_antags)) //There is a sleep in this proc. /datum/vote/add_antagonist/proc/spawn_antags() @@ -58,7 +58,7 @@ antag_add_finished = 1 if(automatic) // the buffer will already have half an hour added to it, so we'll give it one more - transfer_controller.timerbuffer += config.vote_autotransfer_interval + transfer_controller.timerbuffer += get_config_value(/decl/config/num/vote_autotransfer_initial) else to_world("No antags were added.") if(automatic) diff --git a/code/datums/vote/gamemode.dm b/code/datums/vote/gamemode.dm index 2b31287946b..663de74d6c0 100644 --- a/code/datums/vote/gamemode.dm +++ b/code/datums/vote/gamemode.dm @@ -6,7 +6,7 @@ show_leading = TRUE /datum/vote/gamemode/can_run(mob/creator, automatic) - if(!automatic && (!config.allow_vote_mode || !is_admin(creator))) + if(!automatic && (!get_config_value(/decl/config/toggle/vote_mode) || !is_admin(creator))) return FALSE // Admins and autovotes bypass the config setting. if(GAME_STATE >= RUNLEVEL_GAME) return FALSE @@ -20,9 +20,9 @@ /datum/vote/gamemode/setup_vote(mob/creator, automatic) ..() - choices += config.votable_modes + choices += get_config_value(/decl/config/lists/mode_votable) for (var/F in choices) - var/datum/game_mode/M = gamemode_cache[F] + var/decl/game_mode/M = decls_repository.get_decl_by_id(F, validate_decl_type = FALSE) if(!M) continue display_choices[F] = capitalize(M.name) @@ -50,8 +50,8 @@ SSticker.gamemode_vote_results = result.Copy() /datum/vote/gamemode/check_toggle() - return config.allow_vote_mode ? "Allowed" : "Disallowed" + return get_config_value(/decl/config/toggle/vote_mode) ? "Allowed" : "Disallowed" /datum/vote/gamemode/toggle(mob/user) if(is_admin(user)) - config.allow_vote_mode = !config.allow_vote_mode \ No newline at end of file + toggle_config_value(/decl/config/toggle/vote_mode) diff --git a/code/datums/vote/map.dm b/code/datums/vote/map.dm index 6eccbb34d31..9e64ac63bcb 100644 --- a/code/datums/vote/map.dm +++ b/code/datums/vote/map.dm @@ -2,7 +2,7 @@ name = "map" /datum/vote/map/can_run(mob/creator, automatic) - if(!config.allow_map_switching) + if(!get_config_value(/decl/config/toggle/allow_map_switching)) return FALSE if(!automatic && !is_admin(creator)) return FALSE // Must be an admin. diff --git a/code/datums/vote/restart.dm b/code/datums/vote/restart.dm index a3e49a04fbb..75a564d6d59 100644 --- a/code/datums/vote/restart.dm +++ b/code/datums/vote/restart.dm @@ -6,7 +6,7 @@ results_length = 1 /datum/vote/restart/can_run(mob/creator, automatic) - if(!automatic && !config.allow_vote_restart && !is_admin(creator)) + if(!automatic && !get_config_value(/decl/config/toggle/vote_restart) && !is_admin(creator)) return FALSE // Admins and autovotes bypass the config setting. return ..() diff --git a/code/datums/vote/transfer.dm b/code/datums/vote/transfer.dm index 52de1c72e4c..b009162dcc4 100644 --- a/code/datums/vote/transfer.dm +++ b/code/datums/vote/transfer.dm @@ -7,7 +7,7 @@ return if(!SSevac.evacuation_controller || !SSevac.evacuation_controller.should_call_autotransfer_vote()) return FALSE - if(!automatic && !config.allow_vote_restart && !is_admin(creator)) + if(!automatic && !get_config_value(/decl/config/toggle/vote_restart) && !is_admin(creator)) return FALSE // Admins and autovotes bypass the config setting. if(check_rights(R_INVESTIGATE, 0, creator)) return //Mods bypass further checks. @@ -18,13 +18,13 @@ return FALSE /datum/vote/transfer/setup_vote(mob/creator, automatic) - choices = list("Initiate Crew Transfer", "Extend the Round ([config.vote_autotransfer_interval / 600] minutes)") - if (config.allow_extra_antags && SSvote.is_addantag_allowed(creator, automatic)) + choices = list("Initiate Crew Transfer", "Extend the Round ([get_config_value(/decl/config/num/vote_autotransfer_interval) / 600] minutes)") + if (get_config_value(/decl/config/toggle/allow_extra_antags) && SSvote.is_addantag_allowed(creator, automatic)) choices += "Add Antagonist" ..() /datum/vote/transfer/handle_default_votes() - if(config.vote_no_default) + if(get_config_value(/decl/config/num/vote_no_default)) return var/factor = 0.5 switch(world.time / (1 MINUTE)) @@ -52,12 +52,12 @@ /datum/vote/transfer/mob_not_participating(mob/user) if((. = ..())) return - if(config.vote_no_dead_crew_transfer) + if(get_config_value(/decl/config/num/vote_no_dead_crew_transfer)) return !isliving(user) || ismouse(user) || isdrone(user) /datum/vote/transfer/check_toggle() - return config.allow_vote_restart ? "Allowed" : "Disallowed" + return get_config_value(/decl/config/toggle/vote_restart) ? "Allowed" : "Disallowed" /datum/vote/transfer/toggle(mob/user) if(is_admin(user)) - config.allow_vote_restart = !config.allow_vote_restart \ No newline at end of file + toggle_config_value(/decl/config/toggle/vote_restart) \ No newline at end of file diff --git a/code/datums/vote/vote.dm b/code/datums/vote/vote.dm index 27601e02718..df85565327f 100644 --- a/code/datums/vote/vote.dm +++ b/code/datums/vote/vote.dm @@ -53,7 +53,7 @@ /datum/vote/proc/start_vote() start_time = world.time - time_set = (time_set ? time_set : config.vote_period) + time_set = (time_set ? time_set : get_config_value(/decl/config/num/vote_period)) time_remaining = round(time_set / 10) status = VOTE_STATUS_ACTIVE @@ -68,7 +68,7 @@ //Modifies the vote totals based on non-voting mobs. /datum/vote/proc/handle_default_votes() - if(!config.vote_no_default) + if(!get_config_value(/decl/config/num/vote_no_default)) return length(global.clients) - length(voted) //Number of non-voters (might not be active, though; should be revisited if the config option is used. This is legacy code.) /datum/vote/proc/tally_result() @@ -130,7 +130,7 @@ // Checks if the mob is participating in the round sufficiently to vote, as per config settings. /datum/vote/proc/mob_not_participating(mob/voter) - if(config.vote_no_dead && voter.stat == DEAD && !voter.client.holder) + if(get_config_value(/decl/config/num/vote_no_dead) && voter.stat == DEAD && !voter.client.holder) return 1 //null = no toggle set. This is for UI purposes; a text return will give a link (toggle; currently "return") in the vote panel. diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index d8e207e3a19..951e79f60e8 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -170,7 +170,7 @@ var/global/const/AIRLOCK_WIRE_SPEAKER = 4096 A.aiControlDisabled = 1 else if(A.aiControlDisabled == -1) A.aiControlDisabled = 2 - addtimer(CALLBACK(src, .proc/reset_ai_control, A), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_ai_control), A), 1 SECOND) if(AIRLOCK_WIRE_ELECTRIFY) //one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index b8b7817e339..ddcce1fc75e 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -84,13 +84,13 @@ var/global/const/AALARM_WIRE_AALARM = 16 if(A.shorted == 0) A.shorted = 1 A.update_icon() - addtimer(CALLBACK(src, .proc/clear_shorted), 20 MINUTES) + addtimer(CALLBACK(src, PROC_REF(clear_shorted)), 20 MINUTES) if (AALARM_WIRE_AI_CONTROL) if (A.aidisabled == 0) A.aidisabled = 1 A.updateDialog() - addtimer(CALLBACK(src, .proc/clear_ai_disabled, 10 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(clear_ai_disabled), 10 SECONDS)) if(AALARM_WIRE_SYPHON) if(A.mode == 1) // AALARM_MODE_SCRUB diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index 4dbafcde5e4..b7d1221c081 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -5,7 +5,7 @@ /datum/wires/apc holder_type = /obj/machinery/power/apc - wire_count = 4 + wire_count = 4 descriptions = list( new /datum/wire_description(APC_WIRE_IDSCAN, "This wire is connected to the ID scanning panel.", SKILL_EXPERT), new /datum/wire_description(APC_WIRE_MAIN_POWER1, "This wire seems to be carrying a heavy current."), @@ -48,17 +48,17 @@ if(APC_WIRE_IDSCAN) A.locked = 0 - addtimer(CALLBACK(src, .proc/reset_locked), 30 SECONDS) + addtimer(CALLBACK(src, PROC_REF(reset_locked)), 30 SECONDS) if (APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2) if(A.shorted == 0) A.shorted = 1 - addtimer(CALLBACK(src, .proc/reset_shorted), 2 MINUTES) - + addtimer(CALLBACK(src, PROC_REF(reset_shorted)), 2 MINUTES) + if (APC_WIRE_AI_CONTROL) if (A.aidisabled == 0) A.aidisabled = 1 - addtimer(CALLBACK(src, .proc/reset_ai_disabled), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_ai_disabled)), 1 SECOND) /datum/wires/apc/UpdateCut(var/index, var/mended) var/obj/machinery/power/apc/A = holder diff --git a/code/datums/wires/fabricator.dm b/code/datums/wires/fabricator.dm index f19c27f9e41..a9a040f6fee 100644 --- a/code/datums/wires/fabricator.dm +++ b/code/datums/wires/fabricator.dm @@ -60,21 +60,21 @@ A.fab_status_flags &= ~FAB_HACKED else A.fab_status_flags |= FAB_HACKED - addtimer(CALLBACK(src, .proc/reset_flag, index, FAB_HACKED), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(reset_flag), index, FAB_HACKED), 5 SECONDS) if(AUTOLATHE_SHOCK_WIRE) if(A.fab_status_flags & FAB_SHOCKED) A.fab_status_flags &= ~FAB_SHOCKED else A.fab_status_flags |= FAB_SHOCKED - addtimer(CALLBACK(src, .proc/reset_flag, index, FAB_SHOCKED), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(reset_flag), index, FAB_SHOCKED), 5 SECONDS) if(AUTOLATHE_DISABLE_WIRE) if(A.fab_status_flags & FAB_DISABLED) A.fab_status_flags &= ~FAB_DISABLED else A.fab_status_flags |= FAB_DISABLED - addtimer(CALLBACK(src, .proc/reset_flag, index, FAB_DISABLED), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(reset_flag), index, FAB_DISABLED), 5 SECONDS) #undef AUTOLATHE_HACK_WIRE #undef AUTOLATHE_SHOCK_WIRE diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm index 0b7a0ca2397..06c679edfd2 100644 --- a/code/datums/wires/nuclearbomb.dm +++ b/code/datums/wires/nuclearbomb.dm @@ -53,14 +53,14 @@ var/global/const/NUCLEARBOMB_WIRE_SAFETY = 4 N.lighthack = !N.lighthack N.update_icon() toggle_hacked() - addtimer(CALLBACK(src, .proc/toggle_hacked), 10 SECONDS) + addtimer(CALLBACK(src, PROC_REF(toggle_hacked)), 10 SECONDS) if(NUCLEARBOMB_WIRE_TIMING) if(N.timing) log_and_explode("pulsed a nuclear bomb's detonation wire, causing it to explode.") if(NUCLEARBOMB_WIRE_SAFETY) N.safety = !N.safety - addtimer(CALLBACK(src, .proc/toggle_safety), 10 SECONDS) + addtimer(CALLBACK(src, PROC_REF(toggle_safety)), 10 SECONDS) /datum/wires/nuclearbomb/UpdateCut(var/index, var/mended) var/obj/machinery/nuclearbomb/N = holder diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm index cde8369c4fc..22b951263c5 100644 --- a/code/datums/wires/radio.dm +++ b/code/datums/wires/radio.dm @@ -17,12 +17,6 @@ var/global/const/WIRE_TRANSMIT = 4 return 1 return 0 -/datum/wires/radio/GetInteractWindow(mob/user) - var/obj/item/radio/R = holder - . += ..() - if(R.cell) - . += "
Remove cell
" - /datum/wires/radio/UpdatePulsed(var/index) var/obj/item/radio/R = holder switch(index) diff --git a/code/datums/wires/smes.dm b/code/datums/wires/smes.dm index 16e0883f842..15eff146d15 100644 --- a/code/datums/wires/smes.dm +++ b/code/datums/wires/smes.dm @@ -63,7 +63,7 @@ var/global/const/SMES_WIRE_FAILSAFES = 16 // Cut to disable failsafes, mend to r if(SMES_WIRE_RCON) if(S.RCon) S.RCon = 0 - addtimer(CALLBACK(src, .proc/reset_rcon), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_rcon)), 1 SECOND) if(SMES_WIRE_INPUT) S.toggle_input() if(SMES_WIRE_OUTPUT) @@ -73,4 +73,4 @@ var/global/const/SMES_WIRE_FAILSAFES = 16 // Cut to disable failsafes, mend to r if(SMES_WIRE_FAILSAFES) if(S.safeties_enabled) S.safeties_enabled = 0 - addtimer(CALLBACK(src, .proc/reset_safeties), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_safeties)), 1 SECOND) diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index a2939c2aa9d..6aabe004cbe 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -92,7 +92,7 @@ get_starting_locations() if(!name_plural) name_plural = name - if(config.protect_roles_from_antagonist) + if(get_config_value(/decl/config/toggle/protect_roles_from_antagonist)) restricted_jobs |= protected_jobs if(antaghud_indicator) if(!global.hud_icon_reference) @@ -131,15 +131,16 @@ return 1 // Get the raw list of potential players. -/decl/special_role/proc/build_candidate_list(datum/game_mode/mode, ghosts_only) +/decl/special_role/proc/build_candidate_list(decl/game_mode/mode, ghosts_only) candidates = list() // Clear. // Prune restricted status. Broke it up for readability. // Note that this is done before jobs are handed out. + var/age_restriction = get_config_value(/decl/config/num/use_age_restriction_for_antags) for(var/datum/mind/player in mode.get_players_for_role(type)) if(ghosts_only && !(isghostmind(player) || isnewplayer(player.current))) log_debug("[key_name(player)] is not eligible to become a [name]: Only ghosts may join as this role!") - else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age) + else if(age_restriction && player.current.client.player_age < minimum_player_age) log_debug("[key_name(player)] is not eligible to become a [name]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!") else if(player.assigned_special_role) log_debug("[key_name(player)] is not eligible to become a [name]: They already have a special role ([player.get_special_role_name("unknown role")])!") @@ -155,14 +156,15 @@ return candidates // Builds a list of potential antags without actually setting them. Used to test mode viability. -/decl/special_role/proc/get_potential_candidates(var/datum/game_mode/mode, var/ghosts_only) +/decl/special_role/proc/get_potential_candidates(var/decl/game_mode/mode, var/ghosts_only) var/candidates = list() // Keeping broken up for readability + var/age_restriction = get_config_value(/decl/config/num/use_age_restriction_for_antags) for(var/datum/mind/player in mode.get_players_for_role(type)) if(ghosts_only && !(isghostmind(player) || isnewplayer(player.current))) continue - if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age) + if(age_restriction && player.current.client.player_age < minimum_player_age) continue if(player.assigned_special_role) continue @@ -205,7 +207,7 @@ return 0 var/datum/mind/player = pending_antagonists[1] - if(!add_antagonist(player,0,0,0,1,1)) + if(!add_antagonist(player, do_not_announce = TRUE, preserve_appearance = TRUE)) message_admins("Could not auto-spawn a [name], failed to add antagonist.") return 0 diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm index 3aeef2a14d6..df05b830089 100644 --- a/code/game/antagonist/antagonist_add.dm +++ b/code/game/antagonist/antagonist_add.dm @@ -22,7 +22,7 @@ /decl/special_role/proc/add_antagonist(var/datum/mind/player, var/ignore_role, var/do_not_equip, var/move_to_spawn, var/do_not_announce, var/preserve_appearance) if(!add_antagonist_mind(player, ignore_role)) - return + return FALSE load_required_map() @@ -40,11 +40,11 @@ if(istype(skill_setter)) skill_setter.initialize_skills(player.current.skillset) if(!do_not_equip) - equip(player.current) + equip_role(player.current) if(player.current) player.current.faction = faction - return 1 + return TRUE /decl/special_role/proc/add_antagonist_mind(var/datum/mind/player, var/ignore_role, var/nonstandard_role_type, var/nonstandard_role_msg) if(!istype(player)) @@ -60,7 +60,7 @@ if(faction_verb) player.current.verbs |= faction_verb - if(config.objectives_disabled == CONFIG_OBJECTIVE_VERB) + if(get_config_value(/decl/config/enum/objectives_disabled) == CONFIG_OBJECTIVE_VERB) player.current.verbs += /mob/proc/add_objectives if(player.current.client) diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index cd86a919362..10c459c2c7d 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -8,7 +8,7 @@ remove_antagonist(target) return 0 if(flags & ANTAG_CHOOSE_NAME) - INVOKE_ASYNC(src, .proc/set_antag_name, target.current) + INVOKE_ASYNC(src, PROC_REF(set_antag_name), target.current) if(move) place_mob(target.current) update_leader() @@ -75,7 +75,7 @@ to_chat(player.current, "[get_leader_welcome_text(player.current)]") else to_chat(player.current, "[get_welcome_text(player.current)]") - if (config.objectives_disabled == CONFIG_OBJECTIVE_NONE || !player.objectives.len) + if (get_config_value(/decl/config/enum/objectives_disabled) == CONFIG_OBJECTIVE_NONE || !player.objectives.len) to_chat(player.current, get_antag_text(player.current)) if((flags & ANTAG_HAS_NUKE) && !spawned_nuke) diff --git a/code/game/antagonist/antagonist_equip.dm b/code/game/antagonist/antagonist_equip.dm index 7284b21584f..4808f235716 100644 --- a/code/game/antagonist/antagonist_equip.dm +++ b/code/game/antagonist/antagonist_equip.dm @@ -1,4 +1,4 @@ -/decl/special_role/proc/equip(var/mob/living/carbon/human/player) +/decl/special_role/proc/equip_role(var/mob/living/carbon/human/player) SHOULD_CALL_PARENT(TRUE) @@ -19,7 +19,7 @@ if(default_outfit) var/decl/hierarchy/outfit/outfit = GET_DECL(default_outfit) - outfit.equip(player) + outfit.equip_outfit(player) if(default_access) var/obj/item/card/id/id = player.get_equipped_item(slot_wear_id_str) @@ -31,7 +31,7 @@ return TRUE -/decl/special_role/proc/unequip(var/mob/living/carbon/human/player) +/decl/special_role/proc/unequip_role(var/mob/living/carbon/human/player) return istype(player) /decl/special_role/proc/equip_rig(var/rig_type, var/mob/living/carbon/human/player) diff --git a/code/game/antagonist/antagonist_helpers.dm b/code/game/antagonist/antagonist_helpers.dm index 6f7cbf938ca..f882c80efcd 100644 --- a/code/game/antagonist/antagonist_helpers.dm +++ b/code/game/antagonist/antagonist_helpers.dm @@ -12,7 +12,7 @@ if(player.current && player.current.client) var/client/C = player.current.client // Limits antag status to clients above player age, if the age system is being used. - if(C && config.use_age_restriction_for_jobs && isnum(C.player_age) && isnum(min_player_age) && (C.player_age < min_player_age)) + if(C && get_config_value(/decl/config/num/use_age_restriction_for_jobs) && isnum(C.player_age) && isnum(min_player_age) && (C.player_age < min_player_age)) return FALSE if(player.assigned_job) if(is_type_in_list(player.assigned_job, blacklisted_jobs) || is_type_in_list(player.assigned_job, restricted_jobs)) diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm index 019249fa72a..5e0f27068cf 100644 --- a/code/game/antagonist/antagonist_objectives.dm +++ b/code/game/antagonist/antagonist_objectives.dm @@ -1,12 +1,12 @@ /decl/special_role/proc/create_global_objectives(var/override=0) - if(config.objectives_disabled != CONFIG_OBJECTIVE_ALL && !override) + if(get_config_value(/decl/config/enum/objectives_disabled) != CONFIG_OBJECTIVE_ALL && !override) return 0 if(global_objectives && global_objectives.len) return 0 return 1 /decl/special_role/proc/create_objectives(var/datum/mind/player, var/override=0) - if(config.objectives_disabled != CONFIG_OBJECTIVE_ALL && !override) + if(get_config_value(/decl/config/enum/objectives_disabled) != CONFIG_OBJECTIVE_ALL && !override) return 0 if(create_global_objectives(override) || global_objectives.len) player.objectives |= global_objectives diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 5f2f4971cb9..454d1c1b2f1 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -81,7 +81,7 @@ if(I.loc == player.current) qdel(I) -/decl/special_role/proc/update_current_antag_max(datum/game_mode/mode) +/decl/special_role/proc/update_current_antag_max(decl/game_mode/mode) cur_max = hard_cap if(type in mode.associated_antags) cur_max = hard_cap_round diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 569da9f53ec..b381a6f3fbc 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -27,7 +27,7 @@ global_objectives |= new /datum/objective/nuclear return 1 -/decl/special_role/mercenary/equip(var/mob/living/carbon/human/player) +/decl/special_role/mercenary/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) var/obj/item/radio/uplink/U = new(get_turf(player), player.mind, DEFAULT_TELECRYSTAL_AMOUNT) diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm index 043d70da251..a11cfa5ae17 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/code/game/antagonist/outsider/ninja.dm @@ -18,7 +18,7 @@ rig_type = /obj/item/rig/light/ninja /decl/special_role/ninja/attempt_random_spawn() - if(config.ninjas_allowed) + if(get_config_value(/decl/config/toggle/ninjas_allowed)) ..() /decl/special_role/ninja/create_objectives(var/datum/mind/ninja) @@ -98,7 +98,7 @@ hands = list(/obj/item/modular_computer/pda/ninja) id_type = /obj/item/card/id/syndicate -/decl/special_role/ninja/equip(var/mob/living/carbon/human/player) +/decl/special_role/ninja/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) var/decl/uplink_source/pda/uplink_source = GET_DECL(/decl/uplink_source/pda) diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index e64d15e9f82..0123b9a0942 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -64,7 +64,7 @@ wizard.current.real_name = "[pick(global.wizard_first)] [pick(global.wizard_second)]" wizard.current.SetName(wizard.current.real_name) -/decl/special_role/wizard/equip(var/mob/living/carbon/human/wizard_mob) +/decl/special_role/wizard/equip_role(var/mob/living/carbon/human/wizard_mob) default_outfit = pick(decls_repository.get_decl_paths_of_subtype(/decl/hierarchy/outfit/wizard)) . = ..() diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 8675b2a5fb4..25c20aa16ae 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -69,7 +69,7 @@ sacrifice_target = sacrifice.target global_objectives |= sacrifice -/decl/special_role/cultist/equip(var/mob/living/carbon/human/player) +/decl/special_role/cultist/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) var/obj/item/book/tome/T = new(get_turf(player)) diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm index 7dbc740eb29..1269452a0b4 100644 --- a/code/game/antagonist/station/renegade.dm +++ b/code/game/antagonist/station/renegade.dm @@ -43,7 +43,7 @@ survive.owner = player player.objectives |= survive -/decl/special_role/renegade/equip(var/mob/living/carbon/human/player) +/decl/special_role/renegade/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) var/gun_type = pick(spawn_guns) diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 0256a4b3aee..b56b094a7d8 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -42,7 +42,7 @@ rev_obj.explanation_text = "Assassinate, capture or convert [player.real_name], the [player.mind.assigned_role]." global_objectives += rev_obj -/decl/special_role/revolutionary/equip(var/mob/living/carbon/human/player) +/decl/special_role/revolutionary/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) spawn_uplink(player) diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index e7e43e27c10..29b5bcc9722 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -67,7 +67,32 @@ traitor.objectives += hijack_objective return -/decl/special_role/traitor/equip(var/mob/living/carbon/human/player) +/decl/special_role/traitor/add_antagonist(datum/mind/player, ignore_role, do_not_equip, move_to_spawn, do_not_announce, preserve_appearance) + . = ..() + if(.) + + var/list/dudes = list() + for(var/mob/living/carbon/human/man in global.player_list) + if(man.client) + var/decl/cultural_info/culture = man.get_cultural_value(TAG_FACTION) + if(culture && prob(culture.subversive_potential)) + dudes += man + dudes -= player.current + + if(length(dudes)) + var/mob/living/carbon/human/M = pick(dudes) + to_chat(player.current, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") + player.StoreMemory("Potential Collaborator: [M.real_name]", /decl/memory_options/system) + to_chat(M, "The subversive potential of your faction has been noticed, and you may be contacted for assistance soon...") + + to_chat(player.current, "Your employers provided you with the following information on how to identify possible allies:") + to_chat(player.current, "Code Phrase: [syndicate_code_phrase]") + to_chat(player.current, "Code Response: [syndicate_code_response]") + player.StoreMemory("Code Phrase: [syndicate_code_phrase]", /decl/memory_options/system) + player.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) + to_chat(player.current, "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + +/decl/special_role/traitor/equip_role(var/mob/living/carbon/human/player) . = ..() if(issilicon(player)) // this needs to be here because ..() returns false if the mob isn't human @@ -83,27 +108,6 @@ else return FALSE - var/list/dudes = list() - for(var/mob/living/carbon/human/man in global.player_list) - if(man.client) - var/decl/cultural_info/culture = man.get_cultural_value(TAG_FACTION) - if(culture && prob(culture.subversive_potential)) - dudes += man - dudes -= player - - if(LAZYLEN(dudes)) - var/mob/living/carbon/human/M = pick(dudes) - to_chat(player, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") - player.StoreMemory("Potential Collaborator: [M.real_name]", /decl/memory_options/system) - to_chat(M, "The subversive potential of your faction has been noticed, and you may be contacted for assistance soon...") - - to_chat(player, "Your employers provided you with the following information on how to identify possible allies:") - to_chat(player, "Code Phrase: [syndicate_code_phrase]") - to_chat(player, "Code Response: [syndicate_code_response]") - player.StoreMemory("Code Phrase: [syndicate_code_phrase]", /decl/memory_options/system) - player.StoreMemory("Code Response: [syndicate_code_response]", /decl/memory_options/system) - to_chat(player, "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - /decl/special_role/traitor/proc/spawn_uplink(var/mob/living/carbon/human/traitor_mob) setup_uplink_source(traitor_mob, DEFAULT_TELECRYSTAL_AMOUNT) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 3b576339f3d..f97c51be41c 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -1,3 +1,5 @@ +/// This list of names is here to make sure we don't state our descriptive blurb to a person more than once. +var/global/list/area_blurb_stated_to = list() var/global/list/areas = list() /area @@ -41,6 +43,7 @@ var/global/list/areas = list() var/list/forced_ambience var/sound_env = STANDARD_STATION var/description //A text-based description of what this area is for. + var/area_blurb_category // Used to filter description showing across subareas var/base_turf // The base turf type of the area, which can be used to override the z-level's base turf var/open_turf // The base turf of the area if it has a turf below it in multizi. Overrides turf-specific open type @@ -54,7 +57,6 @@ var/global/list/areas = list() var/list/air_scrub_names = list() var/list/air_vent_info = list() var/list/air_scrub_info = list() - var/list/blurbed_stated_to = list() //This list of names is here to make sure we don't state our descriptive blurb to a person more than once. var/tmp/is_outside = OUTSIDE_NO @@ -65,6 +67,8 @@ var/global/list/areas = list() uid = ++global_uid proper_name = strip_improper(name) luminosity = !dynamic_lighting + if(isnull(area_blurb_category)) + area_blurb_category = type ..() /area/Initialize() @@ -128,6 +132,7 @@ var/global/list/areas = list() T.last_outside_check = OUTSIDE_UNCERTAIN if(T.is_outside == OUTSIDE_AREA && T.is_outside() != old_outside) T.update_weather() + T.update_external_atmos_participation() /turf/proc/update_registrations_on_adjacent_area_change() for(var/obj/machinery/door/firedoor/door in src) @@ -347,12 +352,10 @@ var/global/list/mob/living/forced_ambiance_list = new /area/proc/do_area_blurb(var/mob/living/L) if(isnull(description)) return - if(L?.get_preference_value(/datum/client_preference/area_info_blurb) != PREF_YES) return - - if(!(L.ckey in blurbed_stated_to)) - blurbed_stated_to += L.ckey + if(!(L.ckey in global.area_blurb_stated_to[area_blurb_category])) + LAZYADD(global.area_blurb_stated_to[area_blurb_category], L.ckey) to_chat(L, SPAN_NOTICE(FONT_SMALL("[description]"))) /area/proc/play_ambience(var/mob/living/L) @@ -401,7 +404,7 @@ var/global/list/mob/living/forced_ambiance_list = new /area/proc/throw_unbuckled_occupants(var/maxrange, var/speed, var/direction) for(var/mob/M in src) - addtimer(CALLBACK(src, .proc/throw_unbuckled_occupant, M, maxrange, speed, direction), 0) + addtimer(CALLBACK(src, PROC_REF(throw_unbuckled_occupant), M, maxrange, speed, direction), 0) /area/proc/throw_unbuckled_occupant(var/mob/M, var/maxrange, var/speed, var/direction) if(iscarbon(M)) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c0a8824cac5..27756db588b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,8 +1,8 @@ /atom - /// (1 | 2) Determines if this atom is below `1` or above `2` plating. TODO: Use defines. - var/level = 2 + /// (DEFINE) Determines where this atom sits in terms of turf plating. See misc.dm + var/level = LEVEL_ABOVE_PLATING /// (BITFLAG) See flags.dm - var/atom_flags = ATOM_FLAG_NO_TEMP_CHANGE + var/atom_flags = 0 /// (FLOAT) The world.time that this atom last bumped another. Used mostly by mobs. var/last_bumped = 0 /// (BITFLAG) See flags.dm @@ -27,8 +27,8 @@ var/was_bloodied /// (COLOR) The color of the blood shown on blood overlays. var/blood_color - /// (1 | 2 | 3) If it shows up under UV light. 0 doesn't, 1 does, 2 is currently glowing due to UV light. TODO: Use defines - var/fluorescent + /// (FALSE|DEFINES) How this atom is interacting with UV light. See misc.dm + var/fluorescent = FALSE /// (LIST) A list of all mobs that are climbing or currently on this atom @@ -116,7 +116,7 @@ /// Handle reagents being modified /atom/proc/on_reagent_change() - return + SHOULD_CALL_PARENT(TRUE) /** Handle an atom bumping this atom @@ -143,7 +143,7 @@ Handle an atom entering this atom's proximity Called when an atom enters this atom's proximity. Both this and the other atom - need to have the PROXMOVE flag (as it helps reduce lag). + need to have the MOVABLE_FLAG_PROXMOVE flag (as it helps reduce lag). - `AM`: The atom entering proximity - Return: `TRUE` if proximity should continue to be handled, otherwise `FALSE` @@ -331,11 +331,33 @@ SHOULD_CALL_PARENT(FALSE) //Don't call the stub plz return +/** + * Returns the sum of this atoms's reagents plus the combined matter of all its contents. + * Obj adds matter contents. Other overrides may add extra handling for things like material storage. + * Most useful for calculating worth or deconstructing something along with its contents. + */ +/atom/proc/get_contained_matter() + if(length(reagents?.reagent_volumes)) + LAZYINITLIST(.) + for(var/R in reagents.reagent_volumes) + .[R] += FLOOR(REAGENT_VOLUME(reagents, R) / REAGENT_UNITS_PER_MATERIAL_UNIT) + for(var/atom/contained_obj as anything in get_contained_external_atoms()) // machines handle component parts separately + . = MERGE_ASSOCS_WITH_NUM_VALUES(., contained_obj.get_contained_matter()) + /// Return a list of all simulated atoms inside this one. /atom/proc/get_contained_external_atoms() for(var/atom/movable/AM in contents) if(!QDELETED(AM) && AM.simulated) LAZYADD(., AM) + if(has_extension(src, /datum/extension/loaded_cell)) + var/datum/extension/loaded_cell/cell_loaded = get_extension(src, /datum/extension/loaded_cell) + var/cell = cell_loaded?.get_cell() + if(cell) + LAZYREMOVE(., cell) + +// Return a list of all temperature-sensitive atoms, defaulting to above. +/atom/proc/get_contained_temperature_sensitive_atoms() + return get_contained_external_atoms() /// Dump the contents of this atom onto its loc /atom/proc/dump_contents() @@ -408,7 +430,8 @@ - `exposed_volume`: The volume of the air */ /atom/proc/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return + SHOULD_CALL_PARENT(TRUE) + handle_external_heating(exposed_temperature) /// Handle this atom being destroyed through melting /atom/proc/melt() @@ -471,7 +494,7 @@ SHOULD_CALL_PARENT(TRUE) if(!simulated) return - fluorescent = 0 + fluorescent = FALSE germ_level = 0 blood_color = null if(istype(blood_DNA, /list)) @@ -703,43 +726,50 @@ if(M.lying) return //No spamming this on people. SET_STATUS_MAX(M, STAT_WEAK, 3) - to_chat(M, "You topple as \the [src] moves under you!") - + to_chat(M, SPAN_DANGER("You topple as \the [src] moves under you!")) if(prob(25)) - var/damage = rand(15,30) - var/mob/living/carbon/human/H = M - if(!istype(H)) - to_chat(H, "You land heavily!") + var/obj/item/organ/external/affecting = SAFEPICK(M.get_external_organs()) + if(!affecting) + to_chat(M, SPAN_DANGER("You land heavily!")) M.adjustBruteLoss(damage) - return - - var/obj/item/organ/external/affecting = pick(H.get_external_organs()) - if(affecting) - to_chat(M, "You land heavily on your [affecting.name]!") + else + to_chat(M, SPAN_DANGER("You land heavily on your [affecting.name]!")) affecting.take_external_damage(damage, 0) if(affecting.parent) affecting.parent.add_autopsy_data("Misadventure", damage) - else - to_chat(H, "You land heavily!") - H.adjustBruteLoss(damage) - - H.UpdateDamageIcon() - H.updatehealth() - return /// Get the current color of this atom. /atom/proc/get_color() return color -/// Set the color of this atom to `new_color`. -/atom/proc/set_color(new_color) - color = new_color +/* Set the atom colour. This is a stub effectively due to the broad use of direct setting. */ +// TODO: implement this everywhere that it should be used instead of direct setting. +/atom/proc/set_color(var/new_color) + if(isnull(new_color)) + return reset_color() + if(color != new_color) + color = new_color + return TRUE + return FALSE + +/atom/proc/reset_color() + if(!isnull(color)) + color = null + return TRUE + return FALSE + +/atom/proc/set_alpha(var/new_alpha) + if(alpha != new_alpha) + alpha = new_alpha + return TRUE + return FALSE /// Get any power cell associated with this atom. /atom/proc/get_cell() RETURN_TYPE(/obj/item/cell) - return + var/datum/extension/loaded_cell/cell_loaded = get_extension(src, /datum/extension/loaded_cell) + return cell_loaded?.get_cell() /** Get any radio associated with this atom. @@ -752,15 +782,6 @@ RETURN_TYPE(/obj/item/radio) return -/** - Get the material cost of this atom. - - - Return: An dictionary where key is the material and value is the amount. -*/ -/atom/proc/building_cost() - RETURN_TYPE(/list) - . = list() - /atom/Topic(href, href_list) var/mob/user = usr if(href_list["look_at_me"] && istype(user)) @@ -855,3 +876,12 @@ /atom/proc/on_defilement() return + +/atom/proc/get_overhead_text_x_offset() + return 0 + +/atom/proc/get_overhead_text_y_offset() + return 0 + +/atom/proc/can_be_injected_by(var/atom/injector) + return FALSE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0588748a8d6..f15419425bc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -10,7 +10,7 @@ var/buckle_layer_above = FALSE var/buckle_dir = 0 var/buckle_lying = -1 // bed-like behavior, forces mob.lying = buckle_lying if != -1 - var/buckle_pixel_shift // ex. @"{'x':0,'y':0,'z':0}" //where the buckled mob should be pixel shifted to, or null for no pixel shift control + var/buckle_pixel_shift // ex. @'{"x":0,"y":0,"z":0}' //where the buckled mob should be pixel shifted to, or null for no pixel shift control var/buckle_require_restraints = 0 // require people to be cuffed before being able to buckle. eg: pipes var/buckle_require_same_tile = FALSE var/buckle_sound @@ -144,7 +144,7 @@ if (A && yes) A.last_bumped = world.time - INVOKE_ASYNC(A, /atom/proc/Bumped, src) // Avoids bad actors sleeping or unexpected side effects, as the legacy behavior was to spawn here + INVOKE_ASYNC(A, TYPE_PROC_REF(/atom, Bumped), src) // Avoids bad actors sleeping or unexpected side effects, as the legacy behavior was to spawn here ..() /atom/movable/proc/forceMove(atom/destination) @@ -348,7 +348,7 @@ /atom/movable/proc/can_buckle_mob(var/mob/living/dropping) . = (can_buckle && istype(dropping) && !dropping.buckled && !dropping.anchored && !dropping.buckled_mob && !buckled_mob) -/atom/movable/receive_mouse_drop(atom/dropping, mob/living/user) +/atom/movable/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && can_buckle_mob(dropping)) user_buckle_mob(dropping, user) @@ -464,5 +464,9 @@ if(simulated && !anchored) step_towards(src, S) +/atom/movable/proc/crossed_mob(var/mob/living/victim) + return + /atom/movable/proc/get_object_size() - return ITEM_SIZE_NORMAL \ No newline at end of file + return ITEM_SIZE_NORMAL + diff --git a/code/game/atoms_movable_interactions.dm b/code/game/atoms_movable_interactions.dm index dbc52b71a14..110c09afb82 100644 --- a/code/game/atoms_movable_interactions.dm +++ b/code/game/atoms_movable_interactions.dm @@ -1,6 +1,6 @@ /atom/movable/get_alt_interactions(var/mob/user) . = ..() - if(config.expanded_alt_interactions) + if(get_config_value(/decl/config/toggle/expanded_alt_interactions)) LAZYADD(., list( /decl/interaction_handler/look, /decl/interaction_handler/grab diff --git a/code/game/atoms_movable_overlay.dm b/code/game/atoms_movable_overlay.dm index a50abbb36a8..9d286c7913f 100644 --- a/code/game/atoms_movable_overlay.dm +++ b/code/game/atoms_movable_overlay.dm @@ -23,8 +23,8 @@ events_repository.register(/decl/observ/moved, master, src, follow_proc) SetInitLoc() - events_repository.register(/decl/observ/destroyed, master, src, /datum/proc/qdel_self) - events_repository.register(/decl/observ/dir_set, master, src, /atom/proc/recursive_dir_set) + events_repository.register(/decl/observ/destroyed, master, src, TYPE_PROC_REF(/datum, qdel_self)) + events_repository.register(/decl/observ/dir_set, master, src, TYPE_PROC_REF(/atom, recursive_dir_set)) . = ..() diff --git a/code/game/atoms_temperature.dm b/code/game/atoms_temperature.dm index 6b884af473b..609bac2f7b2 100644 --- a/code/game/atoms_temperature.dm +++ b/code/game/atoms_temperature.dm @@ -1,8 +1,7 @@ -#define MIN_TEMPERATURE_COEFFICIENT 1 -#define MAX_TEMPERATURE_COEFFICIENT 10 - /atom + /// What is this atom's current temperature? var/temperature = T20C + /// How rapidly does this atom equalize with ambient temperature? var/temperature_coefficient = MAX_TEMPERATURE_COEFFICIENT /atom/movable/Entered(var/atom/movable/atom, var/atom/old_loc) @@ -18,26 +17,30 @@ /turf temperature_coefficient = MIN_TEMPERATURE_COEFFICIENT -/obj/Initialize(mapload) - . = ..() - temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - w_class, MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient - create_matter() - //Only apply directional offsets if the mappers haven't set any offsets already - if(!pixel_x && !pixel_y && !pixel_w && !pixel_z) - update_directional_offset() +// If this is a simulated atom, adjust our temperature. +// This will eventually propagate to our contents via ProcessAtomTemperature() +/atom/proc/handle_external_heating(var/adjust_temp, var/obj/item/heated_by, var/mob/user) + + if(!ATOM_SHOULD_TEMPERATURE_ENQUEUE(src)) + return FALSE + + var/diff_temp = round(adjust_temp - temperature, 0.1) + if(diff_temp <= 0.1) + return FALSE -/obj/proc/HandleObjectHeating(var/obj/item/heated_by, var/mob/user, var/adjust_temp) - if(ATOM_SHOULD_TEMPERATURE_ENQUEUE(src)) + // Show a little message for people heating beakers with welding torches. + if(user && heated_by) visible_message(SPAN_NOTICE("\The [user] carefully heats \the [src] with \the [heated_by].")) - var/diff_temp = (adjust_temp - temperature) - if(diff_temp >= 0) - var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) - ADJUST_ATOM_TEMPERATURE(src, min(adjust_temp, altered_temp)) + // Update our own heat. + var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) + ADJUST_ATOM_TEMPERATURE(src, min(adjust_temp, altered_temp)) + return TRUE /mob/Initialize() . = ..() temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - FLOOR(mob_size/4), MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient +// TODO: move mob bodytemperature onto this proc. /atom/proc/ProcessAtomTemperature() SHOULD_NOT_SLEEP(TRUE) @@ -52,13 +55,16 @@ else if(loc) adjust_temp = loc.temperature + // Determine if our temperature needs to change. + var/old_temp = temperature var/diff_temp = adjust_temp - temperature if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) ADJUST_ATOM_TEMPERATURE(src, (diff_temp > 0) ? min(adjust_temp, altered_temp) : max(adjust_temp, altered_temp)) else temperature = adjust_temp - return PROCESS_KILL + . = PROCESS_KILL -#undef MIN_TEMPERATURE_COEFFICIENT -#undef MAX_TEMPERATURE_COEFFICIENT + // If our temperature changed, our contents probably want to know about it. + if(temperature != old_temp) + queue_temperature_atoms(get_contained_temperature_sensitive_atoms()) diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm index edb7d1006f7..671213c63e8 100644 --- a/code/game/base_turf.dm +++ b/code/game/base_turf.dm @@ -11,12 +11,30 @@ if(HasBelow(T.z)) if(istype(A) && A.open_turf) return A.open_turf + + // Find the first non-open turf below and use its open_turf_type. + var/z_stack_type = get_open_turf_type(T) + if(z_stack_type) + return z_stack_type + + // Otherwise, default to the open turf type set on the turf being removed. if(T.open_turf_type) return T.open_turf_type if(istype(A) && A.base_turf) return A.base_turf return get_base_turf(T.z) +// Returns the open turf of a Z-stack by finding the nearest non-open turf below. +/proc/get_open_turf_type(var/turf/T) + if(!HasBelow(T.z)) + return + var/turf/below = T + while ((below = GetBelow(below))) + if(!below.is_open() || !HasBelow(below.z)) + if(below.open_turf_type) + return below.open_turf_type + return + /client/proc/set_base_turf() set category = "Debug" set name = "Set Base Turf" diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 0121e88e2d2..e62b0ac06ce 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -121,21 +121,25 @@ var/global/list/assigned_blocks[DNA_SE_LENGTH] // INITIALIZE! ResetUI(1) - SetUIValueRange(DNA_UI_HAIR_R, HEX_RED(character.hair_colour), 255, 1) - SetUIValueRange(DNA_UI_HAIR_G, HEX_GREEN(character.hair_colour), 255, 1) - SetUIValueRange(DNA_UI_HAIR_B, HEX_BLUE(character.hair_colour), 255, 1) - - SetUIValueRange(DNA_UI_BEARD_R, HEX_RED(character.facial_hair_colour), 255, 1) - SetUIValueRange(DNA_UI_BEARD_G, HEX_GREEN(character.facial_hair_colour), 255, 1) - SetUIValueRange(DNA_UI_BEARD_B, HEX_BLUE(character.facial_hair_colour), 255, 1) - - SetUIValueRange(DNA_UI_EYES_R, HEX_RED(character.eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_G, HEX_GREEN(character.eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_B, HEX_BLUE(character.eye_colour), 255, 1) - - SetUIValueRange(DNA_UI_SKIN_R, HEX_RED(character.skin_colour), 255, 1) - SetUIValueRange(DNA_UI_SKIN_G, HEX_GREEN(character.skin_colour), 255, 1) - SetUIValueRange(DNA_UI_SKIN_B, HEX_BLUE(character.skin_colour), 255, 1) + var/hair_colour = character.get_hair_colour() + SetUIValueRange(DNA_UI_HAIR_R, HEX_RED(hair_colour), 255, 1) + SetUIValueRange(DNA_UI_HAIR_G, HEX_GREEN(hair_colour), 255, 1) + SetUIValueRange(DNA_UI_HAIR_B, HEX_BLUE(hair_colour), 255, 1) + + var/facial_hair_colour = character.get_facial_hair_colour() + SetUIValueRange(DNA_UI_BEARD_R, HEX_RED(facial_hair_colour), 255, 1) + SetUIValueRange(DNA_UI_BEARD_G, HEX_GREEN(facial_hair_colour), 255, 1) + SetUIValueRange(DNA_UI_BEARD_B, HEX_BLUE(facial_hair_colour), 255, 1) + + var/eye_colour = character.get_eye_colour() + SetUIValueRange(DNA_UI_EYES_R, HEX_RED(eye_colour), 255, 1) + SetUIValueRange(DNA_UI_EYES_G, HEX_GREEN(eye_colour), 255, 1) + SetUIValueRange(DNA_UI_EYES_B, HEX_BLUE(eye_colour), 255, 1) + + var/skin_colour = character.get_skin_colour() + SetUIValueRange(DNA_UI_SKIN_R, HEX_RED(skin_colour), 255, 1) + SetUIValueRange(DNA_UI_SKIN_G, HEX_GREEN(skin_colour), 255, 1) + SetUIValueRange(DNA_UI_SKIN_B, HEX_BLUE(skin_colour), 255, 1) SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.skin_tone, 220, 1) // Value can be negative. @@ -146,11 +150,11 @@ var/global/list/assigned_blocks[DNA_SE_LENGTH] // Hair var/list/hair_types = decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/hair) - SetUIValueRange(DNA_UI_HAIR_STYLE, hair_types.Find(character.h_style), length(hair_types), 1) + SetUIValueRange(DNA_UI_HAIR_STYLE, hair_types.Find(character.get_hairstyle()), length(hair_types), 1) // Facial Hair var/list/beard_types = decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/facial_hair) - SetUIValueRange(DNA_UI_BEARD_STYLE, beard_types.Find(character.f_style), length(beard_types), 1) + SetUIValueRange(DNA_UI_BEARD_STYLE, beard_types.Find(character.get_facial_hairstyle()), length(beard_types), 1) body_markings.Cut() for(var/obj/item/organ/external/E in character.get_external_organs()) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 48c4da795e0..6d9b2912b64 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -143,13 +143,14 @@ dna.check_integrity() - fingerprint = dna.fingerprint - unique_enzymes = dna.unique_enzymes - hair_colour = rgb(dna.GetUIValueRange(DNA_UI_HAIR_R,255), dna.GetUIValueRange(DNA_UI_HAIR_G,255), dna.GetUIValueRange(DNA_UI_HAIR_B,255)) - facial_hair_colour = rgb(dna.GetUIValueRange(DNA_UI_BEARD_R,255), dna.GetUIValueRange(DNA_UI_BEARD_G,255), dna.GetUIValueRange(DNA_UI_BEARD_B,255)) - skin_colour = rgb(dna.GetUIValueRange(DNA_UI_SKIN_R,255), dna.GetUIValueRange(DNA_UI_SKIN_G,255), dna.GetUIValueRange(DNA_UI_SKIN_B,255)) - eye_colour = rgb(dna.GetUIValueRange(DNA_UI_EYES_R,255), dna.GetUIValueRange(DNA_UI_EYES_G,255), dna.GetUIValueRange(DNA_UI_EYES_B,255)) - skin_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative. + fingerprint = dna.fingerprint + unique_enzymes = dna.unique_enzymes + set_skin_colour( rgb(dna.GetUIValueRange(DNA_UI_SKIN_R,255), dna.GetUIValueRange(DNA_UI_SKIN_G,255), dna.GetUIValueRange(DNA_UI_SKIN_B,255))) + set_eye_colour( rgb(dna.GetUIValueRange(DNA_UI_EYES_R,255), dna.GetUIValueRange(DNA_UI_EYES_G,255), dna.GetUIValueRange(DNA_UI_EYES_B,255))) + set_hair_colour( rgb(dna.GetUIValueRange(DNA_UI_HAIR_R,255), dna.GetUIValueRange(DNA_UI_HAIR_G,255), dna.GetUIValueRange(DNA_UI_HAIR_B,255))) + set_facial_hair_colour(rgb(dna.GetUIValueRange(DNA_UI_BEARD_R,255), dna.GetUIValueRange(DNA_UI_BEARD_G,255), dna.GetUIValueRange(DNA_UI_BEARD_B,255))) + skin_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative. + // TODO: update DNA gender to not be a bool - use bodytype and pronouns //Body markings @@ -167,19 +168,23 @@ organ.set_dna(dna) //Hair + var/update_hair = FALSE var/list/hair_subtypes = decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/hair) var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE, length(hair_subtypes)) if(hair > 0 && hair <= length(hair_subtypes)) - h_style = hair_subtypes[hair] + set_hairstyle(hair_subtypes[hair], skip_update = TRUE) + update_hair = TRUE //Facial Hair var/list/beard_subtypes = decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/facial_hair) var/beard = dna.GetUIValueRange(DNA_UI_BEARD_STYLE, length(beard_subtypes)) if((0 < beard) && (beard <= length(beard_subtypes))) - f_style = beard_subtypes[beard] + set_facial_hairstyle(beard_subtypes[beard], skip_update = TRUE) + update_hair = TRUE force_update_limbs() - update_hair(update_icons = FALSE) + if(update_hair) + update_hair(update_icons = FALSE) update_eyes() return TRUE diff --git a/code/game/gamemodes/calamity/calamity.dm b/code/game/gamemodes/calamity/calamity.dm index a2ff5594b92..5c809eee420 100644 --- a/code/game/gamemodes/calamity/calamity.dm +++ b/code/game/gamemodes/calamity/calamity.dm @@ -1,16 +1,16 @@ #define ANTAG_TYPE_RATIO 8 -/datum/game_mode/calamity +/decl/game_mode/calamity name = "Calamity" round_description = "This must be a Thursday. You never could get the hang of Thursdays..." extended_round_description = "All hell is about to break loose. Literally every antagonist type may spawn in this round. Hold on tight." - config_tag = "calamity" + uid = "calamity" required_players = 1 votable = 0 event_delay_mod_moderate = 0.5 event_delay_mod_major = 0.75 -/datum/game_mode/calamity/create_antagonists() +/decl/game_mode/calamity/create_antagonists() var/list/antag_candidates = list() var/list/all_antagonist_datums = decls_repository.get_decls_of_subtype(/decl/special_role) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index c10826eba7c..02002444604 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -1,9 +1,10 @@ -/datum/game_mode/cult +/decl/game_mode/cult name = "Cult" round_description = "Some crewmembers are attempting to start a cult!" extended_round_description = "There has been an infiltration by a fanatical group of death-cultists! They will use powers from beyond your comprehension to subvert you to their cause and ultimately please their gods through sacrificial summons and physical immolation! Try to survive!" - config_tag = "cult" + uid = "cult" required_players = 10 required_enemies = 3 end_on_antag_death = FALSE associated_antags = list(/decl/special_role/cultist) + probability = 1 diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 1c21c09ee7a..28daf9435d2 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -42,9 +42,8 @@ /obj/item/clothing/head/culthood name = "cult hood" desc = "A hood worn by the followers of Nar-Sie." - icon = 'icons/clothing/head/cult.dmi' - flags_inv = HIDEFACE + flags_inv = HIDEFACE | BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index e45dc9f48a4..769fbc05658 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -94,7 +94,6 @@ icon = 'icons/obj/cult.dmi' icon_state = "hole" density = TRUE - unacidable = 1 anchored = TRUE var/spawnable = null @@ -118,7 +117,7 @@ /obj/effect/gateway/active/Initialize() . = ..() - addtimer(CALLBACK(src, .proc/create_and_delete), rand(30,60) SECONDS) + addtimer(CALLBACK(src, PROC_REF(create_and_delete)), rand(30,60) SECONDS) /obj/effect/gateway/active/proc/create_and_delete() @@ -126,41 +125,43 @@ new t(src.loc) qdel(src) -/obj/effect/gateway/active/Crossed(var/atom/A) - if(!isliving(A)) +/obj/effect/gateway/active/Crossed(var/atom/movable/AM) + if(!isliving(AM)) return - var/mob/living/M = A + var/mob/living/M = AM + if(M.stat == DEAD) + return - if(M.stat != DEAD) - if(M.HasMovementHandler(/datum/movement_handler/mob/transformation)) - return + if(M.HasMovementHandler(/datum/movement_handler/mob/transformation)) + return - M.handle_pre_transformation() + M.handle_pre_transformation() - if(iscultist(M)) return - if(!ishuman(M) && !isrobot(M)) return + if(iscultist(M)) + return + if(!ishuman(M) && !isrobot(M)) + return - M.AddMovementHandler(/datum/movement_handler/mob/transformation) - M.icon = null - M.overlays.len = 0 - M.set_invisibility(101) + M.AddMovementHandler(/datum/movement_handler/mob/transformation) + M.icon = null + M.overlays.len = 0 + M.set_invisibility(INVISIBILITY_ABSTRACT) - if(isrobot(M)) - var/mob/living/silicon/robot/Robot = M - if(Robot.mmi) - qdel(Robot.mmi) - else - for(var/obj/item/W in M) - M.drop_from_inventory(W) - if(istype(W, /obj/item/implant)) - qdel(W) - - var/mob/living/new_mob = new /mob/living/simple_animal/corgi(A.loc) - new_mob.a_intent = I_HURT - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key + if(isrobot(M)) + var/mob/living/silicon/robot/Robot = M + QDEL_NULL(Robot.central_processor) + else + for(var/obj/item/W in M) + M.drop_from_inventory(W) + if(istype(W, /obj/item/implant)) + qdel(W) + + var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) + new_mob.a_intent = I_HURT + if(M.mind) + M.mind.transfer_to(new_mob) + else + new_mob.key = M.key - to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes + to_chat(new_mob, "Your form morphs into that of a corgi.")//Because we don't have cluwnes diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm index 60751eaabdd..8c95baa107c 100644 --- a/code/game/gamemodes/cult/cultify/mob.dm +++ b/code/game/gamemodes/cult/cultify/mob.dm @@ -6,7 +6,7 @@ icon = 'icons/mob/mob.dmi' icon_state = "ghost-narsie" cut_overlays() - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) to_chat(src, SPAN_SINISTER("Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.")) /mob/living/on_defilement() @@ -20,7 +20,7 @@ G.icon = 'icons/mob/mob.dmi' G.icon_state = "ghost-narsie" G.overlays.Cut() - G.set_invisibility(0) + G.set_invisibility(INVISIBILITY_NONE) to_chat(G, "You feel relieved as what's left of your soul finally escapes its prison of flesh.") else dust() diff --git a/code/game/gamemodes/cult/ghosts.dm b/code/game/gamemodes/cult/ghosts.dm index b05e1c27b5d..c54ccc706bb 100644 --- a/code/game/gamemodes/cult/ghosts.dm +++ b/code/game/gamemodes/cult/ghosts.dm @@ -246,7 +246,7 @@ return to_chat(choice, "You feel as if something cold passed through you!") - var/temp_threshold = choice.get_temperature_threshold(COLD_LEVEL_1) + var/temp_threshold = choice.get_mob_temperature_threshold(COLD_LEVEL_1) if(choice.bodytemperature >= temp_threshold + 1) choice.bodytemperature = max(temp_threshold + 1, choice.bodytemperature - 30) to_chat(src, "You pass through \the [choice], giving them a sudden chill.") @@ -286,5 +286,5 @@ else ghost_magic_cd = world.time + 60 SECONDS to_chat(src, "You are now visible.") - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) mouse_opacity = MOUSE_OPACITY_UNCLICKABLE // This is so they don't make people invincible to melee attacks by hovering over them diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm index b1346e2cb1f..90ba89f658a 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/code/game/gamemodes/cult/narsie.dm @@ -16,7 +16,6 @@ var/global/list/narsie_list = list() icon = 'icons/obj/narsie.dmi' icon_state = "narsie" anchored = TRUE - unacidable = TRUE pixel_x = -236 pixel_y = -256 plane = ABOVE_LIGHTING_PLANE diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 2d96c7d7ccb..6c2bb0e2eeb 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -4,7 +4,6 @@ anchored = TRUE icon = 'icons/effects/uristrunes.dmi' icon_state = "blank" - unacidable = 1 layer = RUNE_LAYER var/blood @@ -269,14 +268,11 @@ color = "#ff0000" anchored = TRUE density = TRUE - unacidable = 1 + max_health = 200 var/obj/effect/rune/wall/rune - var/health - var/max_health = 200 /obj/effect/cultwall/Initialize(mapload, var/bcolor) . = ..() - health = max_health if(bcolor) color = bcolor diff --git a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm index 2c5f9a9ffa7..88708dee839 100644 --- a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm +++ b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm @@ -84,9 +84,9 @@ daddy = ndaddy set_dir(daddy.dir) appearance = daddy.appearance - events_repository.register(/decl/observ/moved, daddy, src, /obj/effect/bluegoast/proc/mirror) - events_repository.register(/decl/observ/dir_set, daddy, src, /obj/effect/bluegoast/proc/mirror_dir) - events_repository.register(/decl/observ/destroyed, daddy, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/moved, daddy, src, TYPE_PROC_REF(/obj/effect/bluegoast, mirror)) + events_repository.register(/decl/observ/dir_set, daddy, src, TYPE_PROC_REF(/obj/effect/bluegoast, mirror_dir)) + events_repository.register(/decl/observ/destroyed, daddy, src, TYPE_PROC_REF(/datum, qdel_self)) /obj/effect/bluegoast/Destroy() events_repository.unregister(/decl/observ/destroyed, daddy, src) @@ -133,11 +133,3 @@ H.flavor_text = daddy.flavor_text daddy.dust() qdel(src) - -/obj/screen/fullscreen/wormhole_overlay - icon = 'icons/effects/effects.dmi' - icon_state = "mfoam" - screen_loc = ui_entire_screen - color = "#ff9900" - alpha = 100 - blend_mode = BLEND_SUBTRACT diff --git a/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm b/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm index 95caa40a160..6da5185fc4c 100644 --- a/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm +++ b/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm @@ -1,19 +1,11 @@ /datum/universal_state/nuclear_explosion name = "Nuclear Demolition Warhead" var/atom/explosion_source - var/obj/screen/cinematic + var/obj/screen/cinematic/cinematic /datum/universal_state/nuclear_explosion/New(atom/nuke) explosion_source = nuke - - //create the cinematic screen obj cinematic = new - cinematic.icon = 'icons/effects/station_explosion.dmi' - cinematic.icon_state = "station_intact" - cinematic.plane = HUD_PLANE - cinematic.layer = HUD_ABOVE_ITEM_LAYER - cinematic.mouse_opacity = MOUSE_OPACITY_PRIORITY - cinematic.screen_loc = "LEFT+1,BOTTOM" /datum/universal_state/nuclear_explosion/OnEnter() set waitfor = FALSE diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm index 3bef609f014..9b8ef1cd7a8 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm @@ -6,7 +6,6 @@ icon = 'icons/obj/rift.dmi' icon_state = "rift" anchored = TRUE - unacidable = TRUE pixel_x = -236 pixel_y = -256 plane = ABOVE_LIGHTING_PLANE diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index a3c8c357bd2..40a9036b8df 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -62,8 +62,8 @@ var/global/universe_has_ended = 0 if(length(global.endgame_exits)) spawned_exit = new /obj/effect/wormhole_exit(pick(global.endgame_exits)) - addtimer(CALLBACK(src, /datum/universal_state/supermatter_cascade/proc/announce_end_of_universe, spawned_exit), rand(30, 60) SECONDS) - addtimer(CALLBACK(src, /datum/universal_state/supermatter_cascade/proc/finalize_end_of_universe), 5 MINUTES) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/universal_state/supermatter_cascade, announce_end_of_universe), spawned_exit), rand(30, 60) SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/universal_state/supermatter_cascade, finalize_end_of_universe)), 5 MINUTES) /datum/universal_state/supermatter_cascade/proc/announce_end_of_universe(var/exit_exists) var/end_message = "Attn. [global.using_map.station_name]: Severe gravitational anomalies of unheard of scope have been detected in the local volume. Size and intensity of anomalies are increasing exponentially. Within the hour, a newborn black hole will have consumed everything in this sector." diff --git a/code/game/gamemodes/events/black_hole.dm b/code/game/gamemodes/events/black_hole.dm index 893ce98ac22..9a4d26c3cba 100644 --- a/code/game/gamemodes/events/black_hole.dm +++ b/code/game/gamemodes/events/black_hole.dm @@ -6,7 +6,6 @@ desc = "FUCK FUCK FUCK AAAHHH!" icon_state = "bhole3" opacity = TRUE - unacidable = 1 density = FALSE anchored = TRUE diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index e5c20bd0f53..a7e6fb5abc5 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -1,7 +1,8 @@ -/datum/game_mode/extended +/decl/game_mode/extended name = "Extended" - config_tag = "extended" + uid = "extended" required_players = 0 round_description = "Just have fun and role-play!" extended_round_description = "There are no antagonists during extended, unless an admin decides to be cheeky. Just play your character, mess around with your job, and have fun." - addantag_allowed = ADDANTAG_ADMIN // No add antag vote allowed on extended, except when manually called by admins. \ No newline at end of file + addantag_allowed = ADDANTAG_ADMIN // No add antag vote allowed on extended, except when manually called by admins. + probability = 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7d2edc1aa73..bc0a312e169 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -1,11 +1,12 @@ var/global/antag_add_finished // Used in antag type voting. var/global/list/additional_antag_types = list() -/datum/game_mode +/decl/game_mode + abstract_type = /decl/game_mode + decl_flags = DECL_FLAG_MANDATORY_UID var/name = "invalid" var/round_description = "How did you even vote this in?" var/extended_round_description = "This roundtype should not be spawned, let alone votable. Someone contact a developer and tell them the game's broken again." - var/config_tag = null var/votable = TRUE var/probability = 0 @@ -44,19 +45,15 @@ var/global/list/additional_antag_types = list() null ) -/datum/game_mode/New() - ..() - // Enforce some formatting. - // This will probably break something. +/decl/game_mode/Initialize() name = capitalize(lowertext(name)) - config_tag = lowertext(config_tag) - if(round_autoantag && !length(latejoin_antags)) latejoin_antags = associated_antags.Copy() else if(!round_autoantag && length(latejoin_antags)) round_autoantag = TRUE + . = ..() -/datum/game_mode/Topic(href, href_list[]) +/decl/game_mode/Topic(href, href_list[]) if(..()) return if(href_list["toggle"]) @@ -132,7 +129,7 @@ var/global/list/additional_antag_types = list() if (usr.client && usr.client.holder) usr.client.holder.show_game_mode(usr) -/datum/game_mode/proc/announce() //to be called when round starts +/decl/game_mode/proc/announce() //to be called when round starts to_world("The current game mode is [capitalize(name)]!") if(round_description) to_world("[round_description]") if(round_autoantag) to_world("Antagonists will be added to the round automagically as needed.") @@ -156,7 +153,7 @@ var/global/list/additional_antag_types = list() // startRequirements() // Checks to see if the game can be setup and ran with the current number of players or whatnot. // Returns 0 if the mode can start and a message explaining the reason why it can't otherwise. -/datum/game_mode/proc/startRequirements() +/decl/game_mode/proc/startRequirements() var/playerC = 0 for(var/mob/new_player/player in global.player_list) if((player.client)&&(player.ready)) @@ -189,7 +186,7 @@ var/global/list/additional_antag_types = list() else return 0 -/datum/game_mode/proc/refresh_event_modifiers() +/decl/game_mode/proc/refresh_event_modifiers() if(event_delay_mod_moderate || event_delay_mod_major) SSevent.report_at_round_end = 1 if(event_delay_mod_moderate) @@ -199,7 +196,7 @@ var/global/list/additional_antag_types = list() var/datum/event_container/EMajor = SSevent.event_containers[EVENT_LEVEL_MAJOR] EMajor.delay_modifier = event_delay_mod_major -/datum/game_mode/proc/pre_setup() +/decl/game_mode/proc/pre_setup() for(var/decl/special_role/antag in antag_templates) antag.update_current_antag_max(src) antag.build_candidate_list(src) //compile a list of all eligible candidates @@ -214,8 +211,9 @@ var/global/list/additional_antag_types = list() sortTim(antag_templates_by_initial_spawn_req, /proc/cmp_numeric_asc, TRUE) antag_templates = list() - for(var/template in antag_templates_by_initial_spawn_req) - antag_templates += template + for(var/decl/special_role/antag in antag_templates_by_initial_spawn_req) + antag_templates |= antag + latejoin_antags |= antag.type var/list/valid_templates_per_candidate = list() // number of roles each candidate can satisfy for(var/candidate in all_candidates) @@ -240,7 +238,7 @@ var/global/list/additional_antag_types = list() antag.candidates = shuffle(antag.candidates) // makes selection past initial_spawn_req fairer ///post_setup() -/datum/game_mode/proc/post_setup() +/decl/game_mode/proc/post_setup() next_spawn = world.time + rand(min_autotraitor_delay, max_autotraitor_delay) @@ -265,8 +263,9 @@ var/global/list/additional_antag_types = list() antag.post_spawn() // Update goals, now that antag status and jobs are both resolved. - for(var/thing in SSticker.minds) - var/datum/mind/mind = thing + for(var/datum/mind/mind as anything in SSticker.minds) + if(!mind.current || !mind.assigned_job) + continue mind.generate_goals(mind.assigned_job, is_spawning=TRUE) mind.current.show_goals() @@ -279,11 +278,11 @@ var/global/list/additional_antag_types = list() SSstatistics.set_field_details("server_ip","[world.internet_address]:[world.port]") return 1 -/datum/game_mode/proc/fail_setup() +/decl/game_mode/proc/fail_setup() for(var/decl/special_role/antag in antag_templates) antag.reset_antag_selection() -/datum/game_mode/proc/announce_ert_disabled() +/decl/game_mode/proc/announce_ert_disabled() if(!ert_disabled) return @@ -321,7 +320,7 @@ var/global/list/additional_antag_types = list() ) command_announcement.Announce("The presence of [pick(reasons)] in the region is tying up all available local emergency resources; emergency response teams cannot be called at this time, and post-evacuation recovery efforts will be substantially delayed.","Emergency Transmission") -/datum/game_mode/proc/check_finished() +/decl/game_mode/proc/check_finished() if(SSevac.evacuation_controller?.round_over() || station_was_nuked) return 1 if(end_on_antag_death && antag_templates && antag_templates.len) @@ -336,10 +335,10 @@ var/global/list/additional_antag_types = list() return 1 return 0 -/datum/game_mode/proc/cleanup() //This is called when the round has ended but not the game, if any cleanup would be necessary in that case. +/decl/game_mode/proc/cleanup() //This is called when the round has ended but not the game, if any cleanup would be necessary in that case. return -/datum/game_mode/proc/declare_completion() +/decl/game_mode/proc/declare_completion() set waitfor = FALSE sleep(2) @@ -415,10 +414,10 @@ var/global/list/additional_antag_types = list() return 0 -/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. +/decl/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 -/datum/game_mode/proc/get_players_for_role(var/antag_type) +/decl/game_mode/proc/get_players_for_role(var/antag_type) var/list/players = list() var/list/candidates = list() @@ -463,18 +462,18 @@ var/global/list/additional_antag_types = list() // required_enemies if the number of people with that role set to yes is less than recomended_enemies, // Less if there are not enough valid players in the game entirely to make required_enemies. -/datum/game_mode/proc/num_players() +/decl/game_mode/proc/num_players() . = 0 for(var/mob/new_player/P in global.player_list) if(P.client && P.ready) . ++ -/datum/game_mode/proc/round_status_topic(href, href_list[]) +/decl/game_mode/proc/round_status_topic(href, href_list[]) return 0 -/datum/game_mode/proc/create_antagonists() +/decl/game_mode/proc/create_antagonists() - if(!config.traitor_scaling) + if(!get_config_value(/decl/config/toggle/traitor_scaling)) antag_scaling_coeff = 0 if(length(associated_antags)) @@ -494,7 +493,7 @@ var/global/list/additional_antag_types = list() shuffle(antag_templates) //In the case of multiple antag types // Manipulates the end-game cinematic in conjunction with global.cinematic -/datum/game_mode/proc/nuke_act(obj/screen/cinematic_screen, station_missed = 0) +/decl/game_mode/proc/nuke_act(obj/screen/cinematic_screen, station_missed = 0) if(!cinematic_icon_states) return if(station_missed < 2) @@ -573,7 +572,7 @@ var/global/list/additional_antag_types = list() if(!player || !player.current) return - if(config.objectives_disabled == CONFIG_OBJECTIVE_NONE || !player.objectives.len) + if(get_config_value(/decl/config/enum/objectives_disabled) == CONFIG_OBJECTIVE_NONE || !player.objectives.len) return var/obj_count = 1 diff --git a/code/game/gamemodes/game_mode_latespawn.dm b/code/game/gamemodes/game_mode_latespawn.dm index 2ebc4eb8820..8fd44e1744d 100644 --- a/code/game/gamemodes/game_mode_latespawn.dm +++ b/code/game/gamemodes/game_mode_latespawn.dm @@ -1,35 +1,36 @@ -/datum/game_mode/var/next_spawn = 0 -/datum/game_mode/var/min_autotraitor_delay = 4200 // Approx 7 minutes. -/datum/game_mode/var/max_autotraitor_delay = 12000 // Approx 20 minutes. +/decl/game_mode + var/next_spawn = 0 + var/min_autotraitor_delay = 7 MINUTES + var/max_autotraitor_delay = 20 MINUTES ///process() ///Called by the gameticker -/datum/game_mode/proc/process() +/decl/game_mode/proc/process() if(shall_process_autoantag()) process_autoantag() -/datum/game_mode/proc/shall_process_autoantag() +/decl/game_mode/proc/shall_process_autoantag() if(!round_autoantag || world.time < next_spawn) return FALSE if(SSevac.evacuation_controller && (SSevac.evacuation_controller.is_evacuating() || SSevac.evacuation_controller.has_evacuated())) return FALSE // Don't create auto-antags in the last twenty minutes of the round, but only if the vote interval is longer than 20 minutes - if((config.vote_autotransfer_interval > 20 MINUTES) && (transfer_controller.time_till_transfer_vote() < 20 MINUTES)) + if((get_config_value(/decl/config/num/vote_autotransfer_interval) > 20 MINUTES) && (transfer_controller.time_till_transfer_vote() < 20 MINUTES)) return FALSE return TRUE //This can be overriden in case a game mode needs to do stuff when a player latejoins -/datum/game_mode/proc/handle_latejoin(var/mob/living/carbon/human/character) +/decl/game_mode/proc/handle_latejoin(var/mob/living/carbon/human/character) if(character.mind) character.mind.generate_goals(character.mind.assigned_job, is_spawning=TRUE) character.show_goals() return 0 -/datum/game_mode/proc/handle_offsite_latejoin(var/mob/living/carbon/human/character) +/decl/game_mode/proc/handle_offsite_latejoin(var/mob/living/carbon/human/character) return 0 -/datum/game_mode/proc/process_autoantag() +/decl/game_mode/proc/process_autoantag() message_admins("[uppertext(name)]: Attempting autospawn.") var/list/usable_templates = list() diff --git a/code/game/gamemodes/godmode/form_items/narsie_items.dm b/code/game/gamemodes/godmode/form_items/narsie_items.dm index ff6855bcf6d..9ee399a014f 100644 --- a/code/game/gamemodes/godmode/form_items/narsie_items.dm +++ b/code/game/gamemodes/godmode/form_items/narsie_items.dm @@ -56,7 +56,7 @@ if(ismob(a)) var/mob/M = a if(M.stat != DEAD) - events_repository.register(/decl/observ/death, M,src,/obj/item/twohanded/fireaxe/cult/proc/gain_power) + events_repository.register(/decl/observ/death, M,src, TYPE_PROC_REF(/obj/item/twohanded/fireaxe/cult, gain_power)) spawn(30) events_repository.unregister(/decl/observ/death, M,src) return ..() diff --git a/code/game/gamemodes/godmode/form_items/starlight_structures.dm b/code/game/gamemodes/godmode/form_items/starlight_structures.dm index d98eb249478..51f3c734282 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_structures.dm +++ b/code/game/gamemodes/godmode/form_items/starlight_structures.dm @@ -143,7 +143,7 @@ for(var/l in get_turf(linked_god)) if(istype(l, /mob/living/starlight_soul)) to_chat(l, "\The [src] is looking for a soul to become a [looking_for]. Accept? (Yes)") - addtimer(CALLBACK(src, .proc/stop_looking_for, FALSE), 30 SECONDS) + addtimer(CALLBACK(src, PROC_REF(stop_looking_for), FALSE), 30 SECONDS) show_browser(linked_god, null, "window=gateway") return TOPIC_HANDLED @@ -215,8 +215,9 @@ . = 0 if(istype(I, /obj/item/gun/energy)) var/obj/item/gun/energy/energy = I - if(energy.power_supply) - energy.power_supply.give(energy.charge_cost * energy.max_shots) + var/obj/item/cell/power_supply = energy.get_cell() + if(power_supply) + power_supply.give(energy.charge_cost * energy.max_shots) . = 1 else if(istype(I ,/obj/item/knife/ritual/shadow)) var/obj/item/knife/ritual/shadow/shad = I diff --git a/code/game/gamemodes/godmode/god_altar.dm b/code/game/gamemodes/godmode/god_altar.dm index 07a960da570..34ddbfa847d 100644 --- a/code/game/gamemodes/godmode/god_altar.dm +++ b/code/game/gamemodes/godmode/god_altar.dm @@ -67,9 +67,9 @@ START_PROCESSING(SSobj, src) target = L update_icon() - events_repository.register(/decl/observ/destroyed, L,src,/obj/structure/deity/altar/proc/remove_target) - events_repository.register(/decl/observ/moved, L, src, /obj/structure/deity/altar/proc/remove_target) - events_repository.register(/decl/observ/death, L, src, /obj/structure/deity/altar/proc/remove_target) + events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) + events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) + events_repository.register(/decl/observ/death, L, src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) /obj/structure/deity/altar/proc/remove_target() STOP_PROCESSING(SSobj, src) @@ -91,7 +91,7 @@ cycles_before_converted++ if(prob(50)) to_chat(M, "The mental strain is too much for you! You feel your body weakening!") - M.adjustToxLoss(15) + M.adjustToxLoss(15, do_update_health = FALSE) M.adjustHalLoss(30) return TOPIC_REFRESH diff --git a/code/game/gamemodes/godmode/god_pylon.dm b/code/game/gamemodes/godmode/god_pylon.dm index 14b50ce830d..cbbd31413fa 100644 --- a/code/game/gamemodes/godmode/god_pylon.dm +++ b/code/game/gamemodes/godmode/god_pylon.dm @@ -33,7 +33,7 @@ return to_chat(L, "You place your hands on \the [src], feeling yourself intune to its vibrations.") intuned += L - events_repository.register(/decl/observ/destroyed, L,src,/obj/structure/deity/pylon/proc/remove_intuned) + events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/pylon, remove_intuned)) /obj/structure/deity/pylon/proc/remove_intuned(var/mob/living/L) if(!(L in intuned)) diff --git a/code/game/gamemodes/godmode/god_structures.dm b/code/game/gamemodes/godmode/god_structures.dm index f40e5bb4597..6eaed5e088e 100644 --- a/code/game/gamemodes/godmode/god_structures.dm +++ b/code/game/gamemodes/godmode/god_structures.dm @@ -17,7 +17,7 @@ /obj/structure/deity icon = 'icons/obj/cult.dmi' - maxhealth = 10 + max_health = 10 density = TRUE anchored = TRUE icon_state = "tomealtar" diff --git a/code/game/gamemodes/godmode/god_trap.dm b/code/game/gamemodes/godmode/god_trap.dm index 323b3bf2e15..bcab3d15328 100644 --- a/code/game/gamemodes/godmode/god_trap.dm +++ b/code/game/gamemodes/godmode/god_trap.dm @@ -5,7 +5,7 @@ /obj/structure/deity/trap/Initialize() . = ..() - events_repository.register(/decl/observ/entered, get_turf(src),src,/obj/structure/deity/trap/proc/trigger) + events_repository.register(/decl/observ/entered, get_turf(src),src, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) /obj/structure/deity/trap/Destroy() events_repository.unregister(/decl/observ/entered, get_turf(src),src) @@ -14,7 +14,7 @@ /obj/structure/deity/trap/Move() events_repository.unregister(/decl/observ/entered, get_turf(src),src) . = ..() - events_repository.register(/decl/observ/entered, get_turf(src), src, /obj/structure/deity/trap/proc/trigger) + events_repository.register(/decl/observ/entered, get_turf(src), src, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) /obj/structure/deity/trap/attackby(obj/item/W, mob/user) trigger(user) diff --git a/code/game/gamemodes/godmode/godmode.dm b/code/game/gamemodes/godmode/godmode.dm index a450a7cd2b6..9bf79d8ca87 100644 --- a/code/game/gamemodes/godmode/godmode.dm +++ b/code/game/gamemodes/godmode/godmode.dm @@ -1,12 +1,12 @@ -/datum/game_mode/godmode +/decl/game_mode/godmode name = "Deity" round_description = "An otherworldly beast has turned its attention to you and your fellow cremembers." extended_round_description = "The station has been infiltrated by a fanatical group of death-cultists! They will use powers from beyond your comprehension to subvert you to their cause and ultimately please their gods through sacrificial summons and physical immolation! Try to survive!" - config_tag = "god" + uid = "god" required_players = 10 required_enemies = 3 end_on_antag_death = FALSE associated_antags = list( - /decl/special_role/deity, + /decl/special_role/deity, /decl/special_role/godcultist ) \ No newline at end of file diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index d6c393b0c72..c2bedd494d5 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -2,9 +2,9 @@ HEIST ROUNDTYPE */ -/datum/game_mode/heist +/decl/game_mode/heist name = "Heist" - config_tag = "heist" + uid = "heist" required_players = 12 required_enemies = 3 round_description = "An unidentified drive signature has slipped into close sensor range and is approaching!" diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 00d60dbf8cd..828322db8c9 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -2,11 +2,11 @@ #define METEOR_FAILSAFE_THRESHOLD 45 MINUTES // Failsafe that guarantees Severity will be at least 15 when the round hits this time. // In general, a PVE oriented game mode. A middle ground between Extended and actual antagonist based rounds. -/datum/game_mode/meteor +/decl/game_mode/meteor name = "Meteor" round_description = "You are about to enter an asteroid belt!" extended_round_description = "We are on an unavoidable collision course with an asteroid field. You have only a moment to prepare before you are barraged by dust and meteors. As if it was not enough, all kinds of negative events seem to happen more frequently. Good luck." - config_tag = "meteor" + uid = "meteor" required_players = 15 // Definitely not good for low-pop votable = 1 shuttle_delay = 2 @@ -29,33 +29,33 @@ event_delay_mod_major = 0.3 /decl/vv_set_handler/meteor_severity_handler - handled_type = /datum/game_mode/meteor + handled_type = /decl/game_mode/meteor handled_vars = list( - "meteor_severity" = /datum/game_mode/meteor/proc/set_meteor_severity, - "meteor_wave_delay" = /datum/game_mode/meteor/proc/set_meteor_wave_delay + "meteor_severity" = /decl/game_mode/meteor/proc/set_meteor_severity, + "meteor_wave_delay" = /decl/game_mode/meteor/proc/set_meteor_wave_delay ) -/datum/game_mode/meteor/proc/set_meteor_severity(value) +/decl/game_mode/meteor/proc/set_meteor_severity(value) meteor_severity = clamp(value, 0, maximal_severity) -/datum/game_mode/meteor/proc/set_meteor_wave_delay(value) +/decl/game_mode/meteor/proc/set_meteor_wave_delay(value) meteor_wave_delay = max(10 SECONDS, value) -/datum/game_mode/meteor/VV_static() +/decl/game_mode/meteor/VV_static() return ..() + "maximal_severity" -/datum/game_mode/meteor/post_setup() +/decl/game_mode/meteor/post_setup() ..() alert_title = "Automated Beacon AB-[rand(10, 99)]" alert_text = "This is an automatic warning. Your facility: [global.using_map.full_name] is on a collision course with a nearby asteroid belt. Estimated time until impact is: [meteor_grace_period / 1200] MINUTES. Please perform necessary actions to secure your ship or station from the threat. Have a nice day." start_text = "This is an automatic warning. Your facility: [global.using_map.full_name] has entered an asteroid belt. Estimated time until you leave the belt is: [rand(20,30)] HOURS and [rand(1, 59)] MINUTES. For your safety, please consider changing course or using protective equipment. Have a nice day." next_wave = round_duration_in_ticks + meteor_grace_period -/datum/game_mode/meteor/proc/on_meteor_warn() +/decl/game_mode/meteor/proc/on_meteor_warn() alert_sent = 1 command_announcement.Announce(alert_text, alert_title) -/datum/game_mode/meteor/proc/on_enter_field() +/decl/game_mode/meteor/proc/on_enter_field() alert_sent = 2 command_announcement.Announce(start_text, alert_title) for(var/obj/machinery/shield_diffuser/SD in SSmachines.machinery) @@ -70,7 +70,7 @@ T.add_overlay(image('icons/obj/overmap.dmi', "meteor[rand(1,4)]")) next_wave = round_duration_in_ticks + meteor_wave_delay -/datum/game_mode/meteor/process() +/decl/game_mode/meteor/process() // Send an alert halfway through the round. if((round_duration_in_ticks >= (next_wave / 2)) && !alert_sent) on_meteor_warn() @@ -94,7 +94,7 @@ if(send_admin_broadcasts) log_and_message_admins("Meteor: Wave fired. Escalation: [escalated ? "Yes" : "No"]. Severity: [meteor_severity]/[maximal_severity]") -/datum/game_mode/meteor/proc/get_meteor_types() +/decl/game_mode/meteor/proc/get_meteor_types() switch(meteor_severity) if(1 to 9) return meteors_dust diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 3289a214b08..d774f6c9562 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -215,7 +215,7 @@ var/global/list/meteors_cataclysm = list(\ /obj/effect/meteor/proc/make_debris() if(meteordrop && dropamt) for(var/throws = dropamt, throws > 0, throws--) - addtimer(CALLBACK(new meteordrop(get_turf(src)), /atom/movable/proc/throw_at, dest, 5, 10), 0) + addtimer(CALLBACK(new meteordrop(get_turf(src)), TYPE_PROC_REF(/atom/movable, throw_at), dest, 5, 10), 0) /obj/effect/meteor/proc/meteor_effect() if(heavy) @@ -239,7 +239,7 @@ var/global/list/meteors_cataclysm = list(\ hits = 1 hitpwr = 3 dropamt = 1 - meteordrop = /obj/item/stack/material/ore/glass + meteordrop = /obj/item/stack/material/ore/sand //Medium-sized /obj/effect/meteor/medium diff --git a/code/game/gamemodes/mixed/crossfire.dm b/code/game/gamemodes/mixed/crossfire.dm index 041f78e5ea3..f031d36a780 100644 --- a/code/game/gamemodes/mixed/crossfire.dm +++ b/code/game/gamemodes/mixed/crossfire.dm @@ -1,8 +1,8 @@ -/datum/game_mode/crossfire +/decl/game_mode/crossfire name = "Mercenary & Heist" round_description = "Mercenaries and raiders are preparing for a nice visit..." extended_round_description = "Nothing can possibly go wrong with lots of people and lots of guns, right?" - config_tag = "crossfire" + uid = "crossfire" required_players = 25 required_enemies = 6 end_on_antag_death = FALSE diff --git a/code/game/gamemodes/mixed/siege.dm b/code/game/gamemodes/mixed/siege.dm index 6fa8fb621b8..1e84f5dbcc5 100644 --- a/code/game/gamemodes/mixed/siege.dm +++ b/code/game/gamemodes/mixed/siege.dm @@ -1,6 +1,6 @@ -/datum/game_mode/siege +/decl/game_mode/siege name = "Mercenary & Revolution" - config_tag = "siege" + uid = "siege" round_description = "Getting stuck between a rock and a hard place, maybe the nice visitors can help with your internal security problem?" extended_round_description = "GENERAL QUARTERS! OH GOD WE GAVE THE REVOLUTIONARIES GUNS!" required_players = 20 diff --git a/code/game/gamemodes/mixed/spyvspy.dm b/code/game/gamemodes/mixed/spyvspy.dm index 06e6ddd6dcc..f0f9d638cf1 100644 --- a/code/game/gamemodes/mixed/spyvspy.dm +++ b/code/game/gamemodes/mixed/spyvspy.dm @@ -1,8 +1,8 @@ -/datum/game_mode/spyvspy +/decl/game_mode/spyvspy name = "Spy v. Spy" round_description = "There are traitorous forces at play, but some crew have resolved to stop them by any means necessary!" extended_round_description = "Traitors and renegades both spawn during this mode." - config_tag = "spyvspy" + uid = "spyvspy" required_players = 4 required_enemies = 4 end_on_antag_death = FALSE diff --git a/code/game/gamemodes/mixed/uprising.dm b/code/game/gamemodes/mixed/uprising.dm index 6109afbb42f..3200ee883e9 100644 --- a/code/game/gamemodes/mixed/uprising.dm +++ b/code/game/gamemodes/mixed/uprising.dm @@ -1,8 +1,8 @@ -/datum/game_mode/uprising +/decl/game_mode/uprising name = "Cult & Revolution" round_description = "Some crewmembers are attempting to start a revolution while a cult plots in the shadows!" extended_round_description = "Cultists and revolutionaries spawn in this round." - config_tag = "uprising" + uid = "uprising" required_players = 20 required_enemies = 6 end_on_antag_death = FALSE diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index 0358b59aea9..1e281e66f5e 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -1,8 +1,8 @@ -/datum/game_mode/ninja +/decl/game_mode/ninja name = "Ninja" round_description = "An agent of the Spider Clan is on board!" extended_round_description = "A heavily armed, high-tech covert infiltrator is on board pursuing their mysterious goals." - config_tag = "ninja" + uid = "ninja" required_players = 5 required_enemies = 1 end_on_antag_death = FALSE diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 652840ba536..410e50873a8 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -4,33 +4,34 @@ var/global/list/nuke_disks = list() -/datum/game_mode/nuclear +/decl/game_mode/nuclear name = "Mercenary" round_description = "A mercenary strike force is approaching!" extended_round_description = "A heavily armed merc team is approaching in their warship; whatever their goal is, it can't be good for the crew." - config_tag = "mercenary" + uid = "mercenary" required_players = 15 required_enemies = 1 end_on_antag_death = FALSE - var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station - var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level + probability = 1 associated_antags = list(/decl/special_role/mercenary) cinematic_icon_states = list( "intro_nuke" = 35, "summary_nukewin", "summary_nukefail" ) + var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station + var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level //checks if L has a nuke disk on their person -/datum/game_mode/nuclear/proc/check_mob(mob/living/L) +/decl/game_mode/nuclear/proc/check_mob(mob/living/L) for(var/obj/item/disk/nuclear/N in nuke_disks) if(N.storage_depth(L) >= 0) return TRUE return FALSE -/datum/game_mode/nuclear/declare_completion() +/decl/game_mode/nuclear/declare_completion() var/decl/special_role/merc = GET_DECL(/decl/special_role/mercenary) - if(config.objectives_disabled == CONFIG_OBJECTIVE_NONE || (merc && !merc.global_objectives.len)) + if(get_config_value(/decl/config/enum/objectives_disabled) == CONFIG_OBJECTIVE_NONE || (merc && !merc.global_objectives.len)) ..() return var/disk_rescued = TRUE diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index bdf00ce7247..cbd16ae38a8 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -1,6 +1,6 @@ -/datum/game_mode/revolution +/decl/game_mode/revolution name = "Revolution" - config_tag = "revolution" + uid = "revolution" round_description = "Some crewmembers are attempting to start a revolution!" extended_round_description = "Revolutionaries - Remove the heads of staff from power. Convert other crewmembers to your cause using the 'Convert Bourgeoise' verb. Protect your leaders." required_players = 4 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 9203ffcf94b..b87bc25b101 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -1,8 +1,8 @@ -/datum/game_mode/traitor +/decl/game_mode/traitor name = "traitor" round_description = "There is a foreign agent or traitor onboard. Do not let the traitor succeed!" extended_round_description = "Some members of the crew have been suborned, and are acting to meet a secret and traitorous goals of their own." - config_tag = "traitor" + uid = "traitor" required_players = 0 required_enemies = 1 associated_antags = list(/decl/special_role/traitor) diff --git a/code/game/gamemodes/wizard/servant_items/champion.dm b/code/game/gamemodes/wizard/servant_items/champion.dm index 53cb1b5cf8c..ace80ee8685 100644 --- a/code/game/gamemodes/wizard/servant_items/champion.dm +++ b/code/game/gamemodes/wizard/servant_items/champion.dm @@ -42,7 +42,7 @@ /obj/item/clothing/shoes/jackboots/medievalboots name = "leather boots" desc = "Old-fashioned leather boots. Probably not something you want to get kicked with." - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather force = 5 armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b2fbdc10822..72792403db1 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -1,9 +1,10 @@ -/datum/game_mode/wizard +/decl/game_mode/wizard name = "Wizard" round_description = "There is a SPACE WIZARD onboard. You can't let the magician achieve their objectives!" extended_round_description = "A powerful space wizard has made their way on board. They have a wide variety of powers and spells available to them that makes your own simple moral self tremble with fear and excitement. Ultimately, their purpose is unknown. However, it is up to you and your crew to decide if their powers can be used for good or if their arrival foreshadows devastation." - config_tag = "wizard" + uid = "wizard" required_players = 5 required_enemies = 1 end_on_antag_death = FALSE associated_antags = list(/decl/special_role/wizard) + probability = 1 diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index e590c025697..014baac33a1 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -17,14 +17,43 @@ if(id) . = id.GetAccess() -/atom/movable/proc/GetIdCard() - var/list/cards = GetIdCards() - return LAZYACCESS(cards, LAZYLEN(cards)) - -/atom/movable/proc/GetIdCards() +/atom/movable/proc/GetIdCard(list/exceptions, prefer_held = TRUE) + RETURN_TYPE(/obj/item/card/id) + . = GetIdCards(exceptions) + return LAZYACCESS(., LAZYLEN(.)) + +// Duplicated logic, because it's short enough to not bother splitting out. +// Quite gross logic sorry, did not want to work out a proper sorting method :( +// The logic behind this sorting is that we should prefer ID cards as such: +// - held cards, because they are very easily shifted dropped etc +// - equipped cards, because they can also be removed, albeit slower +// - any remaining cards, because at time of writing they are implanted and +// can't be removed easily at all. +/mob/GetIdCard(list/exceptions, prefer_held = TRUE) + RETURN_TYPE(/obj/item/card/id) + // Get candidate cards, return similar to parent if we don't care + . = GetIdCards(exceptions) + var/card_count = length(.) + if(card_count <= 0) + return null + if(!prefer_held || card_count == 1) + return .[card_count] + // Move ID to the end of the list. + var/obj/item/id = get_equipped_item(slot_wear_id_str) + if(id) + . -= id + . += id + // Move held items to the end of the list (prefer them over equipped ID) + for(var/obj/item/card in get_held_items()) + if(card in .) + . -= card + . += card + return .[length(.)] + +/atom/movable/proc/GetIdCards(list/exceptions) var/datum/extension/access_provider/our_provider = get_extension(src, /datum/extension/access_provider) if(our_provider) - LAZYDISTINCTADD(., our_provider.GetIdCards()) + LAZYDISTINCTADD(., our_provider.GetIdCards(exceptions)) /atom/movable/proc/check_access(atom/movable/A) return check_access_list(A ? A.GetAccess() : list()) @@ -210,12 +239,6 @@ var/global/list/priv_region_access "Emergency Response Team", "Emergency Response Team Leader") -/proc/FindNameFromID(var/mob/M, var/missing_id_name = "Unknown") - var/obj/item/card/id/C = M.GetIdCard() - if(C) - return C.registered_name - return missing_id_name - /proc/get_all_job_icons() //For all existing HUD icons return SSjobs.titles_to_datums + list("Prisoner") @@ -226,13 +249,13 @@ var/global/list/priv_region_access var/job_icons = get_all_job_icons() if(I.assignment in job_icons) //Check if the job has a hud icon return I.assignment - if(I.rank in job_icons) - return I.rank + if(I.position in job_icons) + return I.position var/centcom = get_all_centcom_jobs() if(I.assignment in centcom) return "Centcom" - if(I.rank in centcom) + if(I.position in centcom) return "Centcom" else return diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index a93cbe19985..d38135ba534 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -36,7 +36,7 @@ var/forced_spawnpoint // If set to a spawnpoint name, will use that spawn point for joining as this job. var/hud_icon // icon used for Sec HUD overlay - //Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access + //Job access. The use of minimal_access or access is determined by a config setting: jobs_have_minimal_access var/list/minimal_access = list() // Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population) var/list/access = list() // Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!) @@ -85,7 +85,7 @@ /datum/job/dd_SortValue() return title -/datum/job/proc/equip(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/proc/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) if (required_language) H.add_language(required_language) H.set_default_language(required_language) @@ -93,7 +93,7 @@ H.set_default_language(/decl/language/human/common) var/decl/hierarchy/outfit/outfit = get_outfit(H, alt_title, branch, grade) if(outfit) - return outfit.equip(H, title, alt_title) + return outfit.equip_outfit(H, alt_title || title, job = src, rank = grade) /datum/job/proc/get_outfit(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) if(alt_title && alt_titles) @@ -163,10 +163,10 @@ var/decl/hierarchy/outfit/outfit = get_outfit(H, alt_title, branch, grade) if(!outfit) return FALSE - . = outfit.equip(H, title, alt_title, OUTFIT_ADJUSTMENT_SKIP_POST_EQUIP|OUTFIT_ADJUSTMENT_SKIP_ID_PDA|additional_skips) + . = outfit.equip_outfit(H, alt_title || title, equip_adjustments = (OUTFIT_ADJUSTMENT_SKIP_POST_EQUIP|OUTFIT_ADJUSTMENT_SKIP_ID_PDA|additional_skips), job = src, rank = grade) /datum/job/proc/get_access() - if(minimal_access.len && (!config || config.jobs_have_minimal_access)) + if(minimal_access.len && get_config_value(/decl/config/toggle/on/jobs_have_minimal_access)) return minimal_access?.Copy() return access?.Copy() @@ -175,7 +175,7 @@ return (available_in_days(C) == 0) //Available in 0 days = available right now = player is old enough to play. /datum/job/proc/available_in_days(client/C) - if(C && config.use_age_restriction_for_jobs && isnull(C.holder) && isnum(C.player_age) && isnum(minimal_player_age)) + if(C && get_config_value(/decl/config/num/use_age_restriction_for_jobs) && isnull(C.holder) && isnum(C.player_age) && isnum(minimal_player_age)) return max(0, minimal_player_age - C.player_age) return 0 @@ -439,13 +439,13 @@ spawnpos = null if(!spawnpos) // Step through all spawnpoints and pick first appropriate for job - for(var/decl/spawnpoint/candidate as anything in global.using_map.allowed_spawns) + for(var/decl/spawnpoint/candidate as anything in global.using_map.allowed_latejoin_spawns) if(candidate?.check_job_spawning(src)) spawnpos = candidate break return spawnpos -/datum/job/proc/post_equip_rank(var/mob/person, var/alt_title) +/datum/job/proc/post_equip_job_title(var/mob/person, var/alt_title, var/rank) if(is_semi_antagonist && person.mind) var/decl/special_role/provocateur/provocateurs = GET_DECL(/decl/special_role/provocateur) provocateurs.add_antagonist(person.mind) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 771dc6e7423..e8e49a0f68a 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -3,7 +3,7 @@ var/global/list/whitelist = list() /hook/startup/proc/loadWhitelist() - if(config.usewhitelist) + if(get_config_value(/decl/config/toggle/usewhitelist)) load_whitelist() return 1 @@ -20,8 +20,8 @@ var/global/list/whitelist = list() var/global/list/alien_whitelist = list() /hook/startup/proc/loadAlienWhitelist() - if(config.usealienwhitelist) - if(config.usealienwhitelistSQL) + if(get_config_value(/decl/config/toggle/use_alien_whitelist)) + if(get_config_value(/decl/config/toggle/use_alien_whitelist_sql)) if(!load_alienwhitelistSQL()) to_world_log("Could not load alienwhitelist via SQL") else @@ -74,7 +74,7 @@ var/global/list/alien_whitelist = list() var/decl/language/L = species if(L.flags & LANG_FLAG_RESTRICTED) return FALSE - if(!config.usealienwhitelist || !(L.flags & LANG_FLAG_WHITELISTED)) + if(!get_config_value(/decl/config/toggle/use_alien_whitelist) || !(L.flags & LANG_FLAG_WHITELISTED)) return TRUE return whitelist_lookup(L.name, M.ckey) @@ -82,7 +82,7 @@ var/global/list/alien_whitelist = list() var/decl/species/S = species if(S.spawn_flags & SPECIES_IS_RESTRICTED) return FALSE - if(!config.usealienwhitelist || !(S.spawn_flags & SPECIES_IS_WHITELISTED)) + if(!get_config_value(/decl/config/toggle/use_alien_whitelist) || !(S.spawn_flags & SPECIES_IS_WHITELISTED)) return TRUE return whitelist_lookup(S.get_root_species_name(M), M.ckey) @@ -92,7 +92,7 @@ var/global/list/alien_whitelist = list() if(!alien_whitelist) return FALSE - if(config.usealienwhitelistSQL) + if(get_config_value(/decl/config/toggle/use_alien_whitelist_sql)) //SQL Whitelist if(!(ckey in alien_whitelist)) return FALSE diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 8a84ad48c1c..38c32161aeb 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -3,7 +3,7 @@ icon_state = "floor_beaconf" name = "tracking beacon" desc = "A device that uses zero-point energy to create a permanent tracking beacon." - level = 1 // underfloor + level = LEVEL_BELOW_PLATING anchored = TRUE idle_power_usage = 0 var/obj/item/radio/beacon/beacon @@ -12,7 +12,7 @@ . = ..() var/turf/T = get_turf(src) beacon = new /obj/item/radio/beacon(T) - beacon.invisibility = INVISIBILITY_MAXIMUM + beacon.set_invisibility(INVISIBILITY_MAXIMUM) hide(!T.is_plating()) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index f06b1cd5057..de556eb9486 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -67,7 +67,7 @@ /obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) . = (air_group || height == 0 || (istype(mover) && mover.checkpass(PASS_FLAG_TABLE))) -/obj/machinery/optable/receive_mouse_drop(atom/dropping, mob/user) +/obj/machinery/optable/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!.) if(istype(dropping, /obj/item) && user.get_active_hand() == dropping && user.try_unequip(dropping, loc)) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index d884023a2a0..34a6e1b6b9b 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -60,7 +60,7 @@ var/decl/material/reagent = GET_DECL(rid) for(var/banned_type in banned_chem_types) if(istype(reagent, banned_type)) - to_chat(user, SPAN_WARNING("Automatic safety checking indicates the present of a prohibited substance in this canister.")) + to_chat(user, SPAN_WARNING("Automatic safety checking indicates the presence of a prohibited substance in this canister.")) return FALSE var/mob/M = canister.loc if(istype(M) && !M.try_unequip(canister, src)) @@ -79,6 +79,16 @@ to_chat(user, SPAN_NOTICE("You remove \the [canister] from \the [src].")) return TRUE +/obj/machinery/sleeper/proc/eject_all_reagent_canisters() + for(var/obj/item/canister in loaded_canisters) + canister.dropInto(loc) + LAZYCLEARLIST(loaded_canisters) + +/obj/machinery/sleeper/dismantle() + eject_all_reagent_canisters() + remove_beaker() + return ..() + /obj/machinery/sleeper/get_contained_external_atoms() . = ..() LAZYREMOVE(., loaded_canisters) @@ -306,7 +316,7 @@ return TRUE return ..() -/obj/machinery/sleeper/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/machinery/sleeper/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && ismob(dropping)) var/mob/target = dropping diff --git a/code/game/machinery/_machines_base/machine_construction/pipe.dm b/code/game/machinery/_machines_base/machine_construction/pipe.dm index 5ea202b73ea..4667327dd0e 100644 --- a/code/game/machinery/_machines_base/machine_construction/pipe.dm +++ b/code/game/machinery/_machines_base/machine_construction/pipe.dm @@ -44,7 +44,7 @@ return TRUE playsound(get_turf(machine), 'sound/items/Welder2.ogg', 50, 1) TRANSFER_STATE(/decl/machine_construction/default/deconstructed) - machine.visible_message(SPAN_NOTICE("\The [user] unwelds \the [src].")) + machine.visible_message(SPAN_NOTICE("\The [user] unwelds \the [machine].")) machine.dismantle() /decl/machine_construction/pipe/welder/mechanics_info() diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 69265de769c..70f7aeca353 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -460,15 +460,6 @@ Class Procs: if(battery && (!functional_only || battery.is_functional())) return battery.get_cell() -/obj/machinery/building_cost() - . = ..() - var/list/component_types = types_of_component(/obj/item/stock_parts) - for(var/path in component_types) - var/obj/item/stock_parts/part = get_component_of_type(path) - var/list/part_costs = part.building_cost() - for(var/key in part_costs) - .[key] += part_costs[key] * component_types[path] - /obj/machinery/emag_act(remaining_charges, mob/user, emag_source) . = ..() for(var/obj/item/stock_parts/access_lock/lock in get_all_components_of_type(/obj/item/stock_parts/access_lock)) @@ -489,8 +480,12 @@ Class Procs: // This only includes external atoms by default, so we need to add components back. /obj/machinery/get_contained_matter() . = ..() - for(var/obj/component in component_parts) - . = MERGE_ASSOCS_WITH_NUM_VALUES(., component.get_contained_matter()) + var/list/component_types = types_of_component(/obj/item/stock_parts) + for(var/path in component_types) + for(var/obj/item/stock_parts/part in get_all_components_of_type(path)) + var/list/part_costs = part.get_contained_matter() + for(var/key in part_costs) + .[key] += part_costs[key] * component_types[path] /obj/machinery/proc/get_auto_access() var/area/A = get_area(src) @@ -506,4 +501,7 @@ Class Procs: // Make sure that mapped subtypes get the right codex entry. /obj/machinery/get_codex_value() - return base_type || ..() \ No newline at end of file + return base_type || ..() + +/obj/machinery/solvent_can_melt(var/solvent_power = MAT_SOLVENT_STRONG) + return FALSE diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index 7d7dd280131..6ac1793eba4 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -152,7 +152,7 @@ var/global/list/machine_path_to_circuit_type CRASH("Tried to insert \a '[part]' twice in \the [src] ([x], [y], [z])!") LAZYADD(component_parts, part) part.on_install(src) - events_repository.register(/decl/observ/destroyed, part, src, .proc/component_destroyed) + events_repository.register(/decl/observ/destroyed, part, src, PROC_REF(component_destroyed)) else if(ispath(part)) LAZYINITLIST(uncreated_component_parts) uncreated_component_parts[part] += 1 diff --git a/code/game/machinery/_machines_base/machinery_damage.dm b/code/game/machinery/_machines_base/machinery_damage.dm index 00cee0e0f6b..8c7953186f9 100644 --- a/code/game/machinery/_machines_base/machinery_damage.dm +++ b/code/game/machinery/_machines_base/machinery_damage.dm @@ -33,7 +33,7 @@ if(victim?.can_take_damage() && victim.is_functional()) amount -= victim.take_damage(amount, damtype) - if(amount) + if(amount && (damtype == BRUTE || damtype == BURN)) dismantle() /obj/machinery/proc/get_damageable_component(var/damage_type) diff --git a/code/game/machinery/_machines_base/machinery_power.dm b/code/game/machinery/_machines_base/machinery_power.dm index 338a9a7a452..9e3aaff8a48 100644 --- a/code/game/machinery/_machines_base/machinery_power.dm +++ b/code/game/machinery/_machines_base/machinery_power.dm @@ -87,10 +87,10 @@ This is /obj/machinery level code to properly manage power usage from the area. if(MACHINE_UPDATES_FROM_AREA_POWER) var/area/my_area = get_area(src) if(istype(my_area)) - events_repository.register(/decl/observ/area_power_change, my_area, src, .proc/power_change) + events_repository.register(/decl/observ/area_power_change, my_area, src, PROC_REF(power_change)) if(mapload) // currently outside mapload, movables trigger loc/Entered(src, null) in ..(), which will update power. REPORT_POWER_CONSUMPTION_CHANGE(0, get_power_usage()) - events_repository.register(/decl/observ/moved, src, src, .proc/update_power_on_move) + events_repository.register(/decl/observ/moved, src, src, PROC_REF(update_power_on_move)) power_init_complete = TRUE . = ..() @@ -99,8 +99,8 @@ This is /obj/machinery level code to properly manage power usage from the area. if(MACHINE_UPDATES_FROM_AREA_POWER) var/area/my_area = get_area(src) if(istype(my_area)) - events_repository.unregister(/decl/observ/area_power_change, my_area, src, .proc/power_change) - events_repository.unregister(/decl/observ/moved, src, src, .proc/update_power_on_move) + events_repository.unregister(/decl/observ/area_power_change, my_area, src, PROC_REF(power_change)) + events_repository.unregister(/decl/observ/moved, src, src, PROC_REF(update_power_on_move)) REPORT_POWER_CONSUMPTION_CHANGE(get_power_usage(), 0) . = ..() @@ -120,11 +120,11 @@ This is /obj/machinery level code to properly manage power usage from the area. if(old_area) old_area.power_use_change(power, 0, power_channel) if(MACHINE_UPDATES_FROM_AREA_POWER) - events_repository.unregister(/decl/observ/area_power_change, old_area, src, .proc/power_change) + events_repository.unregister(/decl/observ/area_power_change, old_area, src, PROC_REF(power_change)) if(new_area) new_area.power_use_change(0, power, power_channel) if(MACHINE_UPDATES_FROM_AREA_POWER) - events_repository.register(/decl/observ/area_power_change, new_area, src, .proc/power_change) + events_repository.register(/decl/observ/area_power_change, new_area, src, PROC_REF(power_change)) power_change() // Force check in case the old area was powered and the new one isn't or vice versa. diff --git a/code/game/machinery/_machines_base/machinery_public_vars.dm b/code/game/machinery/_machines_base/machinery_public_vars.dm index 27ef2d83efb..d1288ef7817 100644 --- a/code/game/machinery/_machines_base/machinery_public_vars.dm +++ b/code/game/machinery/_machines_base/machinery_public_vars.dm @@ -62,7 +62,7 @@ Must be implemented by subtypes. return islist(new_value) if(IC_FORMAT_INDEX) return isnum(new_value) - + /* Listener registration. You must unregister yourself if you are destroyed; the owner being destroyed will be handled automatically. */ @@ -75,7 +75,7 @@ Listener registration. You must unregister yourself if you are destroyed; the ow return // Can try and register, but updates aren't coming if(!listeners[owner]) listeners[owner] = list() - events_repository.register(/decl/observ/destroyed, owner, src, .proc/owner_destroyed) + events_repository.register(/decl/observ/destroyed, owner, src, PROC_REF(owner_destroyed)) LAZYADD(listeners[owner][listener], registered_proc) return TRUE diff --git a/code/game/machinery/_machines_base/stock_parts/building_material.dm b/code/game/machinery/_machines_base/stock_parts/building_material.dm index 14aa1aea81d..615a39b9a85 100644 --- a/code/game/machinery/_machines_base/stock_parts/building_material.dm +++ b/code/game/machinery/_machines_base/stock_parts/building_material.dm @@ -33,23 +33,32 @@ new_material.forceMove(null) // amount will cap the amount given in a stack, but may return less than amount specified. -/obj/item/stock_parts/building_material/proc/remove_material(material_type, amount) +/obj/item/stock_parts/building_material/proc/remove_material(material_type, amount, force_destination) if(ispath(material_type, /obj/item/stack)) for(var/obj/item/stack/stack in materials) if(stack.stack_merge_type == material_type) var/stack_amount = stack.get_amount() if(stack_amount <= amount) materials -= stack - stack.dropInto(loc) + if(force_destination) + stack.forceMove(force_destination) + else + stack.dropInto(loc) amount -= stack_amount return stack var/obj/item/stack/new_stack = stack.split(amount) - new_stack.dropInto(loc) + if(force_destination) + new_stack.forceMove(force_destination) + else + new_stack.dropInto(loc) return new_stack for(var/obj/item/item in materials) if(istype(item, material_type)) materials -= item - item.dropInto(loc) + if(force_destination) + item.forceMove(force_destination) + else + item.dropInto(loc) return item /obj/item/stock_parts/building_material/on_uninstall(var/obj/machinery/machine) @@ -58,9 +67,9 @@ materials = null ..() -/obj/item/stock_parts/building_material/building_cost() +/obj/item/stock_parts/building_material/get_contained_matter() . = ..() for(var/obj/item/thing in materials) - var/list/costs = thing.building_cost() + var/list/costs = thing.get_contained_matter() for(var/key in costs) - .[key] += costs[key] \ No newline at end of file + .[key] += costs[key] diff --git a/code/game/machinery/_machines_base/stock_parts/card_reader.dm b/code/game/machinery/_machines_base/stock_parts/card_reader.dm index f3ee37f8c8c..fb8b1fe8d34 100644 --- a/code/game/machinery/_machines_base/stock_parts/card_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/card_reader.dm @@ -7,7 +7,7 @@ desc = "A RFID card reader for various authentication or data sharing usages." icon = 'icons/obj/items/stock_parts/modular_components.dmi' icon_state = "cardreader" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, diff --git a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm index 1a0ce05bd05..eb6a5b8fe72 100644 --- a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm @@ -7,7 +7,7 @@ desc = "A floppy disk drive for installation in most machines. Able to read most floppy disks." icon = 'icons/obj/items/stock_parts/modular_components.dmi' icon_state = "floppy_drive" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm b/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm index ed87e48ab3f..7eb99203b77 100644 --- a/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm @@ -4,7 +4,7 @@ name = "scanning module" desc = "A compact, high resolution scanning module used in the construction of certain devices." icon_state = "scan_module" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) base_type = /obj/item/stock_parts/scanning_module @@ -14,7 +14,7 @@ name = "micro-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "micro_mani" - origin_tech = "{'materials':1,'programming':1}" + origin_tech = @'{"materials":1,"programming":1}' material = /decl/material/solid/metal/steel base_type = /obj/item/stock_parts/manipulator w_class = ITEM_SIZE_TINY @@ -23,7 +23,7 @@ name = "micro-laser" desc = "A tiny laser used in certain devices." icon_state = "micro_laser" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) base_type = /obj/item/stock_parts/micro_laser @@ -33,7 +33,7 @@ name = "matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "matter_bin" - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel base_type = /obj/item/stock_parts/matter_bin @@ -41,7 +41,7 @@ name = "capacitor" desc = "A basic capacitor used in the construction of a variety of devices." icon_state = "capacitor" - origin_tech = "{'powerstorage':1}" + origin_tech = @'{"powerstorage":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) var/charge = 0 @@ -69,7 +69,7 @@ name = "advanced scanning module" desc = "A compact, high resolution scanning module used in the construction of certain devices." icon_state = "advanced_scan_module" - origin_tech = "{'magnets':3}" + origin_tech = @'{"magnets":3}' rating = 2 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) @@ -78,7 +78,7 @@ name = "nano-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "nano_mani" - origin_tech = "{'materials':3,'programming':2}" + origin_tech = @'{"materials":3,"programming":2}' rating = 2 material = /decl/material/solid/metal/steel @@ -86,7 +86,7 @@ name = "high-power micro-laser" desc = "A tiny laser used in certain devices." icon_state = "high_micro_laser" - origin_tech = "{'magnets':3}" + origin_tech = @'{"magnets":3}' rating = 2 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) @@ -95,14 +95,14 @@ name = "advanced matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "advanced_matter_bin" - origin_tech = "{'materials':3}" + origin_tech = @'{"materials":3}' rating = 2 material = /decl/material/solid/metal/steel /obj/item/stock_parts/capacitor/adv name = "advanced capacitor" desc = "An advanced capacitor used in the construction of a variety of devices." - origin_tech = "{'powerstorage':3}" + origin_tech = @'{"powerstorage":3}' icon_state = "advanced_capacitor" rating = 2 @@ -112,7 +112,7 @@ name = "phasic scanning module" desc = "A compact, high resolution phasic scanning module used in the construction of certain devices." icon_state = "phasic_scan_module" - origin_tech = "{'magnets':5}" + origin_tech = @'{"magnets":5}' rating = 3 material = /decl/material/solid/metal/steel matter = list( @@ -124,7 +124,7 @@ name = "pico-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "pico_mani" - origin_tech = "{'materials':5,'programming':2}" + origin_tech = @'{"materials":5,"programming":2}' rating = 3 material = /decl/material/solid/metal/steel @@ -132,7 +132,7 @@ name = "ultra-high-power micro-laser" icon_state = "ultra_high_micro_laser" desc = "A tiny laser used in certain devices." - origin_tech = "{'magnets':5}" + origin_tech = @'{"magnets":5}' rating = 3 material = /decl/material/solid/metal/steel matter = list( @@ -144,7 +144,7 @@ name = "super matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "super_matter_bin" - origin_tech = "{'materials':5}" + origin_tech = @'{"materials":5}' rating = 3 material = /decl/material/solid/metal/steel @@ -152,7 +152,7 @@ name = "super capacitor" desc = "A super-high capacity capacitor used in the construction of a variety of devices." icon_state = "super_capacitor" - origin_tech = "{'powerstorage':5,'materials':4}" + origin_tech = @'{"powerstorage":5,"materials":4}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, @@ -166,7 +166,7 @@ name = "subspace ansible" icon_state = "subspace_ansible" desc = "A compact module capable of sensing extradimensional activity." - origin_tech = "{'programming':3,'magnets':5,'materials':4,'wormholes':2}" + origin_tech = @'{"programming":3,"magnets":5,"materials":4,"wormholes":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT) @@ -174,7 +174,7 @@ name = "hyperwave filter" icon_state = "hyperwave_filter" desc = "A tiny device capable of filtering and converting super-intense radiowaves." - origin_tech = "{'programming':4,'magnets':2}" + origin_tech = @'{"programming":4,"magnets":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT) @@ -182,7 +182,7 @@ name = "subspace amplifier" icon_state = "subspace_amplifier" desc = "A compact micro-machine capable of amplifying weak subspace transmissions." - origin_tech = "{'programming':3,'magnets':4,'materials':4,'wormholes':2}" + origin_tech = @'{"programming":3,"magnets":4,"materials":4,"wormholes":2}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, @@ -193,7 +193,7 @@ name = "subspace treatment disk" icon_state = "treatment_disk" desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves." - origin_tech = "{'programming':3,'magnets':2,'materials':5,'wormholes':2}" + origin_tech = @'{"programming":3,"magnets":2,"materials":5,"wormholes":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT) @@ -201,7 +201,7 @@ name = "subspace wavelength analyzer" icon_state = "wavelength_analyzer" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - origin_tech = "{'programming':3,'magnets':4,'materials':4,'wormholes':2}" + origin_tech = @'{"programming":3,"magnets":4,"materials":4,"wormholes":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT) @@ -209,7 +209,7 @@ name = "ansible crystal" icon_state = "ansible_crystal" desc = "A crystal made from pure glass used to transmit laser databursts to subspace." - origin_tech = "{'magnets':4,'materials':4,'wormholes':2}" + origin_tech = @'{"magnets":4,"materials":4,"wormholes":2}' material = /decl/material/solid/glass matter = list( /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, @@ -220,7 +220,7 @@ name = "subspace transmitter" icon_state = "subspace_transmitter" desc = "A large piece of equipment used to open a window into the subspace dimension." - origin_tech = "{'magnets':5,'materials':5,'wormholes':3}" + origin_tech = @'{"magnets":5,"materials":5,"wormholes":3}' material = /decl/material/solid/glass matter = list( /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/machinery/_machines_base/stock_parts/power/battery.dm b/code/game/machinery/_machines_base/stock_parts/power/battery.dm index 48104faab0d..f883e307f14 100644 --- a/code/game/machinery/_machines_base/stock_parts/power/battery.dm +++ b/code/game/machinery/_machines_base/stock_parts/power/battery.dm @@ -43,7 +43,7 @@ if(cell) return cell = new_cell - events_repository.register(/decl/observ/destroyed, cell, src, .proc/remove_cell) + events_repository.register(/decl/observ/destroyed, cell, src, PROC_REF(remove_cell)) if(!machine) machine = loc if(istype(machine)) @@ -136,10 +136,9 @@ /obj/item/stock_parts/power/battery/on_refresh(var/obj/machinery/machine) if(machine && !cell) var/obj/item/stock_parts/building_material/mat = machine.get_component_of_type(/obj/item/stock_parts/building_material) - var/obj/item/cell/cell = mat && mat.remove_material(/obj/item/cell, 1) + var/obj/item/cell/cell = mat && mat.remove_material(/obj/item/cell, 1, src) if(cell) add_cell(machine, cell) - cell.forceMove(src) charge_rate = initial(charge_rate) charge_rate *= 1 + 0.5 * machine.total_component_rating_of_type(/obj/item/stock_parts/capacitor) @@ -226,7 +225,7 @@ material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/stock_parts/power/battery/buildable/turbo/get_lore_info() @@ -241,7 +240,7 @@ material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/stock_parts/power/battery/buildable/responsive/get_lore_info() diff --git a/code/game/machinery/_machines_base/stock_parts/power/terminal.dm b/code/game/machinery/_machines_base/stock_parts/power/terminal.dm index c183753f25e..20d892e14ea 100644 --- a/code/game/machinery/_machines_base/stock_parts/power/terminal.dm +++ b/code/game/machinery/_machines_base/stock_parts/power/terminal.dm @@ -72,16 +72,16 @@ terminal = new_terminal terminal.master = src - events_repository.register(/decl/observ/destroyed, terminal, src, .proc/unset_terminal) + events_repository.register(/decl/observ/destroyed, terminal, src, PROC_REF(unset_terminal)) terminal.queue_icon_update() - set_extension(src, /datum/extension/event_registration/shuttle_stationary, GET_DECL(/decl/observ/moved), machine, .proc/machine_moved, get_area(src)) + set_extension(src, /datum/extension/event_registration/shuttle_stationary, GET_DECL(/decl/observ/moved), machine, PROC_REF(machine_moved), get_area(src)) set_status(machine, PART_STAT_CONNECTED) start_processing(machine) /obj/item/stock_parts/power/terminal/proc/machine_moved(var/obj/machinery/machine, var/turf/old_loc, var/turf/new_loc) if(!terminal) - events_repository.unregister(/decl/observ/moved, machine, src, .proc/machine_moved) + events_repository.unregister(/decl/observ/moved, machine, src, PROC_REF(machine_moved)) return if(istype(new_loc) && (terminal.loc == get_step(new_loc, terminal_dir))) return // This location is fine diff --git a/code/game/machinery/_machines_base/stock_parts/radio/transmitter.dm b/code/game/machinery/_machines_base/stock_parts/radio/transmitter.dm index 67d06b18aec..e9d4feec331 100644 --- a/code/game/machinery/_machines_base/stock_parts/radio/transmitter.dm +++ b/code/game/machinery/_machines_base/stock_parts/radio/transmitter.dm @@ -4,6 +4,9 @@ icon_state = "transmitter" var/range = 60 // Limits transmit range var/latency = 2 // Delay between event and transmission; doesn't apply to transmit on tick + #ifdef UNIT_TEST + latency = 0 // this can slow down testing and cause random inconsistent failures + #endif var/buffer /obj/item/stock_parts/radio/transmitter/proc/queue_transmit(list/data) @@ -11,7 +14,10 @@ return if(!buffer) buffer = data - addtimer(CALLBACK(src, .proc/transmit), latency) + if(latency) + addtimer(CALLBACK(src, PROC_REF(transmit)), latency) + else + transmit() else buffer |= data @@ -47,7 +53,7 @@ start_processing(machine) for(var/thing in transmit_on_change) var/decl/public_access/public_variable/variable = transmit_on_change[thing] - variable.register_listener(src, machine, .proc/var_changed) + variable.register_listener(src, machine, PROC_REF(var_changed)) /obj/item/stock_parts/radio/transmitter/basic/on_uninstall(obj/machinery/machine) for(var/thing in transmit_on_change) @@ -87,7 +93,7 @@ if(!is_valid_event(machine, event)) event = null if(event) - event.register_listener(src, machine, .proc/trigger_event) + event.register_listener(src, machine, PROC_REF(trigger_event)) /obj/item/stock_parts/radio/transmitter/on_event/on_uninstall(obj/machinery/machine) if(event) diff --git a/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm b/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm index d43c4bbf012..b1aa3c32f90 100644 --- a/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm +++ b/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm @@ -2,7 +2,7 @@ name = "console screen" desc = "Used in the construction of computers and other devices with an interactive screen." icon_state = "output" - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/fiberglass base_type = /obj/item/stock_parts/console_screen part_flags = PART_FLAG_HAND_REMOVE @@ -22,8 +22,8 @@ name = "input controller" desc = "A standard part required by many machines to recieve user input." icon_state = "input" - origin_tech = "{'materials':1}" - material = /decl/material/solid/plastic + origin_tech = @'{"materials":1}' + material = /decl/material/solid/organic/plastic base_type = /obj/item/stock_parts/keyboard part_flags = PART_FLAG_HAND_REMOVE w_class = ITEM_SIZE_TINY @@ -33,4 +33,3 @@ ..() if(is_functional()) machine.set_noinput(FALSE) - \ No newline at end of file diff --git a/code/game/machinery/air_sensor.dm b/code/game/machinery/air_sensor.dm index e7daf84e268..aa53b70818e 100644 --- a/code/game/machinery/air_sensor.dm +++ b/code/game/machinery/air_sensor.dm @@ -11,7 +11,7 @@ public_variables = list( /decl/public_access/public_variable/gas, /decl/public_access/public_variable/pressure, - /decl/public_access/public_variable/temperature + /decl/public_access/public_variable/temperature ) stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/air_sensor = 1) use_power = POWER_USE_IDLE @@ -47,7 +47,7 @@ return . = list() for(var/gas in air_sample.gas) - var/decl/material/mat = GET_DECL(gas) + var/decl/material/mat = GET_DECL(gas) var/gaspercent = round(air_sample.gas[gas]*100/total_moles,0.01) var/gas_list = list("symbol" = mat.gas_symbol_html, "percent" = gaspercent) . += list(gas_list) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 5a82cc55e3a..eee0fdeac6d 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -62,7 +62,7 @@ uncreated_component_parts = list(/obj/item/stock_parts/power/apc = 1) construct_state = /decl/machine_construction/wall_frame/panel_closed wires = /datum/wires/alarm - directional_offset = "{'NORTH':{'y':-21}, 'SOUTH':{'y':21}, 'EAST':{'x':-21}, 'WEST':{'x':21}}" + directional_offset = @'{"NORTH":{"y":-21}, "SOUTH":{"y":21}, "EAST":{"x":-21}, "WEST":{"x":21}}' var/alarm_id = null var/breach_detection = 1 // Whether to use automatic breach detection or not @@ -146,7 +146,8 @@ return // spawned in nullspace, presumably as a prototype for construction purposes. area_uid = alarm_area.uid - // breathable air according to human/Life() + // breathable air according to default human species + // TODO: make it use map default species? var/decl/material/gas_mat = GET_DECL(/decl/material/gas/oxygen) TLV[gas_mat.gas_name] = list(16, 19, 135, 140) // Partial pressure, kpa gas_mat = GET_DECL(/decl/material/gas/carbon_dioxide) @@ -795,13 +796,13 @@ if(old_area && old_area == alarm_area) alarm_area = null area_uid = null - events_repository.unregister(/decl/observ/name_set, old_area, src, .proc/change_area_name) + events_repository.unregister(/decl/observ/name_set, old_area, src, PROC_REF(change_area_name)) if(new_area) ASSERT(isnull(alarm_area)) alarm_area = new_area area_uid = new_area.uid change_area_name(alarm_area, null, alarm_area.name) - events_repository.register(/decl/observ/name_set, alarm_area, src, .proc/change_area_name) + events_repository.register(/decl/observ/name_set, alarm_area, src, PROC_REF(change_area_name)) for(var/device_tag in alarm_area.air_scrub_names + alarm_area.air_vent_names) send_signal(device_tag, list()) // ask for updates; they initialized before us and we didn't get the data @@ -824,7 +825,7 @@ FIRE ALARM frame_type = /obj/item/frame/fire_alarm uncreated_component_parts = list(/obj/item/stock_parts/power/apc = 1) construct_state = /decl/machine_construction/wall_frame/panel_closed - directional_offset = "{'NORTH':{'y':-21}, 'SOUTH':{'y':21}, 'EAST':{'x':21}, 'WEST':{'x':-21}}" + directional_offset = @'{"NORTH":{"y":-21}, "SOUTH":{"y":21}, "EAST":{"x":21}, "WEST":{"x":-21}}' var/detecting = TRUE var/working = TRUE @@ -894,10 +895,9 @@ FIRE ALARM overlays += get_cached_overlay("fire0") /obj/machinery/firealarm/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(src.detecting) - if(exposed_temperature > T0C+200) - src.alarm() // added check of detector status here - return + if(detecting && exposed_temperature > T0C+200) + alarm() + return ..() /obj/machinery/firealarm/bullet_act() return src.alarm() @@ -1036,7 +1036,7 @@ FIRE ALARM idle_power_usage = 2 active_power_usage = 6 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-21}, 'SOUTH':{'y':21}, 'EAST':{'x':21}, 'WEST':{'x':-21}}" + directional_offset = @'{"NORTH":{"y":-21}, "SOUTH":{"y":21}, "EAST":{"x":21}, "WEST":{"x":-21}}' var/time = 1 SECOND var/timing = FALSE var/working = TRUE diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index fc10ef624ba..07ce4ee1cd5 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "yellow" density = TRUE - var/health = 100.0 + max_health = 100 obj_flags = OBJ_FLAG_CONDUCTIBLE w_class = ITEM_SIZE_GARGANTUAN construct_state = /decl/machine_construction/pipe/welder @@ -177,6 +177,7 @@ update_flag if(exposed_temperature > temperature_resistance) health -= 5 healthcheck() + return ..() /obj/machinery/portable_atmospherics/canister/proc/healthcheck() if(destroyed) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 45aa2558c24..4dd3caeb6fd 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -32,7 +32,7 @@ /obj/machinery/meter/proc/set_target(atom/new_target) clear_target() target = new_target - events_repository.register(/decl/observ/destroyed, target, src, .proc/clear_target) + events_repository.register(/decl/observ/destroyed, target, src, PROC_REF(clear_target)) /obj/machinery/meter/proc/clear_target() if(target) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index a046dde2a97..2958d2eab9a 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -2,7 +2,7 @@ name = "atmoalter" use_power = POWER_USE_OFF construct_state = /decl/machine_construction/default/panel_closed - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE var/datum/gas_mixture/air_contents = new var/obj/item/tank/holding @@ -76,37 +76,33 @@ var/datum/extension/atmospherics_connection/connection = get_extension(src, /datum/extension/atmospherics_connection) connection?.update_connected_network() -/obj/machinery/portable_atmospherics/attackby(var/obj/item/W, var/mob/user) - if ((istype(W, /obj/item/tank) && !( src.destroyed ))) - if (src.holding) - return - if(!user.try_unequip(W, src)) - return - src.holding = W +/obj/machinery/portable_atmospherics/attackby(var/obj/item/used_item, var/mob/user) + if ((istype(used_item, /obj/item/tank) && !destroyed)) + if (holding) + return TRUE + if(!user.try_unequip(used_item, src)) + return TRUE + holding = used_item update_icon() - return + return TRUE - else if(IS_WRENCH(W) && !panel_open) + else if(IS_WRENCH(used_item) && !panel_open) if(disconnect()) - to_chat(user, "You disconnect \the [src] from the port.") + to_chat(user, SPAN_NOTICE("You disconnect \the [src] from the port.")) update_icon() - return - else - var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc - if(possible_port) - if(connect(possible_port)) - to_chat(user, "You connect \the [src] to the port.") - update_icon() - return - else - to_chat(user, "\The [src] failed to connect to the port.") - return - else - to_chat(user, "Nothing happens.") - return ..() - - else if (istype(W, /obj/item/scanner/gas)) - return + return TRUE + var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector) in loc + if(possible_port) + if(connect(possible_port)) + to_chat(user, SPAN_NOTICE("You connect \the [src] to the port.")) + update_icon() + return TRUE + to_chat(user, SPAN_NOTICE("\The [src] failed to connect to the port.")) + return TRUE + return ..() + + else if (istype(used_item, /obj/item/scanner/gas)) + return FALSE // allow the scanner's afterattack to run return ..() diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 97fb22a99b3..2c107d7aac1 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -6,7 +6,7 @@ density = TRUE w_class = ITEM_SIZE_NORMAL base_type = /obj/machinery/portable_atmospherics/powered/pump - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED var/direction_out = 0 //0 = siphoning, 1 = releasing diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 1b263481da3..e031dac2f19 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -6,7 +6,7 @@ density = TRUE w_class = ITEM_SIZE_NORMAL base_type = /obj/machinery/portable_atmospherics/powered/scrubber - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED var/volume_rate = 800 @@ -148,7 +148,7 @@ //Huge scrubber /obj/machinery/portable_atmospherics/powered/scrubber/huge - name = "Huge Air Scrubber" + name = "huge air scrubber" icon_state = "scrubber:0" anchored = TRUE volume = 50000 @@ -200,7 +200,7 @@ /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary - name = "Stationary Air Scrubber" + name = "stationary air scrubber" base_type = /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I, var/mob/user) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index e3656033c26..a4210bcb185 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -59,6 +59,7 @@ . = ..() /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. + ..() update_icon() /obj/machinery/biogenerator/on_update_icon() diff --git a/code/game/machinery/bodyscanner.dm b/code/game/machinery/bodyscanner.dm index b236e2d5bd3..2e815dae25a 100644 --- a/code/game/machinery/bodyscanner.dm +++ b/code/game/machinery/bodyscanner.dm @@ -111,7 +111,7 @@ icon_state = "body_scanner_2" //Like grap-put, but for mouse-drop. -/obj/machinery/bodyscanner/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/machinery/bodyscanner/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && isliving(dropping)) var/mob/living/M = dropping diff --git a/code/game/machinery/bodyscanner_console.dm b/code/game/machinery/bodyscanner_console.dm index e627b6a5698..f8864ab712e 100644 --- a/code/game/machinery/bodyscanner_console.dm +++ b/code/game/machinery/bodyscanner_console.dm @@ -9,7 +9,6 @@ construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 - var/list/display_tags = list() var/list/connected_displays = list() var/list/data = list() @@ -28,17 +27,17 @@ src.connected = locate(/obj/machinery/bodyscanner, get_step(src, D)) if(src.connected) break - events_repository.register(/decl/observ/destroyed, connected, src, .proc/unlink_scanner) + events_repository.register(/decl/observ/destroyed, connected, src, PROC_REF(unlink_scanner)) /obj/machinery/body_scanconsole/proc/unlink_scanner(var/obj/machinery/bodyscanner/scanner) - events_repository.unregister(/decl/observ/destroyed, scanner, src, .proc/unlink_scanner) + events_repository.unregister(/decl/observ/destroyed, scanner, src, PROC_REF(unlink_scanner)) connected = null /obj/machinery/body_scanconsole/proc/FindDisplays() for(var/obj/machinery/body_scan_display/D in SSmachines.machinery) - if(D.tag in display_tags) + if(D.id_tag == connected.id_tag) connected_displays += D - events_repository.register(/decl/observ/destroyed, D, src, .proc/remove_display) + events_repository.register(/decl/observ/destroyed, D, src, PROC_REF(remove_display)) return !!connected_displays.len /obj/machinery/body_scanconsole/attack_hand(mob/user) @@ -135,7 +134,7 @@ /obj/machinery/body_scanconsole/proc/remove_display(var/obj/machinery/body_scan_display/display) connected_displays -= display - events_repository.unregister(/decl/observ/destroyed, display, src, .proc/remove_display) + events_repository.unregister(/decl/observ/destroyed, display, src, PROC_REF(remove_display)) /obj/machinery/body_scanconsole/Destroy() . = ..() diff --git a/code/game/machinery/bodyscanner_display.dm b/code/game/machinery/bodyscanner_display.dm index 21dfd580338..2fadc8e44e9 100644 --- a/code/game/machinery/bodyscanner_display.dm +++ b/code/game/machinery/bodyscanner_display.dm @@ -12,25 +12,32 @@ stat_immune = 0 w_class = ITEM_SIZE_HUGE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' var/list/bodyscans = list() var/selected = 0 /obj/machinery/body_scan_display/proc/add_new_scan(var/list/scan) bodyscans += list(scan.Copy()) updateUsrDialog() + queue_icon_update() /obj/machinery/body_scan_display/on_update_icon() . = ..() cut_overlays() if(!(stat & (BROKEN|NOPOWER))) - add_overlay("operating") + if (selected != 0) + add_overlay("operating") + else if (bodyscans.len > 0) + add_overlay("menu") + else + add_overlay("standby") /obj/machinery/body_scan_display/OnTopic(mob/user, href_list) if(href_list["view"]) var/selection = text2num(href_list["view"]) if(is_valid_index(selection, bodyscans)) selected = selection + queue_icon_update() return TOPIC_REFRESH return TOPIC_HANDLED if(href_list["delete"]) @@ -39,6 +46,7 @@ return TOPIC_HANDLED if(selected == selection) selected = 0 + queue_icon_update() else if(selected > selection) selected-- bodyscans -= list(bodyscans[selection]) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 97c7529dcfe..10f382fb55b 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -24,7 +24,7 @@ construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':30}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":30}, "EAST":{"x":-24}, "WEST":{"x":24}}' var/active = FALSE var/operating = FALSE diff --git a/code/game/machinery/camera/_camera_device.dm b/code/game/machinery/camera/_camera_device.dm index aba5e522a61..6fa7a539f25 100644 --- a/code/game/machinery/camera/_camera_device.dm +++ b/code/game/machinery/camera/_camera_device.dm @@ -12,7 +12,7 @@ var/xray_enabled = FALSE has_commands = TRUE -/datum/extension/network_device/camera/New(datum/holder, n_id, n_key, c_type, autojoin, list/preset_channels, camera_name, camnet_enabled = TRUE, req_connection = TRUE) +/datum/extension/network_device/camera/New(datum/holder, n_id, n_key, r_type, autojoin, list/preset_channels, camera_name, camnet_enabled = TRUE, req_connection = TRUE) if(length(preset_channels)) channels = preset_channels.Copy() . = ..() @@ -22,6 +22,7 @@ display_name = camera_name /datum/extension/network_device/camera/post_construction() + . = ..() if(cameranet_enabled) cameranet.add_source(holder) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 973d1caf10b..9993d060e65 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -10,7 +10,7 @@ anchored = TRUE movable_flags = MOVABLE_FLAG_PROXMOVE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'SOUTH':{'y':21}, 'EAST':{'x':-10}, 'WEST':{'x':10}}" + directional_offset = @'{"SOUTH":{"y":21}, "EAST":{"x":-10}, "WEST":{"x":10}}' base_type = /obj/machinery/camera uncreated_component_parts = null construct_state = /decl/machine_construction/wall_frame/panel_closed @@ -86,13 +86,12 @@ if(!c_tag) var/area/A = get_area(src) if(isturf(loc) && A) - for(var/obj/machinery/camera/C in A) - if(C == src) continue - if(C.number) - number = max(number, C.number+1) - c_tag = "[A.proper_name][number == 1 ? "" : " #[number]"]" - if(!c_tag) // Add a default c_tag in case the camera has been placed in an invalid location or inside another object. - c_tag = "Security Camera - [random_id(/obj/machinery/camera, 100,999)]" + var/suffix = uniqueness_repository.Generate(/datum/uniqueness_generator/id_sequential, "c_tag [A.proper_name]", 1) // unlike sequential_id, starts at 1 instead of 100 + if(suffix == 1) + suffix = null + c_tag = "[A.proper_name][suffix ? " [suffix]" : null]" + // Add a default c_tag in case the camera has been placed in an invalid location or inside another object. + c_tag ||= "Security Camera - [random_id(/obj/machinery/camera, 100,999)]" invalidateCameraCache() set_extension(src, /datum/extension/network_device/camera, null, null, null, TRUE, preset_channels, c_tag, cameranet_enabled, requires_connection) @@ -192,7 +191,7 @@ if (istype(AM, /obj)) var/obj/O = AM if (O.throwforce >= src.toughness) - visible_message("[src] was hit by [O].") + visible_message(SPAN_WARNING("[src] was hit by [O]!")) take_damage(O.throwforce) /obj/machinery/camera/physical_attack_hand(mob/living/carbon/human/user) @@ -200,7 +199,7 @@ return if(user.species.can_shred(user)) user.do_attack_animation(src) - visible_message("\The [user] slashes at [src]!") + visible_message(SPAN_WARNING("\The [user] slashes at [src]!")) playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) add_hiddenprint(user) take_damage(25) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 62bf538ecfe..30ee583beec 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -1,32 +1,31 @@ /obj/machinery/camera/network/engineering preset_channels = list(CAMERA_CAMERA_CHANNEL_ENGINEERING) - initial_access = list(access_engine) + req_access = list(access_engine) /obj/machinery/camera/network/ert preset_channels = list(CAMERA_CHANNEL_ERT) cameranet_enabled = FALSE - initial_access = list(access_engine) + req_access = list(access_engine) /obj/machinery/camera/network/medbay preset_channels = list(CAMERA_CHANNEL_MEDICAL) - initial_access = list(access_medical) - + req_access = list(access_medical) /obj/machinery/camera/network/mercenary preset_channels = list(CAMERA_CHANNEL_MERCENARY) cameranet_enabled = FALSE - initial_access = list(access_mercenary) + req_access = list(access_mercenary) /obj/machinery/camera/network/mining preset_channels = list(CAMERA_CHANNEL_MINE) - initial_access = list(access_mining) + req_access = list(access_mining) /obj/machinery/camera/network/research preset_channels = list(CAMERA_CHANNEL_RESEARCH) - initial_access = list(access_research) + req_access = list(access_research) /obj/machinery/camera/network/security preset_channels = list(CAMERA_CHANNEL_SECURITY) - initial_access = list(access_security) + req_access = list(access_security) /obj/machinery/camera/network/television preset_channels = list(CAMERA_CHANNEL_TELEVISION) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index ea4513468bd..63a2bd834e9 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -232,7 +232,7 @@ if(. == TRACKING_NO_COVERAGE) var/turf/T = get_turf(src) - if(T && isStationLevel(T.z) && hassensorlevel(src, SUIT_SENSOR_TRACKING)) + if(T && isStationLevel(T.z) && hassensorlevel(src, VITALS_SENSOR_TRACKING)) return TRACKING_POSSIBLE /mob/living/proc/tracking_initiated() diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 3fa89eef553..efc4136a173 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -11,7 +11,7 @@ var/global/list/empty_playable_ai_cores = list() var/datum/ai_laws/laws var/obj/item/stock_parts/circuitboard/circuit - var/obj/item/mmi/brain + var/obj/item/organ/internal/brain var/authorized var/circuit_secured = FALSE @@ -139,30 +139,24 @@ var/global/list/empty_playable_ai_cores = list() if(circuit && circuit_secured) - if((istype(P, /obj/item/mmi) || istype(P, /obj/item/organ/internal/posibrain)) && wired && circuit && circuit_secured) - var/mob/living/carbon/brain/B - if(istype(P, /obj/item/mmi)) - var/obj/item/mmi/M = P - B = M.brainmob - else - var/obj/item/organ/internal/posibrain/PB = P - B = PB.brainmob - if(!B) - to_chat(user, SPAN_WARNING("Sticking an empty [P] into the frame would sort of defeat the purpose.")) + if(istype(P, /obj/item/organ/internal) && wired && circuit && circuit_secured) + var/obj/item/organ/internal/M = P + var/mob/living/brainmob = M.get_brainmob() + if(!brainmob) + to_chat(user, SPAN_WARNING("Sticking a mindless [P] into the frame would be pointless.")) return - if(B.stat == DEAD) + if(brainmob.stat == DEAD) to_chat(user, SPAN_WARNING("Sticking a dead [P] into the frame would sort of defeat the purpose.")) return - if(jobban_isbanned(B, "AI")) + if(jobban_isbanned(brainmob, "AI")) to_chat(user, SPAN_WARNING("This [P] does not seem to fit.")) return if(!user.try_unequip(P, src)) - return - if(B.mind) - clear_antag_roles(B.mind, 1) - brain = P - to_chat(usr, "Added [P].") - update_icon() + if(brainmob.mind) + clear_antag_roles(brainmob.mind, 1) + brain = P + to_chat(usr, "You connect \the [P] to the frame and slide it into the casing.") + update_icon() return TRUE if(istype(P, /obj/item/stack/material)) diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index 8563b511e02..c35b85a4b5a 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -449,7 +449,7 @@ for(var/i=0;i<10;i++) sleep(10) SET_STATUS_MAX(M, STAT_STUN, 5) - M.adjustBruteLoss(10) + M.adjustBruteLoss(10, do_update_health = FALSE) M.adjustFireLoss(10) usr.gib() //So that people can't cheese it and inject a lot of kelo/bicard before losing @@ -476,7 +476,7 @@ icon = 'icons/obj/toy/toy.dmi' icon_state = "ship" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/computer/area_atmos.dm similarity index 85% rename from code/game/machinery/atmoalter/area_atmos_computer.dm rename to code/game/machinery/computer/area_atmos.dm index 234285eb067..1f7b2dd927e 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/computer/area_atmos.dm @@ -1,5 +1,5 @@ /obj/machinery/computer/area_atmos - name = "Area Air Control" + name = "area air control" desc = "A computer used to control the stationary scrubbers and pumps in the area." icon_keyboard = "atmos_key" icon_screen = "area_atmos" @@ -20,7 +20,7 @@ /obj/machinery/computer/area_atmos/interface_interact(user) interact(user) return TRUE - + /obj/machinery/computer/area_atmos/interact(mob/user) var/dat = {" @@ -173,3 +173,27 @@ status = "ERROR: No scrubber found!" src.updateUsrDialog() + +/obj/machinery/computer/area_atmos/tag + name = "heavy scrubber control" + zone = "This computer is operating industrial scrubbers nearby." + var/last_scan + +/obj/machinery/computer/area_atmos/tag/scanscrubbers() + if(last_scan && ((world.time - last_scan) < 20 SECONDS)) + return FALSE + else + last_scan = world.time + + connectedscrubbers.Cut() + + for(var/obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber in SSmachines.machinery) + if(scrubber.id_tag == id_tag) + connectedscrubbers += scrubber + + updateUsrDialog() + +/obj/machinery/computer/area_atmos/tag/validscrubber(obj/machinery/portable_atmospherics/powered/scrubber/huge/scrubber) + if(scrubber.id_tag == id_tag) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 5ad530c42d6..1ff7caa637e 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -13,7 +13,7 @@ var/global/list/minor_air_alarms = list() /obj/machinery/computer/atmos_alert/Initialize() . = ..() - atmosphere_alarm.register_alarm(src, /atom/proc/update_icon) + atmosphere_alarm.register_alarm(src, TYPE_PROC_REF(/atom, update_icon)) /obj/machinery/computer/atmos_alert/Destroy() atmosphere_alarm.unregister_alarm(src) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 4745a0ca0cb..5a6e4780c71 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -4,7 +4,6 @@ name = "computer frame" icon = 'icons/obj/items/stock_parts/stock_parts.dmi' icon_state = "unwired" - obj_flags = OBJ_FLAG_ROTATABLE expected_machine_type = "computer" /obj/machinery/constructable_frame/computerframe/on_update_icon() diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/central_atmos.dm similarity index 60% rename from code/game/machinery/computer/atmos_control.dm rename to code/game/machinery/computer/central_atmos.dm index e2770e93b34..dd46a3b07f4 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/central_atmos.dm @@ -1,8 +1,4 @@ -/obj/item/stock_parts/circuitboard/atmoscontrol - name = "\improper Central Atmospherics Computer Circuitboard" - build_path = /obj/machinery/computer/atmoscontrol - -/obj/machinery/computer/atmoscontrol +/obj/machinery/computer/central_atmos name = "\improper Central Atmospherics Computer" icon = 'icons/obj/computer.dmi' icon_keyboard = "generic_key" @@ -11,23 +7,26 @@ density = TRUE anchored = TRUE initial_access = list(list(access_engine_equip, access_atmospherics)) + base_type = /obj/machinery/computer/central_atmos var/list/monitored_alarm_ids = null var/datum/nano_module/atmos_control/atmos_control - base_type = /obj/machinery/computer/atmoscontrol -/obj/machinery/computer/atmoscontrol/laptop - name = "Atmospherics Laptop" +// TODO: replace this with a modular computer at some point +/obj/machinery/computer/central_atmos/laptop + name = "atmospherics laptop" desc = "A cheap laptop." icon_state = "laptop" icon_keyboard = "laptop_key" icon_screen = "atmoslaptop" density = FALSE + construct_state = null + base_type = /obj/machinery/computer/central_atmos/laptop -/obj/machinery/computer/atmoscontrol/interface_interact(user) +/obj/machinery/computer/central_atmos/interface_interact(user) ui_interact(user) return TRUE -/obj/machinery/computer/atmoscontrol/ui_interact(var/mob/user) +/obj/machinery/computer/central_atmos/ui_interact(var/mob/user) if(!atmos_control) atmos_control = new(src, monitored_alarm_ids) atmos_control.set_monitored_alarms(monitored_alarm_ids) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index dad1d1f750f..24a04075335 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -16,7 +16,7 @@ var/light_range_on = 2 var/light_power_on = 1 var/overlay_layer - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE clicksound = "keyboard" /obj/machinery/computer/Initialize() diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index dd66d932193..612d747c33c 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -91,7 +91,7 @@ if(giver) data["giver"] = !!giver - data["giver_name"] = giver.rank || giver.assignment + data["giver_name"] = giver.position || giver.assignment data["giv_name"] = giv_name var/list/giver_access = list() @@ -185,7 +185,7 @@ pass.reason = reason pass.SetName("guest pass #[number]") pass.assignment = "Guest" - addtimer(CALLBACK(pass, /obj/item/card/id/guest/proc/expire), duration MINUTES, TIMER_UNIQUE) + addtimer(CALLBACK(pass, TYPE_PROC_REF(/obj/item/card/id/guest, expire)), duration MINUTES, TIMER_UNIQUE) playsound(src.loc, 'sound/machines/ping.ogg', 25, 0) . = TOPIC_REFRESH else if(!giver) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 858df3d35e4..cde979fbef0 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -64,7 +64,7 @@ var/obj/item/paper/monitorkey/MK = new(loc) // Will help make emagging the console not so easy to get away with. MK.info += "

£%@%(*$%&(£&?*(%&£/{}" - addtimer(CALLBACK(src, /obj/machinery/computer/message_monitor/proc/UnemagConsole), 100*length(linked_server.decryptkey)) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/computer/message_monitor, UnemagConsole)), 100*length(linked_server.decryptkey)) message = rebootmsg update_icon() return 1 @@ -290,7 +290,7 @@ src.screen = 2 update_icon() //Time it takes to bruteforce is dependant on the password length. - addtimer(CALLBACK(src, /obj/machinery/computer/message_monitor/proc/BruteForceConsole, usr, linked_server), 100*length(linked_server.decryptkey)) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/computer/message_monitor, BruteForceConsole), usr, linked_server), 100*length(linked_server.decryptkey)) //Delete the request console log. if (href_list["deleter"]) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 1fad0bc8153..5c639132877 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -20,7 +20,7 @@ /obj/machinery/computer/station_alert/Initialize() alarm_monitor = new monitor_type(src) - alarm_monitor.register_alarm(src, /atom/proc/update_icon) + alarm_monitor.register_alarm(src, TYPE_PROC_REF(/atom, update_icon)) . = ..() if(monitor_type) register_monitor(new monitor_type(src)) @@ -34,7 +34,7 @@ return alarm_monitor = monitor - alarm_monitor.register_alarm(src, /atom/proc/update_icon) + alarm_monitor.register_alarm(src, TYPE_PROC_REF(/atom, update_icon)) /obj/machinery/computer/station_alert/proc/unregister_monitor() if(alarm_monitor) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 0ab6191ec8c..11c41dca7ca 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -1,8 +1,6 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - //Circuit boards are in /code/game/objects/items/weapons/circuitboards/machinery/ - -/obj/machinery/constructable_frame //Made into a seperate type to make future revisions easier. +///Made into a seperate type to make future revisions easier. +/obj/machinery/constructable_frame name = "machine frame" icon = 'icons/obj/items/stock_parts/stock_parts.dmi' icon_state = "box_0" @@ -11,9 +9,10 @@ use_power = POWER_USE_OFF uncreated_component_parts = null construct_state = /decl/machine_construction/frame/unwrenched + obj_flags = OBJ_FLAG_ROTATABLE + atom_flags = ATOM_FLAG_CLIMBABLE var/obj/item/stock_parts/circuitboard/circuit = null var/expected_machine_type - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE /obj/machinery/constructable_frame/state_transition(decl/machine_construction/new_state) . = ..() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 6be155fe9ad..858a29659b9 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -16,7 +16,7 @@ density = FALSE interact_offline = 1 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':32}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-24}, "SOUTH":{"y":32}, "EAST":{"x":-24}, "WEST":{"x":24}}' //Used for logging people entering cryosleep and important items they are carrying. var/list/frozen_crew = list() @@ -119,12 +119,12 @@ /obj/item/stock_parts/circuitboard/cryopodcontrol name = "circuit board (Cryogenic Oversight Console)" build_path = /obj/machinery/computer/cryopod - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' /obj/item/stock_parts/circuitboard/robotstoragecontrol name = "circuit board (Robotic Storage Console)" build_path = /obj/machinery/computer/cryopod/robot - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' //Decorative structures to go alongside cryopods. /obj/structure/cryofeed @@ -189,7 +189,7 @@ icon_state = "redpod0" base_icon_state = "redpod0" occupied_icon_state = "redpod1" - var/launched = 0 + var/launched = FALSE var/datum/gas_mixture/airtank /obj/machinery/cryopod/lifepod/Initialize() @@ -203,7 +203,7 @@ return airtank /obj/machinery/cryopod/lifepod/proc/launch() - launched = 1 + launched = TRUE for(var/d in global.cardinal) var/turf/T = get_step(src,d) var/obj/machinery/door/blast/B = locate() in T @@ -212,13 +212,17 @@ break var/newz - if(prob(10)) + if(prob(90)) var/list/possible_locations var/obj/effect/overmap/visitable/O = global.overmap_sectors[num2text(z)] if(istype(O)) for(var/obj/effect/overmap/visitable/OO in range(O,2)) if((OO.sector_flags & OVERMAP_SECTOR_IN_SPACE) || istype(OO,/obj/effect/overmap/visitable/sector/planetoid)) - LAZYDISTINCTADD(possible_locations, text2num(level)) + // Don't try to escape to the place we just launched from + if(OO == O) + continue + var/datum/level_data/data = OO.get_topmost_level_data() + LAZYDISTINCTADD(possible_locations, text2num(data.level_z)) if(length(possible_locations)) newz = pick(possible_locations) if(!newz) @@ -255,7 +259,7 @@ if(!control_computer) control_computer = locate(/obj/machinery/computer/cryopod) in get_area(src) if(control_computer) - events_repository.register(/decl/observ/destroyed, control_computer, src, .proc/clear_control_computer) + events_repository.register(/decl/observ/destroyed, control_computer, src, PROC_REF(clear_control_computer)) return control_computer /obj/machinery/cryopod/proc/clear_control_computer() @@ -310,14 +314,14 @@ // Also make sure there is a valid control computer /obj/machinery/cryopod/robot/despawn_occupant() var/mob/living/silicon/robot/R = occupant - if(!istype(R)) return ..() - - qdel(R.mmi) - for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc - for(var/obj/item/O in I.get_contained_external_atoms()) // the things inside the tools, if anything; mainly for janiborg trash bags - O.forceMove(R) - qdel(I) - qdel(R.module) + if(istype(R)) + R.clear_brain() + if(R.module) + for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc + for(var/obj/item/O in I.get_contained_external_atoms()) // the things inside the tools, if anything; mainly for janiborg trash bags + O.forceMove(R) + qdel(I) + qdel(R.module) . = ..() @@ -421,7 +425,7 @@ src.add_fingerprint(target) //Like grap-put, but for mouse-drop. -/obj/machinery/cryopod/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/machinery/cryopod/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && check_occupant_allowed(dropping)) if(occupant) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 7c8562179a7..a83beb7a1cb 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -12,8 +12,7 @@ anchored = FALSE density = TRUE icon_state = "barrier0" - var/health = 100.0 - var/maxhealth = 100.0 + max_health = 100 var/locked = 0.0 /obj/machinery/deployable/barrier/Initialize() @@ -39,8 +38,8 @@ return return else if(IS_WRENCH(W)) - if (src.health < src.maxhealth) - src.health = src.maxhealth + if (src.health < src.max_health) + src.health = src.max_health src.emagged = 0 src.req_access = list(access_security) visible_message("[user] repairs \the [src]!") @@ -57,7 +56,6 @@ src.health -= W.force * 0.75 if(BRUTE) src.health -= W.force * 0.5 - else if (src.health <= 0) src.explode() ..() diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index 60fd6d4c053..c11d60b6718 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -14,6 +14,7 @@ construct_state = /decl/machine_construction/default/panel_closed/door uncreated_component_parts = null required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES + max_health = 300 var/can_open_manually = TRUE @@ -26,8 +27,6 @@ var/glass = 0 var/normalspeed = 1 var/heat_proof = 0 // For glass airlocks/opacity firedoors - var/maxhealth = 300 - var/health var/destroy_hits = 10 //How many strong hits it takes to destroy the door var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon @@ -50,6 +49,9 @@ atmos_canpass = CANPASS_PROC var/set_dir_on_update = TRUE + var/begins_closed = TRUE + var/icon_state_open = "door0" + var/icon_state_closed = "door1" /obj/machinery/door/proc/can_operate(var/mob/user) . = istype(user) && !user.restrained() && (!issmall(user) || ishuman(user) || issilicon(user) || isbot(user)) @@ -68,7 +70,14 @@ /obj/machinery/door/Initialize(var/mapload, var/d, var/populate_parts = TRUE, var/obj/structure/door_assembly/assembly = null) if(!populate_parts) inherit_from_assembly(assembly) - set_extension(src, /datum/extension/penetration, /datum/extension/penetration/proc_call, .proc/CheckPenetration) + set_extension(src, /datum/extension/penetration, /datum/extension/penetration/proc_call, PROC_REF(CheckPenetration)) + + if(!begins_closed) + icon_state = icon_state_open + set_density(FALSE) + set_opacity(FALSE) + layer = open_layer + ..() . = INITIALIZE_HINT_LATELOAD @@ -83,7 +92,7 @@ if (turf_hand_priority) set_extension(src, /datum/extension/turf_hand, turf_hand_priority) - health = maxhealth + health = max_health #ifdef UNIT_TEST if(autoset_access && length(req_access)) PRINT_STACK_TRACE("A door with mapped access restrictions was set to autoinitialize access.") @@ -120,7 +129,7 @@ if(close_door_at && world.time >= close_door_at) if(autoclose) close_door_at = next_close_time() - INVOKE_ASYNC(src, /obj/machinery/door/proc/close) + INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/machinery/door, close)) else close_door_at = 0 @@ -244,7 +253,7 @@ if(reason_broken & MACHINE_BROKEN_GENERIC) to_chat(user, "It looks like \the [src] is pretty busted. It's going to need more than just patching up now.") return TRUE - if(health >= maxhealth) + if(health >= max_health) to_chat(user, "Nothing to fix!") return TRUE if(!density) @@ -252,7 +261,7 @@ return TRUE //figure out how much metal we need - var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT + var/amount_needed = (max_health - health) / DOOR_REPAIR_AMOUNT amount_needed = CEILING(amount_needed) var/obj/item/stack/stack = I @@ -284,7 +293,7 @@ playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 5 * repairing.amount, src) && welder && welder.isOn()) to_chat(user, "You finish repairing the damage to \the [src].") - health = clamp(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth) + health = clamp(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, max_health) update_icon() qdel(repairing) repairing = null @@ -339,11 +348,11 @@ if(health <= 0 && initialhealth > 0) visible_message(SPAN_WARNING("\The [src] breaks down!")) set_broken(TRUE) - else if(health < maxhealth / 4 && initialhealth >= maxhealth / 4) + else if(health < max_health / 4 && initialhealth >= max_health / 4) visible_message(SPAN_WARNING("\The [src] looks like it's about to break!")) - else if(health < maxhealth / 2 && initialhealth >= maxhealth / 2) + else if(health < max_health / 2 && initialhealth >= max_health / 2) visible_message(SPAN_WARNING("\The [src] looks seriously damaged!")) - else if(health < maxhealth * 3/4 && initialhealth >= maxhealth * 3/4) + else if(health < max_health * 3/4 && initialhealth >= max_health * 3/4) visible_message(SPAN_WARNING("\The [src] shows signs of damage!")) ..(component_damage, damtype) @@ -351,21 +360,21 @@ //How much damage should be passed to components inside even when door health is non zero /obj/machinery/door/proc/get_damage_leakthrough(var/damage, damtype=BRUTE) - if(health > 0.75 * maxhealth && damage < 10) + if(health > 0.75 * max_health && damage < 10) return 0 - . = round((1 - health/maxhealth) * damage) + . = round((1 - health/max_health) * damage) /obj/machinery/door/examine(mob/user) . = ..() if(src.health <= 0) to_chat(user, "\The [src] is broken!") - else if(src.health < src.maxhealth / 4) + else if(src.health < src.max_health / 4) to_chat(user, "\The [src] looks like it's about to break!") - else if(src.health < src.maxhealth / 2) + else if(src.health < src.max_health / 2) to_chat(user, "\The [src] looks seriously damaged!") - else if(src.health < src.maxhealth * 3/4) + else if(src.health < src.max_health * 3/4) to_chat(user, "\The [src] shows signs of damage!") - else if(src.health < src.maxhealth && get_dist(src, user) <= 1) + else if(src.health < src.max_health && get_dist(src, user) <= 1) to_chat(user, "\The [src] has some minor scuffing.") var/mob/living/carbon/human/H = user @@ -379,9 +388,9 @@ /obj/machinery/door/on_update_icon() if(density) - icon_state = "door1" + icon_state = icon_state_closed else - icon_state = "door0" + icon_state = icon_state_open SSradiation.resistance_cache.Remove(get_turf(src)) @@ -412,7 +421,7 @@ operating = 1 do_animate("opening") - icon_state = "door0" + icon_state = icon_state_open set_opacity(FALSE) sleep(0.5 SECONDS) @@ -492,7 +501,7 @@ dismantle(TRUE) /obj/machinery/door/proc/CheckPenetration(var/base_chance, var/damage) - . = damage/maxhealth*180 + . = damage/max_health*180 if(glass) . *= 2 . = round(.) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 790e7a1a30e..63a74398ed3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -23,6 +23,9 @@ var/global/list/airlock_overlays = list() base_type = /obj/machinery/door/airlock frame_type = /obj/structure/door_assembly + icon_state_open = "open" + icon_state_closed = "closed" + var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = 0 // if 1, this door can't be hacked by the AI var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. @@ -300,15 +303,15 @@ About the new airlock wires panel: switch(state) if(0) if(density) - icon_state = "closed" + icon_state = icon_state_closed state = AIRLOCK_CLOSED else - icon_state = "open" + icon_state = icon_state_open state = AIRLOCK_OPEN if(AIRLOCK_OPEN) - icon_state = "open" + icon_state = icon_state_open if(AIRLOCK_CLOSED) - icon_state = "closed" + icon_state = icon_state_closed if(AIRLOCK_OPENING, AIRLOCK_CLOSING, AIRLOCK_EMAG, AIRLOCK_DENY) icon_state = "" @@ -397,7 +400,7 @@ About the new airlock wires panel: if(stat & BROKEN) damage_overlay = sparks_broken_file - else if(health < maxhealth * 3/4) + else if(health < max_health * 3/4) damage_overlay = sparks_damaged_file if(welded) @@ -764,7 +767,7 @@ About the new airlock wires panel: return TRUE else if(!repairing) // Add some minor damage as evidence of forcing. - if(health >= maxhealth) + if(health >= max_health) take_damage(1) if(arePowerSystemsOn()) to_chat(user, SPAN_WARNING("The airlock's motors resist your efforts to force it.")) @@ -986,6 +989,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/Initialize(var/mapload, var/d, var/populate_parts = TRUE, obj/structure/door_assembly/assembly = null) . = ..() + //wires var/turf/T = get_turf(loc) if(T && isAdminLevel(T.z)) @@ -1003,6 +1007,8 @@ About the new airlock wires panel: if(brace.electronics) brace.req_access = get_req_access() queue_icon_update() + else if(!begins_closed) + queue_icon_update() if (glass) paintable |= PAINT_WINDOW_PAINTABLE @@ -1021,7 +1027,7 @@ About the new airlock wires panel: glass = TRUE set_opacity(0) hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 + max_health = 300 explosion_resistance = 5 else door_color = mat.color diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index b34b45e145f..720b6626025 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -120,7 +120,7 @@ base_type = /obj/machinery/airlock_sensor/buildable construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button/airlock_controller_config/airlock_sensor - directional_offset = "{'NORTH':{'y':-18}, 'SOUTH':{'y':24}, 'EAST':{'x':-22}, 'WEST':{'x':22}}" + directional_offset = @'{"NORTH":{"y":-18}, "SOUTH":{"y":24}, "EAST":{"x":-22}, "WEST":{"x":22}}' var/alert = FALSE var/master_cycling = FALSE var/pressure @@ -257,7 +257,7 @@ /obj/item/stock_parts/radio/transmitter/on_event/buildable, /obj/item/stock_parts/radio/receiver/buildable, ) - directional_offset = "{'NORTH':{'y':-22}, 'SOUTH':{'y':24}, 'EAST':{'x':-20}, 'WEST':{'x':20}}" + directional_offset = @'{"NORTH":{"y":-22}, "SOUTH":{"y":24}, "EAST":{"x":-20}, "WEST":{"x":20}}' frame_type = /obj/item/frame/button/airlock_controller_config/access base_type = /obj/machinery/button/access/buildable var/command = "cycle" diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 08c9dc58434..6533978f852 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -18,7 +18,7 @@ /obj/item/stock_parts/circuitboard/airlock_electronics/secure name = "secure airlock electronics" desc = "designed to be somewhat more resistant to hacking than standard electronics." - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' secure = TRUE /obj/item/stock_parts/circuitboard/airlock_electronics/windoor diff --git a/code/game/machinery/doors/airlock_subtypes.dm b/code/game/machinery/doors/airlock_subtypes.dm index 9be22784a4e..179b0d35d2c 100644 --- a/code/game/machinery/doors/airlock_subtypes.dm +++ b/code/game/machinery/doors/airlock_subtypes.dm @@ -18,6 +18,10 @@ door_color = COLOR_WHITE stripe_color = COLOR_DEEP_SKY_BLUE +/obj/machinery/door/airlock/medical/open + icon_state = "open" + begins_closed = FALSE + /obj/machinery/door/airlock/virology door_color = COLOR_WHITE stripe_color = COLOR_GREEN @@ -63,7 +67,7 @@ name = "Glass Airlock" icon_state = "preview_glass" hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 + max_health = 300 explosion_resistance = 5 opacity = FALSE glass = TRUE @@ -145,6 +149,10 @@ /decl/stock_part_preset/radio/event_transmitter/airlock/external_air = 1 ) +/obj/machinery/door/airlock/external/open + icon_state = "open" + begins_closed = FALSE + /obj/machinery/door/airlock/external/get_auto_access() . = ..() var/area/A = get_area(src) @@ -185,7 +193,7 @@ opacity = FALSE /obj/machinery/door/airlock/external/glass - maxhealth = 300 + max_health = 300 explosion_resistance = 5 opacity = FALSE glass = TRUE diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 2e0480e9550..816648c4dfc 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -15,9 +15,9 @@ can_open_manually = FALSE // Icon states for different shutter types. Simply change this instead of rewriting the update_icon proc. - var/icon_state_open = null + icon_state_open = null + icon_state_closed = null var/icon_state_opening = null - var/icon_state_closed = null var/icon_state_closing = null var/icon_state_open_broken = null @@ -36,7 +36,6 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 - var/begins_closed = TRUE var/decl/material/implicit_material autoset_access = FALSE // Uses different system with buttons. pry_mod = 1.35 @@ -55,15 +54,8 @@ base_type = /obj/machinery/door/blast /obj/machinery/door/blast/Initialize() - . = ..() - - if(!begins_closed) - icon_state = icon_state_open - set_density(0) - set_opacity(0) - layer = open_layer - implicit_material = GET_DECL(/decl/material/solid/metal/plasteel) + . = ..() /obj/machinery/door/blast/examine(mob/user) . = ..() @@ -166,7 +158,7 @@ to_chat(user, "[src]'s motors resist your effort.") return if(istype(C, /obj/item/stack/material) && C.get_material_type() == /decl/material/solid/metal/plasteel) - var/amt = CEILING((maxhealth - health)/150) + var/amt = CEILING((max_health - health)/150) if(!amt) to_chat(user, "\The [src] is already fully functional.") return @@ -195,7 +187,7 @@ force_open() if(autoclose) - addtimer(CALLBACK(src, .proc/close), 15 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(close)), 15 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) return TRUE @@ -217,7 +209,7 @@ // Parameters: None // Description: Fully repairs the blast door. /obj/machinery/door/blast/proc/repair() - health = maxhealth + health = max_health set_broken(FALSE) queue_icon_update() @@ -320,7 +312,7 @@ icon_state_closed_broken = "closed_broken" min_force = 30 - maxhealth = 1000 + max_health = 1000 block_air_zones = 1 var/icon_lower_door_open = "open_bottom" @@ -362,7 +354,7 @@ open_sound = 'sound/machines/shutters_open.ogg' close_sound = 'sound/machines/shutters_close.ogg' min_force = 15 - maxhealth = 500 + max_health = 500 explosion_resistance = 10 pry_mod = 0.55 frame_type = /obj/structure/door_assembly/blast/shutter diff --git a/code/game/machinery/doors/braces.dm b/code/game/machinery/doors/braces.dm index c6ba9a1d39a..64de3129086 100644 --- a/code/game/machinery/doors/braces.dm +++ b/code/game/machinery/doors/braces.dm @@ -9,7 +9,7 @@ attack_cooldown = 2.5*DEFAULT_WEAPON_COOLDOWN melee_accuracy_bonus = -25 material = /decl/material/solid/metal/steel - origin_tech = "{'engineering':3,'materials':2}" + origin_tech = @'{"engineering":3,"materials":2}' // BRACE - Can be installed on airlock to reinforce it and keep it closed. /obj/item/airlock_brace @@ -21,7 +21,7 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) material_health_multiplier = 0.6 - origin_tech = "{'engineering':3,'materials':2}" + origin_tech = @'{"engineering":3,"materials":2}' var/obj/machinery/door/airlock/airlock = null var/obj/item/stock_parts/circuitboard/airlock_electronics/brace/electronics diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 6ca2897554c..5cf073d173f 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -5,18 +5,19 @@ icon_state = "left" min_force = 4 hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 150 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file + max_health = 150 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file health = 150 visible = 0.0 use_power = POWER_USE_OFF stat_immune = NOSCREEN | NOINPUT | NOPOWER uncreated_component_parts = null - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CHECKS_BORDER + atom_flags = ATOM_FLAG_CHECKS_BORDER opacity = FALSE explosion_resistance = 5 pry_mod = 0.5 base_type = /obj/machinery/door/window frame_type = /obj/structure/windoor_assembly + set_dir_on_update = FALSE // these can properly face all 4 directions! don't force us into just 2! var/base_state = "left" /obj/machinery/door/window/get_auto_access() @@ -61,7 +62,7 @@ if(istype(bot)) if(density && src.check_access(bot.botcard)) open() - addtimer(CALLBACK(src, .proc/close), 50, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(close)), 50, TIMER_UNIQUE | TIMER_OVERRIDE) return var/mob/M = AM // we've returned by here if M is not a mob if (src.operating) @@ -73,7 +74,7 @@ open_timer = 50 else //secure doors close faster open_timer = 20 - addtimer(CALLBACK(src, .proc/close), open_timer, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(close)), open_timer, TIMER_UNIQUE | TIMER_OVERRIDE) return /obj/machinery/door/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -160,7 +161,7 @@ to_chat(user, SPAN_NOTICE("You short out \the [src]'s internal circuitry, locking it open!")) if (density) flick("[base_state]spark", src) - addtimer(CALLBACK(src, .proc/open), 6, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(open)), 6, TIMER_UNIQUE | TIMER_OVERRIDE) return TRUE /obj/machinery/door/emp_act(severity) @@ -212,7 +213,7 @@ icon = 'icons/obj/doors/windoor.dmi' icon_state = "leftsecure" base_state = "leftsecure" - maxhealth = 300 + max_health = 300 health = 300.0 //Stronger doors for prison (regular window door health is 150) pry_mod = 0.65 diff --git a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm index 4f9b4783cac..019b728bb15 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm @@ -6,11 +6,10 @@ icon_state = "airlock_control_off" layer = ABOVE_OBJ_LAYER obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - unacidable = TRUE base_type = /obj/machinery/dummy_airlock_controller construct_state = /decl/machine_construction/wall_frame/panel_closed frame_type = /obj/item/frame/button/airlock_controller - directional_offset = "{'NORTH':{'y':-22}, 'SOUTH':{'y':24}, 'EAST':{'x':-22}, 'WEST':{'x':22}}" + directional_offset = @'{"NORTH":{"y":-22}, "SOUTH":{"y":24}, "EAST":{"x":-22}, "WEST":{"x":22}}' power_channel = ENVIRON //Same as airlock controller required_interaction_dexterity = DEXTERITY_TOUCHSCREENS ///Topic state used to interact remotely with the master controller's UI diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index 5591bf7de1a..bf79f9c8bc9 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -9,7 +9,7 @@ #define TARGET_INOPEN -1 #define TARGET_OUTOPEN -2 -#define SENSOR_TOLERANCE 1 +#define SENSOR_TOLERANCE 0.5 /datum/computer/file/embedded_program/airlock var/tag_exterior_door @@ -234,7 +234,7 @@ signalPump(tag_airpump, 1, 0, target_pressure) //send a signal to start depressurizing else signalPump(tag_pump_out_internal, 1, 0, target_pressure) // if going inside, pump external air out of the airlock - signalPump(tag_pump_out_external, 1, 1, 1000) // make sure the air is actually going outside + signalPump(tag_pump_out_external, 1, 1, MAX_PUMP_PRESSURE) // make sure the air is actually going outside else if(chamber_pressure <= target_pressure) state = STATE_PRESSURIZE diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 2f4665f3bd2..3b4e2b99835 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -50,12 +50,11 @@ icon_state = "airlock_control_off" power_channel = ENVIRON density = FALSE - unacidable = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED construct_state = /decl/machine_construction/wall_frame/panel_closed frame_type = /obj/item/frame/button/airlock_controller base_type = /obj/machinery/embedded_controller/radio/simple_docking_controller - directional_offset = "{'NORTH':{'y':-22}, 'SOUTH':{'y':24}, 'EAST':{'x':-22}, 'WEST':{'x':22}}" + directional_offset = @'{"NORTH":{"y":-22}, "SOUTH":{"y":24}, "EAST":{"x":-22}, "WEST":{"x":22}}' required_interaction_dexterity = DEXTERITY_TOUCHSCREENS var/frequency = EXTERNAL_AIR_FREQ ///Icon state of the screen used by dummy controllers to match the same state diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 2083647f803..a67c77c795f 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -5,7 +5,7 @@ desc = "A wall-mounted flashbulb device." icon = 'icons/obj/machines/flash_mounted.dmi' icon_state = "mflash1" - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED var/range = 2 //this is roughly the size of brig cell var/disable = 0 @@ -78,10 +78,12 @@ flash_time = round(H.getFlashMod() * flash_time) if(flash_time <= 0) return - var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, H.get_bodytype().vision_organ) - if(E && E.is_bruised() && prob(E.damage + 50)) - H.flash_eyes() - E.damage += rand(1, 5) + var/vision_organ = H.get_bodytype()?.vision_organ + if(vision_organ) + var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, vision_organ) + if(E && E.is_bruised() && prob(E.damage + 50)) + H.flash_eyes() + E.damage += rand(1, 5) if(!O.is_blind()) do_flash(O, flash_time) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 575f05c6e24..bcb38a699ea 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -30,17 +30,17 @@ Possible to do for anyone motivated enough: #define AREA_BASED 6 var/global/const/HOLOPAD_MODE = RANGE_BASED +var/global/list/holopads = list() /obj/machinery/hologram/holopad name = "\improper holopad" desc = "It's a floor-mounted device for projecting holographic images." icon = 'icons/obj/machines/holopad.dmi' icon_state = "holopad-B0" - layer = ABOVE_TILE_LAYER + idle_power_usage = 5 var/power_per_hologram = 500 //per usage per hologram - idle_power_usage = 5 var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn @@ -58,10 +58,24 @@ var/global/const/HOLOPAD_MODE = RANGE_BASED var/allow_ai = TRUE var/static/list/reachable_overmaps = list(OVERMAP_ID_SPACE) + var/holopad_id + /obj/machinery/hologram/holopad/Initialize() . = ..() - var/area/A = get_area(src) - desc = "It's a floor-mounted device for projecting holographic images. Its ID is '[A.proper_name]'" + + // Null ID means we want to use our area name. + global.holopads += src + if(isnull(holopad_id)) + var/area/A = get_area(src) + holopad_id = A?.proper_name || "Unknown" + + // For overmap sites, always tag the sector name so we have a unique discriminator for long range calls. + var/obj/effect/overmap/visitable/sector = global.overmap_sectors[num2text(z)] + if(sector) + holopad_id = "[sector.name] - [holopad_id]" + + // Update our desc. + desc = "It's a floor-mounted device for projecting holographic images. Its ID is '[holopad_id]'" /obj/machinery/hologram/holopad/interface_interact(var/mob/living/carbon/human/user) //Carn: Hologram requests. if(!CanInteract(user, DefaultTopicState())) @@ -92,12 +106,11 @@ var/global/const/HOLOPAD_MODE = RANGE_BASED if(last_request + 200 < world.time) //don't spam the AI with requests you jerk! last_request = world.time to_chat(user, "You request an AI's presence.") - var/area/area = get_area(src) for(var/mob/living/silicon/ai/AI in global.living_mob_list_) if(!AI.client) continue if (holopadType != HOLOPAD_LONG_RANGE && !SSmapping.are_connected_levels(AI.z, src.z)) continue - to_chat(AI, "Your presence is requested at \the [area.proper_name].") + to_chat(AI, "Your presence is requested at \the [holopad_id].") else to_chat(user, "A request for AI presence was already sent recently.") if("Holocomms") @@ -116,11 +129,10 @@ var/global/const/HOLOPAD_MODE = RANGE_BASED zlevels_long |= O.map_z for(var/obj/machinery/hologram/holopad/H in SSmachines.machinery) if (H.operable()) - var/area/A = get_area(H) if(H.z in zlevels) - holopadlist["[A.proper_name]"] = H //Define a list and fill it with the area of every holopad in the world + holopadlist["[H.holopad_id]"] = H //Define a list and fill it with the area of every holopad in the world if (H.holopadType == HOLOPAD_LONG_RANGE && (H.z in zlevels_long)) - holopadlist["[A.proper_name]"] = H + holopadlist["[H.holopad_id]"] = H holopadlist = sortTim(holopadlist, /proc/cmp_text_asc) var/temppad = input(user, "Which holopad would you like to contact?", "holopad list") as null|anything in holopadlist targetpad = holopadlist["[temppad]"] @@ -143,10 +155,8 @@ var/global/const/HOLOPAD_MODE = RANGE_BASED targetpad.incoming_connection = 1 playsound(targetpad.loc, 'sound/machines/chime.ogg', 25, 5) targetpad.icon_state = "[targetpad.base_icon]1" - var/area/our_area = get_area(src) - var/area/target_area = get_area(targetpad) - targetpad.audible_message("\The [src] announces, \"Incoming communications request from [our_area.proper_name].\"") - to_chat(user, "Trying to establish a connection to the holopad in [target_area.proper_name]... Please await confirmation from recipient.") + targetpad.audible_message("\The [src] announces, \"Incoming communications request from [holopad_id].\"") + to_chat(user, "Trying to establish a connection to the holopad in [targetpad.holopad_id]... Please await confirmation from recipient.") /obj/machinery/hologram/holopad/proc/take_call(mob/living/carbon/user) @@ -155,9 +165,7 @@ var/global/const/HOLOPAD_MODE = RANGE_BASED caller_id.reset_view(src) if(!masters[caller_id])//If there is no hologram, possibly make one. activate_holocall(caller_id) - var/area/source_area = get_area(sourcepad) - var/area/our_area = get_area(src) - log_admin("[key_name(caller_id)] just established a holopad connection from [source_area.proper_name] to [our_area.proper_name]") + log_admin("[key_name(caller_id)] just established a holopad connection from [sourcepad.holopad_id] to [holopad_id]") /obj/machinery/hologram/holopad/proc/end_call(mob/user) if(!caller_id) @@ -387,6 +395,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ //Destruction procs. /obj/machinery/hologram/holopad/Destroy() + global.holopads -= src for (var/mob/living/master in masters) clear_holo(master) return ..() diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 61011c1e5b3..cf19d95e2e1 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -9,7 +9,7 @@ active_power_usage = 70 anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' var/lit = 0 var/on_icon = "sign_on" diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 09a65b80873..3963ca07fef 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -106,7 +106,7 @@ construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button/sparker base_type = /obj/machinery/sparker/buildable - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' /obj/machinery/sparker/buildable uncreated_component_parts = null diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm b/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm index 7f279bd0561..0fa404f0f5e 100644 --- a/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm +++ b/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm @@ -6,6 +6,7 @@ nutriment_amt = 5 bitesize = 2 filling_color = COLOR_BROWN + abstract_type = /obj/item/chems/food/variable /obj/item/chems/food/variable/Initialize() . = ..() diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 0350d3a4998..e32cd017caa 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -89,7 +89,7 @@ else return ..() -/obj/machinery/gibber/receive_mouse_drop(atom/dropping, mob/user) +/obj/machinery/gibber/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && ismob(dropping)) move_into_gibber(user, dropping) @@ -167,7 +167,7 @@ admin_attack_log(user, occupant, "Gibbed the victim", "Was gibbed", "gibbed") src.occupant.ghostize() - addtimer(CALLBACK(src, .proc/finish_gibbing), gib_time) + addtimer(CALLBACK(src, PROC_REF(finish_gibbing)), gib_time) var/list/gib_products = occupant.harvest_meat() | occupant.harvest_skin() | occupant.harvest_bones() if(!length(gib_products)) diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 77dac3c22fc..9de4adb432c 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -16,7 +16,7 @@ icon_state = "icecream_vat" density = TRUE anchored = FALSE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE | ATOM_FLAG_OPEN_CONTAINER idle_power_usage = 100 var/list/product_types = list() diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 9549a1f06c4..73fd90ec834 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -7,7 +7,7 @@ anchored = TRUE idle_power_usage = 5 active_power_usage = 100 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE | ATOM_FLAG_OPEN_CONTAINER construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 @@ -75,7 +75,7 @@ broken = 0 // Fix it! dirty = 0 // just to be sure update_icon() - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER else to_chat(user, SPAN_WARNING("It's broken!")) return 1 @@ -96,7 +96,7 @@ dirty = 0 // It's clean! broken = 0 // just to be sure update_icon() - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER else //Otherwise bad luck!! to_chat(user, SPAN_WARNING("It's dirty!")) return 1 @@ -298,7 +298,7 @@ update_use_power(POWER_USE_ACTIVE) START_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF) - addtimer(CALLBACK(src, .proc/half_time_process), cook_time / 2) + addtimer(CALLBACK(src, PROC_REF(half_time_process)), cook_time / 2) visible_message(SPAN_NOTICE("[src] turns on."), SPAN_NOTICE("You hear a microwave.")) if(cook_dirty) @@ -350,7 +350,7 @@ SSnano.update_uis(src) /obj/machinery/microwave/on_reagent_change() - . = ..() + ..() if(!operating) SSnano.update_uis(src) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index c1609d5002f..36a38d6f20b 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -10,7 +10,7 @@ anchored = TRUE idle_power_usage = 5 active_power_usage = 100 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE obj_flags = OBJ_FLAG_ANCHORABLE | OBJ_FLAG_ROTATABLE atmos_canpass = CANPASS_NEVER required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES @@ -71,14 +71,28 @@ initial_access = list(list(access_medical, access_chemistry)) /obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O) - if(istype(O,/obj/item/chems/glass/)) + if(istype(O,/obj/item/chems/glass)) return 1 - if(istype(O,/obj/item/storage/pill_bottle/)) + if(istype(O,/obj/item/storage/pill_bottle)) return 1 - if(istype(O,/obj/item/chems/pill/)) + if(istype(O,/obj/item/chems/pill)) return 1 return 0 +/obj/machinery/smartfridge/produce + name = "produce smartfridge" + desc = "A refrigerated storage unit for fruits and vegetables." + +/obj/machinery/smartfridge/produce/accept_check(var/obj/item/O) + return istype(O, /obj/item/grown) || istype(O, /obj/item/chems/food/grown) + +/obj/machinery/smartfridge/sheets + name = "raw material storage" + desc = "A storage unit for bundles of material sheets, ingots and other shapes." + +/obj/machinery/smartfridge/sheets/accept_check(var/obj/item/O) + return istype(O, /obj/item/stack/material) + /obj/machinery/smartfridge/chemistry name = "\improper Smart Chemical Storage" desc = "A refrigerated storage unit for medicine and chemical storage." @@ -121,7 +135,7 @@ var/obj/item/chems/food/S = O return !!S.dried_type else if(istype(O, /obj/item/stack/material)) - return istype(O.material, /decl/material/solid/skin) + return istype(O.material, /decl/material/solid/organic/skin) return 0 /obj/machinery/smartfridge/drying_rack/Process() @@ -163,9 +177,9 @@ else if(istype(thing, /obj/item/stack/material)) var/obj/item/stack/material/skin = thing - if(!istype(skin.material, /decl/material/solid/skin)) + if(!istype(skin.material, /decl/material/solid/organic/skin)) continue - var/decl/material/solid/skin/skin_mat = skin.material + var/decl/material/solid/organic/skin/skin_mat = skin.material if(!skin_mat.tans_to) continue for(var/atom/item_to_stock in SSmaterials.create_object(skin_mat.tans_to, get_turf(src), skin.amount)) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index f574381e6c5..33a1bb173c2 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -24,7 +24,7 @@ /obj/item/stock_parts/power/apc ) base_type = /obj/machinery/light_switch - directional_offset = "{'NORTH':{'y':-20}, 'SOUTH':{'y':25}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-20}, "SOUTH":{"y":25}, "EAST":{"x":-24}, "WEST":{"x":24}}' /obj/machinery/light_switch/on on = TRUE diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index aada56e1b62..e7aa1f660e4 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -12,7 +12,7 @@ var/global/list/magnetic_modules = list() icon_state = "floor_magnet-f" name = "Electromagnetic Generator" desc = "A device that uses powernet to create points of magnetic energy." - level = 1 // underfloor + level = LEVEL_BELOW_PLATING layer = ABOVE_WIRE_LAYER anchored = TRUE idle_power_usage = 50 diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index f817303504d..bd9e8be6936 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -18,14 +18,15 @@ var/repair_power_usage = 10 KILOWATTS // Per 1 HP of health. var/repair = 0 -/obj/machinery/mech_recharger/Crossed(var/mob/living/exosuit/M) +/obj/machinery/mech_recharger/Crossed(atom/movable/AM) . = ..() - if(istype(M) && charging != M) - start_charging(M) + if(istype(AM, /mob/living/exosuit) && charging != AM) + start_charging(AM) -/obj/machinery/mech_recharger/Uncrossed(var/mob/living/exosuit/M) +/obj/machinery/mech_recharger/Uncrossed(atom/movable/AM) . = ..() - if(M == charging) + var/mob/living/exosuit/M = AM + if(istype(M) && M == charging) stop_charging() /obj/machinery/mech_recharger/RefreshParts() @@ -67,14 +68,17 @@ var/remaining_energy = active_power_usage if(repair && !fully_repaired()) + var/repaired = FALSE for(var/obj/item/mech_component/MC in charging) if(MC) MC.repair_brute_damage(repair) MC.repair_burn_damage(repair) remaining_energy -= repair * repair_power_usage + repaired = TRUE if(remaining_energy <= 0) break - charging.updatehealth() + if(repaired) + charging.update_health() // TODO: do this during component repair. if(fully_repaired()) charging.show_message(SPAN_NOTICE("Exosuit integrity has been fully restored.")) @@ -89,7 +93,7 @@ // An ugly proc, but apparently mechs don't have maxhealth var of any kind. /obj/machinery/mech_recharger/proc/fully_repaired() - return charging && (charging.health == charging.maxHealth) + return charging && (charging.current_health >= charging.get_max_health()) /obj/machinery/mech_recharger/proc/start_charging(var/mob/living/exosuit/M) if(stat & (NOPOWER | BROKEN)) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 18305bf725d..c216f24a31a 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -5,7 +5,7 @@ var/global/list/navbeacons = list() icon_state = "navbeacon0-f" name = "navigation beacon" desc = "A radio beacon used for bot navigation." - level = 1 + level = LEVEL_BELOW_PLATING layer = ABOVE_WIRE_LAYER anchored = TRUE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 3e03799e7d6..1ce792fa37f 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -157,7 +157,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to uncreated_component_parts = null stat_immune = 0 frame_type = /obj/item/frame/stock_offset/newscaster - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' /obj/machinery/newscaster/Initialize() . = ..() @@ -745,7 +745,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to w_class = ITEM_SIZE_SMALL //Let's make it fit in trashbags! attack_verb = list("bapped","thwapped","smacked") force = 0 - material = /decl/material/solid/cardboard //#TODO: replace with paper material + material = /decl/material/solid/organic/paper var/screen = 0 var/pages = 0 @@ -927,7 +927,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to audible_message("[src.name] beeps, \"[news_call]\"") src.alert = 1 src.update_icon() - addtimer(CALLBACK(src, .proc/reset_alert), alert_delay, TIMER_UNIQUE | TIMER_OVERRIDE) //stay alert for the full time if we get a new one + addtimer(CALLBACK(src, PROC_REF(reset_alert)), alert_delay, TIMER_UNIQUE | TIMER_OVERRIDE) //stay alert for the full time if we get a new one playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1) else audible_message("[src.name] beeps, \"Attention! Wanted issue distributed!\"") diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 2c823eae3d3..0c7d2490fe0 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -8,8 +8,8 @@ var/global/bomb_set density = TRUE use_power = POWER_USE_OFF uncreated_component_parts = null - unacidable = 1 interact_offline = TRUE + wires = /datum/wires/nuclearbomb var/deployable = 0 var/extended = 0 @@ -25,7 +25,6 @@ var/global/bomb_set var/obj/item/disk/nuclear/auth = null var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. var/lastentered - wires = /datum/wires/nuclearbomb var/decl/security_level/original_level /obj/machinery/nuclearbomb/Initialize() @@ -42,7 +41,7 @@ var/global/bomb_set timeleft = max(timeleft - (wait / 10), 0) playsound(loc, 'sound/items/timer.ogg', 50) if(timeleft <= 0) - addtimer(CALLBACK(src, .proc/explode), 0) + addtimer(CALLBACK(src, PROC_REF(explode)), 0) SSnano.update_uis(src) /obj/machinery/nuclearbomb/attackby(obj/item/O, mob/user, params) @@ -368,18 +367,18 @@ var/global/bomb_set . = ..() global.nuke_disks |= src // Can never be quite sure that a game mode has been properly initiated or not at this point, so always register - events_repository.register(/decl/observ/moved, src, src, /obj/item/disk/nuclear/proc/check_z_level) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/item/disk/nuclear, check_z_level)) /obj/item/disk/nuclear/proc/check_z_level() - if(!(istype(SSticker.mode, /datum/game_mode/nuclear))) - events_repository.unregister(/decl/observ/moved, src, src, /obj/item/disk/nuclear/proc/check_z_level) // However, when we are certain unregister if necessary + if(!(istype(SSticker.mode, /decl/game_mode/nuclear))) + events_repository.unregister(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/item/disk/nuclear, check_z_level)) // However, when we are certain unregister if necessary return var/turf/T = get_turf(src) if(!T || isNotStationLevel(T.z)) qdel(src) /obj/item/disk/nuclear/Destroy() - events_repository.unregister(/decl/observ/moved, src, src, /obj/item/disk/nuclear/proc/check_z_level) + events_repository.unregister(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/item/disk/nuclear, check_z_level)) global.nuke_disks -= src if(!length(global.nuke_disks)) var/turf/T = pick_area_turf_by_flag(AREA_FLAG_MAINTENANCE, list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects)) diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index ccd515bcfe8..2739b2fc5a3 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -21,7 +21,7 @@ power_channel = ENVIRON idle_power_usage = 10 active_power_usage = 120 // No idea what the realistic amount would be. - directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':28}, 'EAST':{'x':24}, 'WEST':{'x':-24}}" + directional_offset = @'{"NORTH":{"y":-24}, "SOUTH":{"y":28}, "EAST":{"x":24}, "WEST":{"x":-24}}' /obj/machinery/oxygen_pump/Initialize() . = ..() @@ -41,7 +41,7 @@ breather = null return ..() -/obj/machinery/oxygen_pump/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/machinery/oxygen_pump/handle_mouse_drop(atom/over, mob/user, params) if(ishuman(over) && can_apply_to_target(over, user)) user.visible_message(SPAN_NOTICE("\The [user] begins placing the mask onto \the [over]..")) if(do_mob(user, over, 25) && can_apply_to_target(over, user)) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 511bf1dd1e6..06bdc7e006e 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -13,7 +13,7 @@ Buildable meters randpixel = 5 item_state = "buildpipe" w_class = ITEM_SIZE_NORMAL - level = 2 + level = LEVEL_ABOVE_PLATING obj_flags = OBJ_FLAG_ROTATABLE dir = SOUTH material = /decl/material/solid/metal/steel diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e2349268123..4ee74cd3756 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -17,11 +17,10 @@ idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power power_channel = EQUIP //drains power from the EQUIPMENT channel + max_health = 80 var/raised = 0 //if the turret cover is "open" and the turret is raised var/raising= 0 //if the turret is currently opening or closing its cover - var/health = 80 //the turret's health - var/maxhealth = 80 //turrets maximal health. var/auto_repair = 0 //if 1 the turret slowly repairs itself. var/locked = 1 //if the turret's behaviour control access is locked var/controllock = 0 //if the turret responds to control panels @@ -80,7 +79,7 @@ ailock = 0 malf_upgraded = 1 to_chat(user, "\The [src] has been upgraded. It's damage and rate of fire has been increased. Auto-regeneration system has been enabled. Power usage has increased.") - maxhealth = round(initial(maxhealth) * 1.5) + max_health = round(initial(max_health) * 1.5) shot_delay = round(initial(shot_delay) / 2) auto_repair = 1 change_power_consumption(round(initial(active_power_usage) * 5), POWER_USE_ACTIVE) @@ -239,7 +238,8 @@ var/global/list/turret_icons /obj/machinery/porta_turret/physically_destroyed(skip_qdel) if(installation) var/obj/item/gun/energy/Gun = new installation(loc) - Gun.power_supply.charge = gun_charge + var/obj/item/cell/power_supply = Gun.get_cell() + power_supply?.charge = gun_charge Gun.update_icon() if(prob(50)) SSmaterials.create_object(/decl/material/solid/metal/steel, loc, rand(1,4)) @@ -369,7 +369,7 @@ var/global/list/turret_icons disabled = 1 var/power = 4 - severity - addtimer(CALLBACK(src,/obj/machinery/porta_turret/proc/enable), rand(60*power,600*power)) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/porta_turret, enable)), rand(60*power,600*power)) ..() @@ -414,9 +414,9 @@ var/global/list/turret_icons if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets popDown() // no valid targets, close the cover - if(auto_repair && (health < maxhealth)) + if(auto_repair && (health < max_health)) use_power_oneoff(20000) - health = min(health+1, maxhealth) // 1HP for 20kJ + health = min(health+1, max_health) // 1HP for 20kJ /obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets) switch(assess_living(L)) @@ -703,7 +703,8 @@ var/global/list/turret_icons to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") return installation = I.type //installation becomes I.type - gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge + var/obj/item/cell/power_supply = E.get_cell() + gun_charge = power_supply?.charge || 0 //the gun's charge is stored in gun_charge to_chat(user, "You add [I] to the turret.") target_type = /obj/machinery/porta_turret @@ -809,7 +810,8 @@ var/global/list/turret_icons return TRUE build_step = 3 var/obj/item/gun/energy/Gun = new installation(loc) - Gun.power_supply.charge = gun_charge + var/obj/item/cell/power_supply = Gun.get_cell() + power_supply?.charge = gun_charge Gun.update_icon() installation = null gun_charge = 0 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index ba601e831bd..1326de26f89 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -132,4 +132,4 @@ construct_state = /decl/machine_construction/wall_frame/panel_closed frame_type = /obj/item/frame/button/wall_charger - directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':32}, 'EAST':{'x':-28}, 'WEST':{'x':28}}" \ No newline at end of file + directional_offset = @'{"NORTH":{"y":-24}, "SOUTH":{"y":32}, "EAST":{"x":-28}, "WEST":{"x":28}}' \ No newline at end of file diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index a56c44d6ec5..df55809d8f9 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -26,7 +26,7 @@ . = ..() update_icon() -/obj/machinery/recharge_station/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/machinery/recharge_station/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && isliving(dropping)) var/mob/living/M = dropping @@ -175,7 +175,7 @@ overlays = list(image(overlay_icon, overlay_state())) /obj/machinery/recharge_station/Bumped(var/mob/living/silicon/robot/R) - addtimer(CALLBACK(src, .proc/go_in, R), 1) + addtimer(CALLBACK(src, PROC_REF(go_in), R), 1) /obj/machinery/recharge_station/proc/go_in(var/mob/M) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index cbbaedff580..e4ab5b9ddc3 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -47,7 +47,7 @@ var/global/req_console_information = list() uncreated_component_parts = null construct_state = /decl/machine_construction/wall_frame/panel_closed frame_type = /obj/item/frame/stock_offset/request_console - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' /obj/machinery/network/requests_console/on_update_icon() if(stat & NOPOWER) diff --git a/code/game/machinery/self_destruct.dm b/code/game/machinery/self_destruct.dm index 62ded8fe63e..6b516eb954f 100644 --- a/code/game/machinery/self_destruct.dm +++ b/code/game/machinery/self_destruct.dm @@ -68,7 +68,7 @@ update_icon() src.add_fingerprint(user) -/obj/machinery/self_destruct/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/machinery/self_destruct/handle_mouse_drop(atom/over, mob/user, params) if(over == user && cylinder) if(armed) to_chat(user, SPAN_WARNING("Disarm the cylinder first.")) diff --git a/code/game/machinery/self_destruct_storage.dm b/code/game/machinery/self_destruct_storage.dm index 623edd2b60d..09f2e613213 100644 --- a/code/game/machinery/self_destruct_storage.dm +++ b/code/game/machinery/self_destruct_storage.dm @@ -120,7 +120,7 @@ ..() -/obj/machinery/nuclear_cylinder_storage/handle_mouse_drop(atom/over, mob/user) +/obj/machinery/nuclear_cylinder_storage/handle_mouse_drop(atom/over, mob/user, params) if(over == user && open && !panel_open && length(cylinders)) var/cylinder = cylinders[1] user.visible_message( diff --git a/code/game/machinery/slide_projector.dm b/code/game/machinery/slide_projector.dm index 6a22a23f61e..be139a5d609 100644 --- a/code/game/machinery/slide_projector.dm +++ b/code/game/machinery/slide_projector.dm @@ -58,9 +58,9 @@ /obj/item/storage/slide_projector/proc/stop_projecting() if(projection) QDEL_NULL(projection) - events_repository.unregister(/decl/observ/moved, src, src, .proc/check_projections) + events_repository.unregister(/decl/observ/moved, src, src, PROC_REF(check_projections)) update_icon() - + /obj/item/storage/slide_projector/proc/project_at(turf/target) stop_projecting() if(!current_slide) @@ -72,19 +72,19 @@ break projection = new projection_type(target) projection.set_source(current_slide) - events_repository.register(/decl/observ/moved, src, src, .proc/check_projections) + events_repository.register(/decl/observ/moved, src, src, PROC_REF(check_projections)) update_icon() /obj/item/storage/slide_projector/attack_self(mob/user) interact(user) -/obj/item/storage/slide_projector/interact(mob/user) +/obj/item/storage/slide_projector/interact(mob/user) var/data = list() if(projection) data += "Disable projector" else data += "Projector inactive" - + var/table = list("
#SLIDESHOW") var/i = 1 for(var/obj/item/I in contents) @@ -115,7 +115,7 @@ return TOPIC_HANDLED set_slide(contents[index]) . = TOPIC_REFRESH - + if(. == TOPIC_REFRESH) interact(user) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 5bf12d2ff78..48bcdae71f1 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -8,7 +8,7 @@ desc = "This heater is guaranteed not to set anything, or anyone, on fire." required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED clicksound = "switch" diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index fa3122725da..ef38a7cb371 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -18,7 +18,7 @@ anchored = TRUE density = FALSE idle_power_usage = 10 - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' var/mode = 1 // 0 = Blank // 1 = Shuttle timer // 2 = Arbitrary message(s) diff --git a/code/game/machinery/status_light.dm b/code/game/machinery/status_light.dm index 6f78761dd92..1827bfbd7bd 100644 --- a/code/game/machinery/status_light.dm +++ b/code/game/machinery/status_light.dm @@ -3,7 +3,7 @@ desc = "A status indicator for a combustion chamber, based on temperature." icon = 'icons/obj/machines/door_timer.dmi' icon_state = "doortimer-p" - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":32}, "WEST":{"x":-32}}' obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED var/frequency = 1441 var/alert_temperature = 10000 diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm index 245afe2e16e..fb7cc0aebd4 100644 --- a/code/game/machinery/suit_cycler.dm +++ b/code/game/machinery/suit_cycler.dm @@ -94,6 +94,40 @@ overlays = new_overlays +/obj/machinery/suit_cycler/proc/loaded_item_destroyed() + if(suit && QDELETED(suit)) + suit = null + . = TRUE + if(helmet && QDELETED(helmet)) + helmet = null + . = TRUE + if(boots && QDELETED(boots)) + boots = null + . = TRUE + if(.) + update_icon() + +/obj/machinery/suit_cycler/proc/set_suit(obj/item/new_suit) + if(istype(suit)) + events_repository.unregister(/decl/observ/destroyed, suit, src) + suit = new_suit + if(istype(suit)) + events_repository.register(/decl/observ/destroyed, suit, src, TYPE_PROC_REF(/obj/machinery/suit_cycler, loaded_item_destroyed)) + +/obj/machinery/suit_cycler/proc/set_helmet(obj/item/new_helmet) + if(istype(helmet)) + events_repository.unregister(/decl/observ/destroyed, helmet, src) + helmet = new_helmet + if(istype(helmet)) + events_repository.register(/decl/observ/destroyed, helmet, src, TYPE_PROC_REF(/obj/machinery/suit_cycler, loaded_item_destroyed)) + +/obj/machinery/suit_cycler/proc/set_boots(obj/item/new_boots) + if(istype(boots)) + events_repository.unregister(/decl/observ/destroyed, boots, src) + boots = new_boots + if(istype(boots)) + events_repository.register(/decl/observ/destroyed, boots, src, TYPE_PROC_REF(/obj/machinery/suit_cycler, loaded_item_destroyed)) + /obj/machinery/suit_cycler/Initialize(mapload, d=0, populate_parts = TRUE) . = ..() if(!length(available_modifications) || !length(available_bodytypes)) @@ -102,11 +136,11 @@ if(populate_parts) if(ispath(suit)) - suit = new suit(src) + set_suit(new suit(src)) if(ispath(helmet)) - helmet = new helmet(src) + set_helmet(new helmet(src)) if(ispath(boots)) - boots = new boots(src) + set_boots(new boots(src)) available_modifications = list_values(decls_repository.get_decls(available_modifications)) @@ -124,7 +158,7 @@ DROP_NULL(boots) return ..() -/obj/machinery/suit_cycler/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/machinery/suit_cycler/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && ismob(dropping) && try_move_inside(dropping, user)) return TRUE @@ -143,7 +177,7 @@ visible_message(SPAN_WARNING("\The [user] starts putting \the [target] into the suit cycler.")) if(do_after(user, 20, src)) - if(!istype(target) || locked || suit || helmet || !target.Adjacent(user) || !user.Adjacent(src) || user.incapacitated()) + if(!istype(target) || locked || suit || helmet || boots || !target.Adjacent(user) || !user.Adjacent(src) || user.incapacitated()) return FALSE target.reset_view(src) target.forceMove(src) @@ -186,7 +220,7 @@ if(!user.try_unequip(I, src)) return to_chat(user, "You fit \the [I] into the suit cycler.") - boots = I + set_boots(I) update_icon() updateUsrDialog() @@ -202,7 +236,7 @@ if(!user.try_unequip(I, src)) return to_chat(user, "You fit \the [I] into the suit cycler.") - helmet = I + set_helmet(I) update_icon() updateUsrDialog() return @@ -220,7 +254,7 @@ if(!user.try_unequip(I, src)) return to_chat(user, "You fit \the [I] into the suit cycler.") - suit = I + set_suit(I) update_icon() updateUsrDialog() return @@ -275,7 +309,7 @@ dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. Eject
" dat += "Boots: [boots ? "\the [boots]" : "no boots stored" ]. Eject" - if(can_repair && suit && istype(suit)) + if(can_repair && istype(suit)) dat += "[(suit.damage ? " Repair" : "")]" dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" @@ -297,15 +331,15 @@ if(href_list["eject_suit"]) if(!suit) return suit.dropInto(loc) - suit = null + set_suit(null) else if(href_list["eject_helmet"]) if(!helmet) return helmet.dropInto(loc) - helmet = null + set_helmet(null) else if(href_list["eject_boots"]) if(!boots) return boots.dropInto(loc) - boots = null + set_boots(null) else if(href_list["select_department"]) var/choice = input("Please select the target department paintjob.", "Suit cycler", target_modification) as null|anything in available_modifications if(choice && CanPhysicallyInteract(usr)) diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 8bac21cabd5..b9a53e07e6e 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -109,7 +109,7 @@ if(world.time >= target_drop_time) deactivate(permanent = TRUE) command_announcement.Announce("Nyx Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] recieved. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage") - addtimer(CALLBACK(src, .proc/drop_cargo), rand(20 SECONDS, 30 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(drop_cargo)), rand(20 SECONDS, 30 SECONDS)) /obj/structure/supply_beacon/proc/drop_cargo(var/drop_x, var/drop_y, var/drop_z) if(!QDELETED(src) && isturf(loc)) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index cfbad74b5df..1b3302440e9 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -60,14 +60,13 @@ var/global/list/singularity_beacons = list() if(prob(50)) temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." src.updateUsrDialog() - addtimer(CALLBACK(src, .proc/selfdestruct), rand(5, 20) SECONDS) + addtimer(CALLBACK(src, PROC_REF(selfdestruct)), rand(5, 20) SECONDS) return if(ishuman(M)) var/mob/living/carbon/human/N = M to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") var/decl/special_role/traitors = GET_DECL(/decl/special_role/traitor) traitors.add_antagonist(N.mind) - traitors.equip(N) log_and_message_admins("has accepted a traitor objective from a syndicate beacon.", M) @@ -77,7 +76,7 @@ var/global/list/singularity_beacons = list() /obj/machinery/syndicate_beacon/proc/selfdestruct() selfdestructing = 1 - INVOKE_ASYNC(GLOBAL_PROC, .proc/explosion, src.loc, 1, rand(1, 3), rand(3, 8), 10) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src.loc, 1, rand(1, 3), rand(3, 8), 10) //////////////////////////////////////// //Singularity beacon diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index da6f0f344e5..8300860c5e0 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -146,14 +146,14 @@ /obj/machinery/computer/teleporter/proc/clear_target() if(src.locked) - events_repository.unregister(/decl/observ/destroyed, locked, src, .proc/target_lost) + events_repository.unregister(/decl/observ/destroyed, locked, src, PROC_REF(target_lost)) src.locked = null if(station && station.engaged) station.disengage() /obj/machinery/computer/teleporter/proc/set_target(var/obj/O) src.locked = O - events_repository.register(/decl/observ/destroyed, locked, src, .proc/target_lost) + events_repository.register(/decl/observ/destroyed, locked, src, PROC_REF(target_lost)) /obj/machinery/computer/teleporter/Destroy() clear_target() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 53debb1bb7a..8f8665d88c7 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -14,7 +14,7 @@ anchored = TRUE density = FALSE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/enabled = 0 var/lethal = 0 var/locked = 1 @@ -202,7 +202,7 @@ else if (enabled) if (lethal) icon_state = "control_kill" - set_light(1.5, 1,"#990000") + set_light(1.5, 1,COLOR_BLOOD_RED) else icon_state = "control_stun" set_light(1.5, 1,"#ff9900") diff --git a/code/game/machinery/turrets/_turrets.dm b/code/game/machinery/turrets/_turrets.dm index bc39db32222..8e95c16fe0f 100644 --- a/code/game/machinery/turrets/_turrets.dm +++ b/code/game/machinery/turrets/_turrets.dm @@ -125,13 +125,11 @@ /obj/machinery/turret/Process() if(istype(installed_gun, /obj/item/gun/energy)) var/obj/item/gun/energy/energy_gun = installed_gun - if(energy_gun.power_supply) - var/obj/item/cell/power_cell = energy_gun.power_supply - if(!power_cell.fully_charged()) - power_cell.give(active_power_usage*CELLRATE) - update_use_power(POWER_USE_ACTIVE) - return - + var/obj/item/cell/power_supply = energy_gun.get_cell() + if(power_supply && !power_supply.fully_charged()) + power_supply.give(active_power_usage*CELLRATE) + update_use_power(POWER_USE_ACTIVE) + return update_use_power(POWER_USE_IDLE) /obj/machinery/turret/attackby(obj/item/I, mob/user) @@ -173,7 +171,7 @@ if(installed_gun && is_valid_target(target?.resolve())) var/atom/resolved_target = target.resolve() if(istype(resolved_target)) - addtimer(CALLBACK(src, .proc/fire_weapon, resolved_target), 0) + addtimer(CALLBACK(src, PROC_REF(fire_weapon), resolved_target), 0) else target = null state_machine.evaluate() @@ -381,7 +379,7 @@ to_chat(user, SPAN_WARNING("You short out \the [src]'s threat assessment circuits.")) visible_message("\The [src] hums oddly...") enabled = FALSE - addtimer(CALLBACK(src, .proc/emagged_targeting), 6 SECONDS) + addtimer(CALLBACK(src, PROC_REF(emagged_targeting)), 6 SECONDS) state_machine.evaluate() /obj/machinery/turret/proc/emagged_targeting() @@ -449,12 +447,16 @@ return TOPIC_REFRESH if(href_list["set_default"]) - var/amount = input(user, "Input an angle between [leftmost_traverse] and [rightmost_traverse] degrees. Click cancel to disable default.", "Set Default Bearing", default_bearing) as null|num + var/leftmost_default = leftmost_traverse + var/rightmost_default = rightmost_traverse + if(traverse >= 360) + leftmost_default = 0 + rightmost_default = 360 + var/amount = input(user, "Input an angle between [leftmost_default] and [rightmost_default] degrees. Click cancel to disable default.", "Set Default Bearing", default_bearing) as null|num if(isnum(amount)) - default_bearing = clamp(amount, leftmost_traverse, rightmost_traverse) + default_bearing = clamp(amount, leftmost_default, rightmost_default) else default_bearing = null - return TOPIC_REFRESH if(href_list["manual_fire"]) diff --git a/code/game/machinery/turrets/network_turret.dm b/code/game/machinery/turrets/network_turret.dm index 354aabfa800..ede8a175eef 100644 --- a/code/game/machinery/turrets/network_turret.dm +++ b/code/game/machinery/turrets/network_turret.dm @@ -144,7 +144,7 @@ name = "circuitboard (sentry turret)" board_type = "machine" build_path = /obj/machinery/turret/network - origin_tech = "{'programming':5,'combat':5,'engineering':4}" + origin_tech = @'{"programming":5,"combat":5,"engineering":4}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/scanning_module = 1, diff --git a/code/game/machinery/turrets/turret_ammo.dm b/code/game/machinery/turrets/turret_ammo.dm index c12ec98d75d..7054e5ecf23 100644 --- a/code/game/machinery/turrets/turret_ammo.dm +++ b/code/game/machinery/turrets/turret_ammo.dm @@ -3,7 +3,7 @@ desc = "A high capacity ammunition supply designed to mechanically reload magazines with bullets." icon = 'icons/obj/items/storage/ammobox.dmi' icon_state = "ammo" - origin_tech = "{'engineering':3,'combat':4}" + origin_tech = @'{"engineering":3,"combat":4}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/brass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index ad1fb149d8a..c5ecf342430 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -188,7 +188,7 @@ . = ..() SSnano.update_uis(src) -/obj/machinery/vending/receive_mouse_drop(atom/dropping, var/mob/user) +/obj/machinery/vending/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && dropping.loc == user && attempt_to_stock(dropping, user)) return TRUE @@ -360,7 +360,7 @@ use_power_oneoff(vend_power_usage) //actuators and stuff if (icon_vend) //Show the vending animation if needed flick(icon_vend,src) - addtimer(CALLBACK(src, /obj/machinery/vending/proc/finish_vending, R), vend_delay) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/vending, finish_vending), R), vend_delay) /obj/machinery/vending/proc/do_vending_reply() set waitfor = FALSE diff --git a/code/game/machinery/vending/medical.dm b/code/game/machinery/vending/medical.dm index d0bb41f6689..f0418da0f65 100644 --- a/code/game/machinery/vending/medical.dm +++ b/code/game/machinery/vending/medical.dm @@ -30,7 +30,7 @@ /obj/item/clothing/mask/chewable/candy/lolli/meds = 8, /obj/item/chems/pill/bromide = 3, /obj/item/chems/pill/stox = 4, - /obj/item/chems/pill/antitox = 6 + /obj/item/chems/pill/antitoxins = 6 ) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. @@ -54,7 +54,7 @@ /obj/item/storage/med_pouch/toxin ) contraband = list(/obj/item/chems/syringe/antitoxin = 4,/obj/item/chems/syringe/antibiotic = 4,/obj/item/chems/pill/bromide = 1) - directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':24}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-24}, "SOUTH":{"y":24}, "EAST":{"x":-24}, "WEST":{"x":24}}' obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED /obj/machinery/vending/wallmed2 @@ -77,5 +77,5 @@ /obj/item/storage/med_pouch/radiation ) contraband = list(/obj/item/chems/pill/bromide = 3, /obj/item/chems/hypospray/autoinjector/pain = 2) - directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':24}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-24}, "SOUTH":{"y":24}, "EAST":{"x":-24}, "WEST":{"x":24}}' obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED diff --git a/code/game/machinery/vending_deconstruction.dm b/code/game/machinery/vending_deconstruction.dm index 55ad2206aa0..dce7ac35a27 100644 --- a/code/game/machinery/vending_deconstruction.dm +++ b/code/game/machinery/vending_deconstruction.dm @@ -20,9 +20,9 @@ /obj/structure/vending_refill/get_mechanics_info() return "Drag to a vendor to restock. Generally can not be opened." -/obj/structure/vending_refill/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/structure/vending_refill/handle_mouse_drop(atom/over, mob/user, params) if(istype(over, /obj/machinery/vending)) - var/obj/machinery/vending/vendor = over + var/obj/machinery/vending/vendor = over var/target_type = vendor.base_type || vendor.type if(ispath(expected_type, target_type)) for(var/datum/stored_items/R in product_records) diff --git a/code/game/machinery/vitals_monitor.dm b/code/game/machinery/vitals_monitor.dm index 7378726057a..3eff63edf62 100644 --- a/code/game/machinery/vitals_monitor.dm +++ b/code/game/machinery/vitals_monitor.dm @@ -64,7 +64,7 @@ if(beep && victim && victim.get_pulse()) playsound(src, 'sound/machines/quiet_beep.ogg', 40) -/obj/machinery/vitals_monitor/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/machinery/vitals_monitor/handle_mouse_drop(atom/over, mob/user, params) if(ishuman(over)) if(victim) victim = null diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 04f043e058e..b9770839ff0 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -9,7 +9,7 @@ var/reverse = 0 //if resulting object faces opposite its dir (like light fixtures) var/fully_construct = FALSE // Results in a machine with all parts auto-installed and ready to go if TRUE; if FALSE, the machine will spawn without removable expected parts -/obj/item/frame/building_cost() +/obj/item/frame/get_contained_matter() . = ..() if(fully_construct) var/list/cost = atom_info_repository.get_matter_for(build_machine_type) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 4458535a0f7..fd2afb350cc 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -1,37 +1,169 @@ #define WASHER_STATE_CLOSED 1 -#define WASHER_STATE_FULL 2 +#define WASHER_STATE_LOADED 2 #define WASHER_STATE_RUNNING 4 #define WASHER_STATE_BLOODY 8 -// WASHER_STATE_RUNNING implies WASHER_STATE_CLOSED | WASHER_STATE_FULL +// WASHER_STATE_RUNNING implies WASHER_STATE_CLOSED | WASHER_STATE_LOADED // if you break this assumption, you must update the icon file // other states are independent. /obj/machinery/washing_machine - name = "Washing Machine" + name = "washing machine" + desc = "A commerical washing machine used to wash clothing items and linens. It requires detergent for efficient washing." icon = 'icons/obj/machines/washing_machine.dmi' icon_state = "wm_00" density = TRUE anchored = TRUE construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null - stat_immune = 0 + stat_immune = NOSCREEN var/state = 0 - var/gibs_ready = 0 - var/obj/crayon - var/obj/item/chems/pill/detergent/detergent + var/gibs_ready = FALSE obj_flags = OBJ_FLAG_ANCHORABLE clicksound = "button" clickvol = 40 + var/list/wash_whitelist = list(/obj/item/clothing/under, + /obj/item/clothing/mask, + /obj/item/clothing/head, + /obj/item/clothing/gloves, + /obj/item/clothing/shoes, + /obj/item/clothing/suit, + /obj/item/bedsheet, + /obj/item/underwear) + + var/max_item_size = ITEM_SIZE_LARGE + + var/list/wash_blacklist = list(/obj/item/clothing/suit/space, + /obj/item/clothing/suit/syndicatefake, + /obj/item/clothing/suit/bomb_suit, + /obj/item/clothing/suit/armor, + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/smokable/cigarette, + /obj/item/clothing/head/helmet) + // Power idle_power_usage = 10 active_power_usage = 150 -/obj/machinery/washing_machine/Destroy() - QDEL_NULL(crayon) - QDEL_NULL(detergent) +/obj/machinery/washing_machine/Initialize(mapload, d, populate_parts) + create_reagents(100) + . = ..() + +/obj/machinery/washing_machine/examine(mob/user) . = ..() + to_chat(user, SPAN_NOTICE("The detergent port is [atom_flags & ATOM_FLAG_OPEN_CONTAINER ? "open" : "closed"].")) + +/obj/machinery/washing_machine/proc/wash() + if(operable()) + var/list/washing_atoms = get_contained_external_atoms() + var/amount_per_atom = FLOOR(reagents.total_volume / length(washing_atoms)) + + if(amount_per_atom > 0) + var/decl/material/smelliest = get_smelliest_reagent(reagents) + for(var/atom/A as anything in get_contained_external_atoms()) + + // Handles washing, decontamination, dyeing, etc. + reagents.trans_to(A, amount_per_atom) + + if(istype(A, /obj/item/clothing)) + var/obj/item/clothing/C = A + C.ironed_state = WRINKLES_WRINKLY + if(smelliest) + C.change_smell(smelliest) + + // Clear out whatever remains of the reagents. + reagents.clear_reagents() + + if(locate(/mob/living) in src) + gibs_ready = TRUE + + state &= ~WASHER_STATE_RUNNING + update_use_power(POWER_USE_IDLE) + +/obj/machinery/washing_machine/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/chems/pill/detergent)) + if(!(atom_flags & ATOM_FLAG_OPEN_CONTAINER)) + to_chat(user, SPAN_WARNING("Open the detergent port first!")) + return + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, SPAN_WARNING("The detergent port is full!")) + return + if(!user.try_unequip(W)) + return + // Directly transfer to the holder to avoid touch reactions. + W.reagents?.trans_to_holder(reagents, W.reagents.total_volume) + to_chat(user, SPAN_NOTICE("You dissolve \the [W] in the detergent port.")) + qdel(W) + return TRUE + + if(state & WASHER_STATE_RUNNING) + to_chat(user, SPAN_WARNING("\The [src] is currently running.")) + return TRUE + + // If the detergent port is open and the item is an open container, assume we're trying to fill the detergent port. + if(!(state & WASHER_STATE_CLOSED) && !((atom_flags & W.atom_flags) & ATOM_FLAG_OPEN_CONTAINER)) + var/list/washing_atoms = get_contained_external_atoms() + if(length(washing_atoms) < 5) + if(istype(W, /obj/item/holder)) // Mob holder + for(var/mob/living/doggy in W) + doggy.forceMove(src) + qdel(W) + state |= WASHER_STATE_LOADED + update_icon() + return TRUE + + // An empty whitelist implies all items can be washed. + else if((!length(wash_whitelist) || is_type_in_list(W, wash_whitelist)) && !is_type_in_list(W, wash_blacklist)) + if(W.w_class > max_item_size) + to_chat(user, SPAN_WARNING("\The [W] is too large for \the [src]!")) + return + if(!user.try_unequip(W, src)) + return + state |= WASHER_STATE_LOADED + update_icon() + else + to_chat(user, SPAN_WARNING("You can't put \the [W] in \the [src].")) + return + else + to_chat(user, SPAN_NOTICE("\The [src] is full.")) + return TRUE + + return ..() + +/obj/machinery/washing_machine/physical_attack_hand(mob/user) + if(state & WASHER_STATE_RUNNING) + to_chat(user, SPAN_WARNING("\The [src] is currently running.")) + return TRUE + if(state & WASHER_STATE_CLOSED) + state &= ~WASHER_STATE_CLOSED + if(gibs_ready) + gibs_ready = FALSE + var/mob/M = locate(/mob/living) in src + if(M) + M.gib() + dump_contents() + state &= ~WASHER_STATE_LOADED + update_icon() + return TRUE + state |= WASHER_STATE_CLOSED + update_icon() + return TRUE + +/obj/machinery/washing_machine/verb/climb_out() + set name = "Climb out" + set category = "Object" + set src in usr.loc + + if(!CanPhysicallyInteract(usr)) + return + if(state & WASHER_STATE_CLOSED) + to_chat(usr, SPAN_WARNING("\The [src] is closed.")) + return + if(!do_after(usr, 2 SECONDS, src)) + return + if(!(state & WASHER_STATE_CLOSED)) + usr.dropInto(loc) /obj/machinery/washing_machine/verb/start() set name = "Start Washing" @@ -41,69 +173,84 @@ if(!CanPhysicallyInteract(usr)) return - if(!anchored) - to_chat(usr, "\The [src] must be secured to the floor.") - return + start_washing(usr) +/obj/machinery/washing_machine/proc/start_washing(mob/user) if(state & WASHER_STATE_RUNNING) - to_chat(usr, "\The [src] is already running.") - return - if(!(state & WASHER_STATE_FULL)) - to_chat(usr, "Load \the [src] first!") + to_chat(user, SPAN_WARNING("\The [src] is already running!")) return if(!(state & WASHER_STATE_CLOSED)) - to_chat(usr, "You must first close the machine.") + to_chat(user, SPAN_WARNING("You must first close \the [src].")) + return + if(!(state & WASHER_STATE_LOADED)) + to_chat(user, SPAN_WARNING("Load \the [src] first!!")) + return + if(!operable()) + to_chat(user, SPAN_WARNING("\The [src] isn't functioning!")) return - if(stat & NOPOWER) - to_chat(usr, SPAN_WARNING("\The [src] is unpowered.")) + if(!reagents.total_volume) + to_chat(user, SPAN_WARNING("There are no cleaning products loaded in \the [src]!")) return + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + state |= WASHER_STATE_RUNNING if(locate(/mob/living) in src) state |= WASHER_STATE_BLOODY update_use_power(POWER_USE_ACTIVE) - addtimer(CALLBACK(src, /obj/machinery/washing_machine/proc/wash), 20 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/washing_machine, wash)), 20 SECONDS) -/obj/machinery/washing_machine/proc/wash() - for(var/atom/A as anything in get_contained_external_atoms()) - if(detergent) - A.clean_blood() - if(isitem(A)) - var/obj/item/I = A - if(detergent) - I.decontaminate() - if(crayon && iscolorablegloves(I)) - var/obj/item/clothing/gloves/C = I - C.color = crayon.color - if(istype(A, /obj/item/clothing)) - var/obj/item/clothing/C = A - C.ironed_state = WRINKLES_WRINKLY - if(detergent) - C.change_smell(SMELL_CLEAN) - addtimer(CALLBACK(C, /obj/item/clothing/proc/change_smell), detergent.smell_clean_time, TIMER_UNIQUE | TIMER_OVERRIDE) - QDEL_NULL(detergent) - - if(locate(/mob/living) in src) - gibs_ready = 1 - state &= ~WASHER_STATE_RUNNING - update_use_power(POWER_USE_IDLE) + return TRUE -/obj/machinery/washing_machine/verb/climb_out() - set name = "Climb out" +/obj/machinery/washing_machine/verb/toggle_port() + set name = "Toggle Detergent Port" set category = "Object" - set src in usr.loc + set src in oview(1) if(!CanPhysicallyInteract(usr)) return - if(state & WASHER_STATE_CLOSED) - to_chat(usr, SPAN_WARNING("\The [src] is closed.")) - return - if(!do_after(usr, 2 SECONDS, src)) + + toggle_detergent_port(usr) + +/obj/machinery/washing_machine/proc/toggle_detergent_port(mob/user) + if(state & WASHER_STATE_RUNNING) + to_chat(user, SPAN_WARNING("You can't open the detergent port while \the [src] is running!")) return - if(!(state & WASHER_STATE_CLOSED)) - usr.dropInto(loc) + + if(atom_flags & ATOM_FLAG_OPEN_CONTAINER) + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + to_chat(user, SPAN_NOTICE("You close the detergent port on \the [src].")) + else + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + to_chat(user, SPAN_NOTICE("You open the detergent port on \the [src].")) + + return TRUE + +/obj/machinery/washing_machine/get_alt_interactions(mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/start_washer) + LAZYADD(., /decl/interaction_handler/toggle_open/washing_machine) + +/decl/interaction_handler/start_washer + name = "Start washer" + expected_target_type = /obj/machinery/washing_machine + +/decl/interaction_handler/start_washer/is_possible(obj/machinery/washing_machine/washer, mob/user) + . = ..() + if(.) + return washer.operable() && !(washer.state & WASHER_STATE_RUNNING) + +/decl/interaction_handler/start_washer/invoked(obj/machinery/washing_machine/washer, mob/user) + return washer.start_washing(user) + +/decl/interaction_handler/toggle_open/washing_machine + name = "Toggle detergent port" + expected_target_type = /obj/machinery/washing_machine + +/decl/interaction_handler/toggle_open/washing_machine/invoked(obj/machinery/washing_machine/washer, mob/user) + return washer.toggle_detergent_port(user) /obj/machinery/washing_machine/on_update_icon() icon_state = "wm_[state][panel_open]" @@ -116,101 +263,19 @@ /obj/machinery/washing_machine/components_are_accessible(path) return !(state & WASHER_STATE_RUNNING) && ..() -/obj/machinery/washing_machine/attackby(obj/item/W, mob/user) - if(!(state & WASHER_STATE_CLOSED)) - if(!crayon && IS_PEN(W)) - if(!user.try_unequip(W, src)) - return - crayon = W - return TRUE - if(!detergent && istype(W,/obj/item/chems/pill/detergent)) - if(!user.try_unequip(W, src)) - return - detergent = W - return TRUE - if(istype(W, /obj/item/holder)) // Mob holder - for(var/mob/living/doggy in W) - doggy.forceMove(src) - qdel(W) - state |= WASHER_STATE_FULL - update_icon() - return TRUE - - else if(istype(W,/obj/item/clothing/under) || \ - istype(W,/obj/item/clothing/mask) || \ - istype(W,/obj/item/clothing/head) || \ - istype(W,/obj/item/clothing/gloves) || \ - istype(W,/obj/item/clothing/shoes) || \ - istype(W,/obj/item/clothing/suit) || \ - istype(W,/obj/item/bedsheet) || \ - istype(W,/obj/item/underwear/)) - - //YES, it's hardcoded... saves a var/can_be_washed for every single clothing item. - if ( istype(W,/obj/item/clothing/suit/space ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/suit/syndicatefake ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/suit/bomb_suit ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/suit/armor ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/suit/armor ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/mask/gas ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/mask/smokable/cigarette ) ) - to_chat(user, "This item does not fit.") - return - if ( istype(W,/obj/item/clothing/head/helmet ) ) - to_chat(user, "This item does not fit.") - return +/obj/machinery/washing_machine/autoclave + name = "autoclave" + desc = "An industrial washing machine used to sterilize and decontaminate items. It requires detergent for efficient decontamination." - if(contents.len < 5) - if(!(state & WASHER_STATE_CLOSED)) - if(!user.try_unequip(W, src)) - return - state |= WASHER_STATE_FULL - update_icon() - else - to_chat(user, SPAN_NOTICE("You can't put the item in right now.")) - else - to_chat(user, SPAN_NOTICE("\The [src] is full.")) - return TRUE - - if(state & WASHER_STATE_RUNNING) - to_chat(user, SPAN_WARNING("\The [src] is currently running.")) - return TRUE + wash_whitelist = list() + wash_blacklist = list() - return ..() + max_item_size = ITEM_SIZE_HUGE -/obj/machinery/washing_machine/physical_attack_hand(mob/user) - if(state & WASHER_STATE_RUNNING) - to_chat(user, SPAN_WARNING("\The [src] is busy.")) - return TRUE - if(state & WASHER_STATE_CLOSED) - state &= ~WASHER_STATE_CLOSED - if(gibs_ready) - gibs_ready = 0 - var/mob/M = locate(/mob/living) in src - if(M) - M.gib() - dump_contents() - state &= ~WASHER_STATE_FULL - update_icon() - crayon = null - detergent = null - return TRUE - state |= WASHER_STATE_CLOSED - update_icon() - return TRUE + idle_power_usage = 10 + active_power_usage = 300 #undef WASHER_STATE_CLOSED -#undef WASHER_STATE_FULL +#undef WASHER_STATE_LOADED #undef WASHER_STATE_RUNNING #undef WASHER_STATE_BLOODY \ No newline at end of file diff --git a/code/game/movietitles.dm b/code/game/movietitles.dm index c084c530baf..2c961d0b5e5 100644 --- a/code/game/movietitles.dm +++ b/code/game/movietitles.dm @@ -1,8 +1,3 @@ -#define CREDIT_ROLL_SPEED 185 -#define CREDIT_SPAWN_SPEED 20 -#define CREDIT_ANIMATE_HEIGHT (14 * world.icon_size) -#define CREDIT_EASE_DURATION 22 - var/global/list/end_titles /client @@ -17,8 +12,6 @@ var/global/list/end_titles if(!global.end_titles) global.end_titles = generate_titles() - LAZYINITLIST(credits) - if(mob) mob.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed) mob.overlay_fullscreen("fadeout",/obj/screen/fullscreen/fadeout) @@ -30,15 +23,14 @@ var/global/list/end_titles sound_to(mob, sound(pick(global.using_map.credit_sound), wait = 0, volume = 40, channel = sound_channels.lobby_channel)) else if(get_preference_value(/datum/client_preference/play_admin_midis) == PREF_YES) sound_to(mob, sound(global.end_credits_song, wait = 0, volume = 40, channel = sound_channels.lobby_channel)) - sleep(50) - var/list/_credits = credits + + sleep(5 SECONDS) verbs += /client/proc/ClearCredits - for(var/I in global.end_titles) - if(!credits) - return - var/obj/screen/credit/T = new(null, I, src) - _credits += T - T.rollem() + for(var/credit in global.end_titles) + var/obj/screen/credit/credit_obj = new(null, mob) + LAZYADD(credits, credit_obj) + credit_obj.maptext = {"
[credit]
"} + credit_obj.rollem() sleep(CREDIT_SPAWN_SPEED) sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED) @@ -54,44 +46,6 @@ var/global/list/end_titles mob.clear_fullscreen("fadeout") sound_to(mob, sound(null, channel = sound_channels.lobby_channel)) -/obj/screen/credit - icon_state = "blank" - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - alpha = 0 - screen_loc = "CENTER-7,BOTTOM+1" - plane = HUD_PLANE - layer = HUD_ABOVE_ITEM_LAYER - var/client/parent - var/matrix/target - -/obj/screen/credit/Initialize(mapload, credited, client/P) - . = ..() - parent = P - maptext = {"
[credited]
"} - maptext_height = world.icon_size * 2 - maptext_width = world.icon_size * 14 - -/obj/screen/credit/proc/rollem() - var/matrix/M = matrix(transform) - M.Translate(0, CREDIT_ANIMATE_HEIGHT) - animate(src, transform = M, time = CREDIT_ROLL_SPEED) - target = M - animate(src, alpha = 255, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL) - spawn(CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION) - if(!QDELETED(src)) - animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) - sleep(CREDIT_EASE_DURATION) - qdel(src) - parent.screen += src - -/obj/screen/credit/Destroy() - var/client/P = parent - if(istype(P)) - P.screen -= src - LAZYREMOVE(P.credits, src) - parent = null - return ..() - /proc/generate_titles() var/list/titles = list() var/list/cast = list() diff --git a/code/game/objects/alien_props.dm b/code/game/objects/alien_props.dm index 0c78194ae61..b6dca18e783 100644 --- a/code/game/objects/alien_props.dm +++ b/code/game/objects/alien_props.dm @@ -7,14 +7,14 @@ icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "unknown1" maxcharge = 5000 - origin_tech = "{'powerstorage':7}" - var/static/base_icon + origin_tech = @'{"powerstorage":7}' + var/base_icon_state /obj/item/cell/alien/on_update_icon() . = ..() - if(!base_icon) - base_icon = pick("instrument", "unknown1", "unknown3", "unknown4") - icon_state = base_icon + if(!base_icon_state) + base_icon_state = pick("instrument", "unknown1", "unknown3", "unknown4") + icon_state = base_icon_state // APC #define APC_UPDATE_ALLGOOD 128 diff --git a/code/game/objects/auras/blueforge_aura.dm b/code/game/objects/auras/blueforge_aura.dm index cc7a7d6118c..1a1800acbc4 100644 --- a/code/game/objects/auras/blueforge_aura.dm +++ b/code/game/objects/auras/blueforge_aura.dm @@ -1,7 +1,7 @@ /obj/aura/blueforge_aura name = "Blueforge Aura" - icon = 'icons/mob/human_races/species/eyes.dmi' - icon_state = "eyes_blueforged_s" + icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' + icon_state = "eyes" layer = MOB_LAYER /obj/aura/blueforge_aura/life_tick() diff --git a/code/game/objects/auras/regenerating_aura.dm b/code/game/objects/auras/regenerating_aura.dm index 3ed0079b4fe..96707e87154 100644 --- a/code/game/objects/auras/regenerating_aura.dm +++ b/code/game/objects/auras/regenerating_aura.dm @@ -5,8 +5,8 @@ var/tox_mult = 1 /obj/aura/regenerating/life_tick() - user.adjustBruteLoss(-brute_mult) - user.adjustFireLoss(-fire_mult) + user.adjustBruteLoss(-brute_mult, do_update_health = FALSE) + user.adjustFireLoss(-fire_mult, do_update_health = FALSE) user.adjustToxLoss(-tox_mult) /obj/aura/regenerating/human @@ -35,15 +35,22 @@ low_nut_warning() return 0 + var/update_health = FALSE + var/organ_regen = get_config_value(/decl/config/num/health_organ_regeneration_multiplier) if(brute_mult && H.getBruteLoss()) - H.adjustBruteLoss(-brute_mult * config.organ_regeneration_multiplier) + update_health = TRUE + H.adjustBruteLoss(-brute_mult * organ_regen, do_update_health = FALSE) H.adjust_nutrition(-nutrition_damage_mult) if(fire_mult && H.getFireLoss()) - H.adjustFireLoss(-fire_mult * config.organ_regeneration_multiplier) + update_health = TRUE + H.adjustFireLoss(-fire_mult * organ_regen, do_update_health = FALSE) H.adjust_nutrition(-nutrition_damage_mult) if(tox_mult && H.getToxLoss()) - H.adjustToxLoss(-tox_mult * config.organ_regeneration_multiplier) + update_health = TRUE + H.adjustToxLoss(-tox_mult * organ_regen, do_update_health = FALSE) H.adjust_nutrition(-nutrition_damage_mult) + if(update_health) + H.update_health() if(!can_regenerate_organs()) return 1 diff --git a/code/game/objects/effects/_effect.dm b/code/game/objects/effects/_effect.dm new file mode 100644 index 00000000000..2547b4525b9 --- /dev/null +++ b/code/game/objects/effects/_effect.dm @@ -0,0 +1,2 @@ +/obj/effect + abstract_type = /obj/effect diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 0e0ad490e07..715a720efe3 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -4,9 +4,9 @@ var/global/list/BUMP_TELEPORTERS = list() name = "bump-teleporter" icon = 'icons/mob/screen1.dmi' icon_state = "x2" - var/id = null //id of this bump_teleporter. - var/id_target = null //id of bump_teleporter which this moves you to. - invisibility = 101 //nope, can't see this + var/id = null //id of this bump_teleporter. + var/id_target = null //id of bump_teleporter which this moves you to. + invisibility = INVISIBILITY_ABSTRACT //nope, can't see this anchored = TRUE density = TRUE opacity = FALSE diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 7bd64338600..ebfa01620cd 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -51,7 +51,7 @@ /obj/effect/effect/smoke/chem/Crossed(atom/movable/AM) ..() - if(!istype(AM, /obj/effect/effect/smoke/chem)) + if(AM.simulated && !istype(AM, /obj/effect/effect/smoke/chem)) reagents.splash(AM, splash_amount, copy = 1) /obj/effect/effect/smoke/chem/proc/initial_splash() @@ -138,7 +138,7 @@ var/whereLink = "[where]" if(show_log) - var/atom/location = carry?.get_reaction_loc() + var/atom/location = carry?.get_reaction_loc(CHEM_REACTION_FLAG_OVERFLOW_CONTAINER) if(location?.fingerprintslast) var/mob/M = get_mob_by_key(location.fingerprintslast) var/more = "" diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 6cd9c2977de..7d5401a8f1e 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -22,7 +22,7 @@ spawn(3 + metal * 3) Process() checkReagents() - addtimer(CALLBACK(src, .proc/remove_foam), 12 SECONDS) + addtimer(CALLBACK(src, PROC_REF(remove_foam)), 12 SECONDS) /obj/effect/effect/foam/proc/remove_foam() STOP_PROCESSING(SSobj, src) @@ -67,16 +67,15 @@ /obj/effect/effect/foam/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) // foam disolves when heated, except metal foams if(!metal && prob(max(0, exposed_temperature - 475))) flick("[icon_state]-disolve", src) + QDEL_IN(src, 5) + return + return ..() - spawn(5) - qdel(src) - -/obj/effect/effect/foam/Crossed(var/atom/movable/AM) - if(metal) +/obj/effect/effect/foam/Crossed(atom/movable/AM) + if(metal || !isliving(AM)) return - if(isliving(AM)) - var/mob/living/M = AM - M.slip("the foam", 6) + var/mob/living/M = AM + M.slip("the foam", 6) /datum/effect/effect/system/foam_spread var/amount = 5 // the size of the foam spread. diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 32ea72dbaa3..4de3c466f56 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -32,14 +32,14 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/reveal_blood() if(!fluorescent) - fluorescent = 1 + fluorescent = FLUORESCENT_GLOWS basecolor = COLOR_LUMINOL update_icon() /obj/effect/decal/cleanable/blood/clean_blood() - fluorescent = 0 - if(invisibility != 100) - set_invisibility(100) + fluorescent = FALSE + if(invisibility != INVISIBILITY_ABSTRACT) + set_invisibility(INVISIBILITY_ABSTRACT) amount = 0 STOP_PROCESSING(SSobj, src) remove_extension(src, /datum/extension/scent) @@ -88,30 +88,29 @@ var/global/list/image/splatter_cache=list() SetName(initial(name)) desc = initial(desc) -/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp) - if (!istype(perp)) - return - if(amount < 1) +/obj/effect/decal/cleanable/blood/Crossed(atom/movable/AM) + if(!isliving(AM) || amount < 1) return - var/obj/item/organ/external/l_foot = GET_EXTERNAL_ORGAN(perp, BP_L_FOOT) - var/obj/item/organ/external/r_foot = GET_EXTERNAL_ORGAN(perp, BP_R_FOOT) + var/mob/living/M = AM + var/obj/item/organ/external/l_foot = GET_EXTERNAL_ORGAN(M, BP_L_FOOT) + var/obj/item/organ/external/r_foot = GET_EXTERNAL_ORGAN(M, BP_R_FOOT) var/hasfeet = l_foot && r_foot var/transferred_data = blood_data ? blood_data[pick(blood_data)] : null - var/obj/item/clothing/shoes/shoes = perp.get_equipped_item(slot_shoes_str) - if(istype(shoes) && !perp.buckled)//Adding blood to shoes + var/obj/item/clothing/shoes/shoes = M.get_equipped_item(slot_shoes_str) + if(istype(shoes) && !M.buckled)//Adding blood to shoes shoes.add_coating(chemical, amount, transferred_data) else if (hasfeet)//Or feet if(l_foot) l_foot.add_coating(chemical, amount, transferred_data) if(r_foot) r_foot.add_coating(chemical, amount, transferred_data) - else if (perp.buckled && istype(perp.buckled, /obj/structure/bed/chair/wheelchair)) - var/obj/structure/bed/chair/wheelchair/W = perp.buckled + else if (M.buckled && istype(M.buckled, /obj/structure/bed/chair/wheelchair)) + var/obj/structure/bed/chair/wheelchair/W = M.buckled W.bloodiness = 4 - perp.update_equipment_overlay(slot_shoes_str) + M.update_equipment_overlay(slot_shoes_str) amount-- /obj/effect/decal/cleanable/blood/proc/dry() diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 4babdb8d091..c277e3b1038 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -92,6 +92,7 @@ name = "tomato smudge" desc = "It's red." icon = 'icons/effects/tomatodecal.dmi' + icon_state = "tomato_floor1" random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") persistent = TRUE generic_filth = TRUE @@ -100,6 +101,7 @@ name = "smashed egg" desc = "Seems like this one won't hatch." icon = 'icons/effects/tomatodecal.dmi' + icon_state = "smashed_egg1" random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") persistent = TRUE generic_filth = TRUE @@ -108,6 +110,7 @@ name = "smashed pie" desc = "It's pie cream from a cream pie." icon = 'icons/effects/tomatodecal.dmi' + icon_state = "smashed_pie" random_icon_states = list("smashed_pie") persistent = TRUE generic_filth = TRUE diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm deleted file mode 100644 index 01cf9011f0a..00000000000 --- a/code/game/objects/effects/decals/contraband.dm +++ /dev/null @@ -1,8 +0,0 @@ -//########################## CONTRABAND ;3333333333333333333 -Agouri ################################################### - -/obj/item/contraband - name = "contraband item" - desc = "You probably shouldn't be holding this." - icon = 'icons/obj/contraband.dmi' - force = 0 - material = /decl/material/solid/cardboard //#TODO: Change to paper or something diff --git a/code/game/objects/effects/decals/posters/_poster.dm b/code/game/objects/effects/decals/posters/_poster.dm index 84912068382..c5e5768301b 100644 --- a/code/game/objects/effects/decals/posters/_poster.dm +++ b/code/game/objects/effects/decals/posters/_poster.dm @@ -4,13 +4,13 @@ ///A wall mounted poster /obj/structure/sign/poster - icon = 'icons/obj/contraband.dmi' + icon = 'icons/obj/items/posters.dmi' icon_state = "poster0" anchored = TRUE - directional_offset = "{'NORTH':{'y':32}, 'SOUTH':{'y':-32}, 'EAST':{'x':32}, 'WEST':{'x':-32}}" - material = /decl/material/solid/cardboard - maxhealth = 10 - parts_type = /obj/item/contraband/poster + directional_offset = @'{"NORTH":{"y":32}, "SOUTH":{"y":-32}, "WEST":{"x":32}, "EAST":{"x":-32}}' + material = /decl/material/solid/organic/paper + max_health = 10 + parts_type = /obj/item/poster parts_amount = 1 ///Whether the poster is too damaged to take off from the wall or not. @@ -36,7 +36,7 @@ /obj/structure/sign/poster/Initialize(var/ml, var/_mat, var/_reinf_mat, var/placement_dir = null, var/given_poster_type = null) . = ..(ml, _mat, _reinf_mat) set_design(given_poster_type || poster_design || pick(decls_repository.get_decl_paths_of_subtype(/decl/poster_design))) - set_dir (placement_dir || dir) + set_dir(placement_dir || dir) /obj/structure/sign/poster/physically_destroyed(skip_qdel) playsound(src, sound_destroyed, 80, TRUE) @@ -89,6 +89,7 @@ else desc = "[base_desc] [poster_design.desc]" SetName("[base_name] - [poster_design.name]") + icon = poster_design.icon set_icon_state(poster_design.icon_state) update_icon() @@ -121,10 +122,13 @@ ////////////////////////////////////////////////////////////////////////////////// ///A rolled up version of the wall-mounted poster structure -/obj/item/contraband/poster +/obj/item/poster name = "rolled-up poster" desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface." + icon = 'icons/obj/items/posters.dmi' icon_state = "rolled_poster" + force = 0 + material = /decl/material/solid/organic/paper ///The name of the medium, excluding any reference to the design var/base_name = "rolled-up poster" ///The description for the item/medium without any reference to the design. @@ -132,12 +136,12 @@ ///Type path to the /decl for the design on this poster. At runtime is changed for a reference to the decl var/decl/poster_design/poster_design -/obj/item/contraband/poster/Initialize(ml, material_key, var/given_poster_type = null) +/obj/item/poster/Initialize(ml, material_key, var/given_poster_type = null) //Init design set_design(given_poster_type || poster_design || pick(decls_repository.get_decl_paths_of_subtype(/decl/poster_design))) return ..(ml, material_key) -/obj/item/contraband/poster/proc/set_design(var/decl/poster_design/_design_path) +/obj/item/poster/proc/set_design(var/decl/poster_design/_design_path) if(_design_path == poster_design) return TRUE if(ispath(_design_path, /decl)) @@ -150,7 +154,7 @@ SetName("[base_name] - [poster_design.name] - [poster_design.serial_number]") //Places the poster on a wall -/obj/item/contraband/poster/afterattack(var/atom/A, var/mob/user, var/adjacent, var/clickparams) +/obj/item/poster/afterattack(var/atom/A, var/mob/user, var/adjacent, var/clickparams) if (!adjacent) return @@ -185,7 +189,7 @@ // We cannot rely on user being on the appropriate turf when placement fails P.dismantle() -/obj/item/contraband/poster/proc/ArePostersOnWall(var/turf/W, var/placed_poster) +/obj/item/poster/proc/ArePostersOnWall(var/turf/W, var/placed_poster) //just check if there is a poster on or adjacent to the wall if (locate(/obj/structure/sign/poster) in W) return TRUE diff --git a/code/game/objects/effects/decals/posters/_poster_design.dm b/code/game/objects/effects/decals/posters/_poster_design.dm index ab3719c145a..e96a70f21d1 100644 --- a/code/game/objects/effects/decals/posters/_poster_design.dm +++ b/code/game/objects/effects/decals/posters/_poster_design.dm @@ -4,13 +4,16 @@ ///Contains information on what a poster displays. /decl/poster_design + abstract_type = /decl/poster_design ///The display name/title of the design. Suffixed to the name of the medium displaying the design. var/name ///The description of the design shown to users. This is suffixed to the description of the medium displaying this design. var/desc ///Collectible serial number string, if any. var/serial_number - ///The icon state to use for this design. The display medium will use this to pick it's icon. + ///The icon to use for this design. + var/icon = 'icons/obj/items/posters.dmi' + ///The icon state to use for this design. The display medium will use this to pick it's icon state. var/icon_state /decl/poster_design/Initialize() @@ -21,3 +24,12 @@ if(length(serial_number)) return serial_number = "serial #[sequential_id(/decl/poster_design)]" + +/decl/poster_design/validate() + . = ..() + if(!icon_state) + . += "no icon_state set" + if(!icon) + . += "no icon set" + if(icon && icon_state && !check_state_in_icon(icon_state, icon)) + . += "icon state [icon_state] not present in [icon]" diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index cc73cb7d1e8..65d922b6cda 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -10,7 +10,6 @@ would spawn and follow the beaker, even if it is carried or thrown. name = "effect" icon = 'icons/effects/effects.dmi' mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - unacidable = 1//So effect are not targeted by alien acid. pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE /datum/effect/effect/system @@ -69,7 +68,7 @@ steam.start() -- spawns the effect /datum/effect/effect/system/steam_spread/start() var/i = 0 for(i=0, i 20) return - addtimer(CALLBACK(src, /datum/effect/effect/system/proc/spread, i), 0) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/effect/effect/system, spread), i), 0) /datum/effect/effect/system/smoke_spread/spread(var/i) if(holder) diff --git a/code/game/objects/effects/explosion_particles.dm b/code/game/objects/effects/explosion_particles.dm index 4f3c44fba8b..1077b1b952f 100644 --- a/code/game/objects/effects/explosion_particles.dm +++ b/code/game/objects/effects/explosion_particles.dm @@ -55,7 +55,7 @@ var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles() P.set_up(10,location) P.start() - addtimer(CALLBACK(src, .proc/make_smoke), 5) + addtimer(CALLBACK(src, PROC_REF(make_smoke)), 5) /datum/effect/system/explosion/proc/make_smoke() var/datum/effect/effect/system/smoke_spread/S = new/datum/effect/effect/system/smoke_spread() diff --git a/code/game/objects/effects/fluids.dm b/code/game/objects/effects/fluids.dm index 0ab5aef32c4..2cf3369d583 100644 --- a/code/game/objects/effects/fluids.dm +++ b/code/game/objects/effects/fluids.dm @@ -34,7 +34,7 @@ return FALSE /obj/effect/fluid/on_reagent_change() - . = ..() + ..() if(reagents?.total_volume) var/decl/material/primary_reagent = reagents.get_primary_reagent_decl() @@ -126,14 +126,18 @@ fluid_initial = 10 // Permaflood overlay. -var/global/obj/abstract/flood/flood_object = new -/obj/abstract/flood - layer = DEEP_FLUID_LAYER - color = COLOR_LIQUID_WATER - icon = 'icons/effects/liquids.dmi' - icon_state = "ocean" - alpha = 140 - invisibility = 0 +var/global/obj/effect/flood/flood_object = new +/obj/effect/flood + name = "" + icon = 'icons/effects/liquids.dmi' + icon_state = "ocean" + layer = DEEP_FLUID_LAYER + color = COLOR_LIQUID_WATER + alpha = 140 + invisibility = INVISIBILITY_NONE + simulated = FALSE + density = FALSE + anchored = TRUE /obj/effect/fluid/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) . = ..() diff --git a/code/game/objects/effects/force_portal.dm b/code/game/objects/effects/force_portal.dm index 19d64e08505..cd0edd129eb 100644 --- a/code/game/objects/effects/force_portal.dm +++ b/code/game/objects/effects/force_portal.dm @@ -5,7 +5,6 @@ icon_state = "portal" blend_mode = BLEND_SUBTRACT density = TRUE - unacidable = 1 anchored = TRUE var/boom_time = 1 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 927e1d7f478..542dd7c36d4 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -21,7 +21,7 @@ icon = 'icons/mob/screen1.dmi' icon_state = "x" anchored = TRUE - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT /obj/abstract/landmark/start/Initialize() tag = "start*[name]" diff --git a/code/game/objects/effects/landmarks_latejoin.dm b/code/game/objects/effects/landmarks_latejoin.dm index 6d7f768167c..c7ca55458b0 100644 --- a/code/game/objects/effects/landmarks_latejoin.dm +++ b/code/game/objects/effects/landmarks_latejoin.dm @@ -1,23 +1,9 @@ -var/global/list/latejoin_locations = list() -var/global/list/latejoin_cryo_locations = list() -var/global/list/latejoin_cyborg_locations = list() -var/global/list/latejoin_gateway_locations = list() - /obj/abstract/landmark/latejoin delete_me = TRUE + var/spawn_decl = /decl/spawnpoint/arrivals /obj/abstract/landmark/latejoin/Initialize() - add_loc() + if(spawn_decl) + var/decl/spawnpoint/spawn_instance = GET_DECL(spawn_decl) + spawn_instance.add_spawn_turf(get_turf(src)) . = ..() - -/obj/abstract/landmark/latejoin/proc/add_loc() - global.latejoin_locations |= get_turf(src) - -/obj/abstract/landmark/latejoin/gateway/add_loc() - global.latejoin_gateway_locations |= get_turf(src) - -/obj/abstract/landmark/latejoin/cryo/add_loc() - global.latejoin_cryo_locations |= get_turf(src) - -/obj/abstract/landmark/latejoin/cyborg/add_loc() - global.latejoin_cyborg_locations |= get_turf(src) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index 023b92f552d..4215dd086c5 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -2,11 +2,10 @@ name = "manifest" icon = 'icons/mob/screen1.dmi' icon_state = "x" - unacidable = 1//Just to be sure. /obj/effect/manifest/Initialize() . = ..() - invisibility = INVISIBILITY_ABSTRACT + set_invisibility(INVISIBILITY_ABSTRACT) /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 89ad7ff0924..d1e73a46b06 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -14,7 +14,8 @@ icon_state = "uglyminearmed" /obj/effect/mine/Crossed(atom/movable/AM) - Bumped(AM) + if(!isobserver(AM)) + Bumped(AM) /obj/effect/mine/Bumped(mob/M) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 20b18b823b6..4a78d796efd 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -1,6 +1,5 @@ /obj/effect/overlay name = "overlay" - unacidable = 1 /obj/effect/overlay/singularity_pull() return diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index c1800eb70e5..55aaddcf1bd 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -5,7 +5,6 @@ icon_state = "portal" density = TRUE anchored = TRUE - unacidable = TRUE // Can't destroy energy portals. var/obj/item/target = null var/dangerous = FALSE var/failchance = 0 @@ -33,7 +32,7 @@ dangerous = 1 playsound(src, 'sound/effects/phasein.ogg', 25, 1) target = end - events_repository.register(/decl/observ/moved, src, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/datum, qdel_self)) if(delete_after) QDEL_IN(src, delete_after) diff --git a/code/game/objects/effects/projectile/projectile_effects.dm b/code/game/objects/effects/projectile/projectile_effects.dm index 34fc1ff2e1d..42692c3ebc2 100644 --- a/code/game/objects/effects/projectile/projectile_effects.dm +++ b/code/game/objects/effects/projectile/projectile_effects.dm @@ -5,7 +5,6 @@ plane = ABOVE_LIGHTING_PLANE layer = BEAM_PROJECTILE_LAYER //Muzzle flashes would be above the lighting plane anyways. anchored = TRUE - unacidable = TRUE light_color = "#00ffff" light_range = 2 light_power = 1 diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 8aeef1d8949..0952585216f 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -5,7 +5,7 @@ icon = 'icons/effects/effects.dmi' anchored = TRUE density = FALSE - var/health = 15 + max_health = 15 //similar to weeds, but only barfed out by nurses manually /obj/effect/spider/explosion_act(severity) @@ -69,6 +69,8 @@ if(exposed_temperature > 300 + T0C) health -= 5 healthcheck() + if(!QDELETED(src)) + return ..() /obj/effect/spider/stickyweb icon_state = "stickyweb1" @@ -143,7 +145,7 @@ icon_state = "lesser" anchored = FALSE layer = BELOW_OBJ_LAYER - health = 3 + max_health = 3 var/mob/living/simple_animal/hostile/giant_spider/greater_form var/last_itch = 0 var/amount_grown = -1 @@ -170,7 +172,7 @@ dormant = FALSE if(dormant) - events_repository.register(/decl/observ/moved, src, src, /obj/effect/spider/proc/disturbed) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/effect/spider, disturbed)) else START_PROCESSING(SSobj, src) @@ -185,7 +187,7 @@ /obj/effect/spider/spiderling/Destroy() if(dormant) - events_repository.unregister(/decl/observ/moved, src, src, /obj/effect/spider/proc/disturbed) + events_repository.unregister(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/effect/spider, disturbed)) STOP_PROCESSING(SSobj, src) walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. . = ..() @@ -195,15 +197,18 @@ if(health > 0) disturbed() -/obj/effect/spider/spiderling/Crossed(var/mob/living/L) - if(dormant && istype(L) && L.mob_size > MOB_SIZE_TINY) +/obj/effect/spider/spiderling/Crossed(atom/movable/AM) + if(!dormant || !isliving(AM)) + return + var/mob/living/M = AM + if(M.mob_size > MOB_SIZE_TINY) disturbed() /obj/effect/spider/spiderling/disturbed() if(!dormant) return dormant = FALSE - events_repository.unregister(/decl/observ/moved, src, src, /obj/effect/spider/proc/disturbed) + events_repository.unregister(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/effect/spider, disturbed)) START_PROCESSING(SSobj, src) /obj/effect/spider/spiderling/Bump(atom/user) @@ -228,7 +233,7 @@ if(prob(50)) src.visible_message("You hear something squeezing through the ventilation ducts.",2) forceMove(exit_vent) - addtimer(CALLBACK(src, .proc/end_vent_moving, exit_vent), travel_time) + addtimer(CALLBACK(src, PROC_REF(end_vent_moving), exit_vent), travel_time) /obj/effect/spider/spiderling/proc/end_vent_moving(obj/machinery/atmospherics/unary/vent_pump/exit_vent) if(check_vent(exit_vent)) @@ -263,7 +268,7 @@ forceMove(entry_vent) var/travel_time = round(get_dist(loc, exit_vent.loc) / 2) - addtimer(CALLBACK(src, .proc/start_vent_moving, exit_vent, travel_time), travel_time + rand(20,60)) + addtimer(CALLBACK(src, PROC_REF(start_vent_moving), exit_vent, travel_time), travel_time + rand(20,60)) travelling_in_vent = TRUE return else @@ -331,7 +336,7 @@ name = "cocoon" desc = "Something wrapped in silky spider web." icon_state = "cocoon1" - health = 60 + max_health = 60 /obj/effect/spider/cocoon/Initialize() . = ..() diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 04e2c85b2c1..a1b4002d04a 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -3,21 +3,19 @@ /obj/effect/step_trigger var/affect_ghosts = 0 var/stopper = 1 // stops throwers - invisibility = 101 // nope cant see this shit + invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit anchored = TRUE + icon = 'icons/misc/mark.dmi' + icon_state = "X" /obj/effect/step_trigger/proc/Trigger(var/atom/movable/A) return 0 -/obj/effect/step_trigger/Crossed(H) +/obj/effect/step_trigger/Crossed(atom/movable/AM) ..() - if(!H) + if(!AM || (isobserver(AM) && !(isghost(AM) && affect_ghosts))) return - if(isobserver(H) && !(isghost(H) && affect_ghosts)) - return - Trigger(H) - - + Trigger(AM) /* Tosses things in a certain direction */ diff --git a/code/game/objects/effects/temporary_effect.dm b/code/game/objects/effects/temporary_effect.dm index 90e3da27698..1e950217a2f 100644 --- a/code/game/objects/effects/temporary_effect.dm +++ b/code/game/objects/effects/temporary_effect.dm @@ -1,7 +1,6 @@ //A temporary effect that does not DO anything except look pretty. /obj/effect/temporary anchored = TRUE - unacidable = 1 mouse_opacity = MOUSE_OPACITY_UNCLICKABLE density = FALSE layer = ABOVE_HUMAN_LAYER diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index e3a2cedd855..bef4e25c4d1 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,6 +1,6 @@ //TODO: Flash range does nothing currently /proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, z_transfer = UP|DOWN) - if(config.use_iterative_explosions) + if(get_config_value(/decl/config/toggle/use_iterative_explosions)) . = explosion_iter(epicenter, (devastation_range * 2 + heavy_impact_range + light_impact_range), z_transfer) else . = explosion_basic(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, z_transfer) @@ -86,7 +86,7 @@ if(AM && AM.simulated && !T.protects_atom(AM)) AM.explosion_act(dist) if(!QDELETED(AM) && !AM.anchored) - addtimer(CALLBACK(AM, /atom/movable/.proc/throw_at, throw_target, throw_dist, throw_dist), 0) + addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, throw_at), throw_target, throw_dist, throw_dist), 0) var/took = (REALTIMEOFDAY-start_time)/10 if(Debug2) @@ -127,11 +127,12 @@ if (O.explosion_resistance) power -= O.explosion_resistance - if (power >= config.iterative_explosives_z_threshold) + if (power >= get_config_value(/decl/config/num/iterative_explosives_z_threshold)) + var/explo_mult = get_config_value(/decl/config/num/iterative_explosives_z_multiplier) if ((z_transfer & UP) && HasAbove(epicenter.z)) - explosion_iter(GetAbove(epicenter), power * config.iterative_explosives_z_multiplier, UP) + explosion_iter(GetAbove(epicenter), power * explo_mult, UP) if ((z_transfer & DOWN) && HasBelow(epicenter.z)) - explosion_iter(GetBelow(epicenter), power * config.iterative_explosives_z_multiplier, DOWN) + explosion_iter(GetBelow(epicenter), power * explo_mult, DOWN) // These three lists must always be the same length. var/list/turf_queue = list(epicenter, epicenter, epicenter, epicenter) @@ -254,7 +255,7 @@ if (AM.simulated) AM.explosion_act(severity) if(!QDELETED(AM) && !AM.anchored) - addtimer(CALLBACK(AM, /atom/movable/.proc/throw_at, throw_target, throw_dist, throw_dist), 0) + addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, throw_at), throw_target, throw_dist, throw_dist), 0) movable_tally++ CHECK_TICK else diff --git a/code/game/objects/item.dm b/code/game/objects/item.dm index 3ba0e0ab30f..342fb5ac283 100644 --- a/code/game/objects/item.dm +++ b/code/game/objects/item.dm @@ -7,8 +7,6 @@ var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/randpixel = 6 - var/health - var/max_health var/material_health_multiplier = 0.2 var/hitsound var/slot_flags = 0 //This is used to determine on which slots an item can fit. @@ -86,7 +84,7 @@ var/tmp/has_inventory_icon // do not set manually var/tmp/use_single_icon - var/center_of_mass = @"{'x':16,'y':16}" //can be null for no exact placement behaviour + var/center_of_mass = @'{"x":16,"y":16}' //can be null for no exact placement behaviour /obj/item/proc/can_contaminate() return !(obj_flags & ITEM_FLAG_NO_CONTAMINATION) @@ -206,12 +204,13 @@ /obj/item/examine(mob/user, distance) var/desc_comp = "" //For "description composite" - desc_comp += "It is a [w_class_description()] item." + desc_comp += "It is a [w_class_description()] item.
" - var/desc_damage = get_examined_damage_string(health / max_health) + var/desc_damage = get_examined_damage_string() if(length(desc_damage)) - desc_comp += "
[desc_damage]" + desc_comp += "[desc_damage]
" + var/added_header = FALSE if(user?.get_preference_value(/datum/client_preference/inquisitive_examine) == PREF_ON) var/list/available_recipes = list() @@ -224,62 +223,117 @@ available_recipes[initial_stage] = "\a [initial(prop.name)]" if(length(available_recipes)) - desc_comp += "
*--------*
" + + if(!added_header) + added_header = TRUE + desc_comp += "*--------*
" + for(var/decl/crafting_stage/initial_stage in available_recipes) desc_comp += SPAN_NOTICE("With [available_recipes[initial_stage]], you could start making \a [initial_stage.descriptor] out of this.") desc_comp += "
" - desc_comp += "*--------*" + desc_comp += "*--------*
" + + if(distance <= 1 && has_extension(src, /datum/extension/loaded_cell)) + + if(!added_header) + added_header = TRUE + desc_comp += "*--------*
" + + var/datum/extension/loaded_cell/cell_loaded = get_extension(src, /datum/extension/loaded_cell) + var/obj/item/cell/loaded_cell = cell_loaded?.get_cell() + var/obj/item/cell/current_cell = get_cell() + // Some items use the extension but may return something else to get_cell(). + // In these cases, don't print the removal info etc. + if(current_cell && current_cell != loaded_cell) + desc_comp += SPAN_NOTICE("\The [src] is using an external [current_cell.name] as a power supply.") + else + desc_comp += jointext(cell_loaded.get_examine_text(current_cell), "
") + desc_comp += "
*--------*
" if(hasHUD(user, HUD_SCIENCE)) //Mob has a research scanner active. - desc_comp += "
*--------*
" + + if(!added_header) + added_header = TRUE + desc_comp += "*--------*
" if(origin_tech) - desc_comp += SPAN_NOTICE("Testing potentials:
") + desc_comp += SPAN_NOTICE("Testing potentials:") + desc_comp += "
" var/list/techlvls = cached_json_decode(origin_tech) for(var/T in techlvls) var/decl/research_field/field = SSfabrication.get_research_field_by_id(T) - desc_comp += "Tech: Level [techlvls[T]] [field.name]
" + desc_comp += "Tech: Level [techlvls[T]] [field.name].
" else desc_comp += "No tech origins detected.
" if(LAZYLEN(matter)) - desc_comp += SPAN_NOTICE("Extractable materials:
") + desc_comp += SPAN_NOTICE("Extractable materials:") + desc_comp += "
" for(var/mat in matter) var/decl/material/M = GET_DECL(mat) desc_comp += "[capitalize(M.solid_name)]
" else desc_comp += SPAN_DANGER("No extractable materials detected.
") - desc_comp += "*--------*" + desc_comp += "*--------*
" return ..(user, distance, "", desc_comp) -// This is going to need a solid go-over to properly integrate all the movement procs into each -// other and make sure everything is updating nicely. Snowflaking it for now. ~Jan 2020 -/obj/item/handle_mouse_drop(atom/over, mob/user) +/obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) + . = (loc == user && istype(over, /obj/screen/inventory)) || ..() +/obj/item/handle_mouse_drop(atom/over, mob/user, params) if(over == user) usr.face_atom(src) dragged_onto(over) return TRUE + // Allow dragging items onto/around tables and racks. + if(istype(over, /obj/structure)) + var/obj/structure/struct = over + if(struct.structure_flags & STRUCTURE_FLAG_SURFACE) + if(user == loc && !user.try_unequip(src, get_turf(user))) + return TRUE + if(!isturf(loc)) + return TRUE + var/list/click_data = params2list(params) + do_visual_slide(src, get_turf(src), pixel_x, pixel_y, get_turf(over), text2num(click_data["icon-x"])-1, text2num(click_data["icon-y"])-1, center_of_mass && cached_json_decode(center_of_mass)) + return TRUE + + // Try to drag-equip the item. var/obj/screen/inventory/inv = over if(user.client && istype(inv) && inv.slot_id && (over in user.client.screen)) + // Remove the item from our bag if necessary. if(istype(loc, /obj/item/storage)) var/obj/item/storage/bag = loc bag.remove_from_storage(src) dropInto(get_turf(bag)) + // Otherwise remove it from our inventory if necessary. else if(ismob(loc)) var/mob/M = loc if(!M.try_unequip(src, get_turf(src))) return ..() - user.equip_to_slot_if_possible(src, inv.slot_id) + // Equip to the slot we dragged over. + if(isturf(loc) && mob_can_equip(user, inv.slot_id, disable_warning = TRUE)) + add_fingerprint(user) + user.equip_to_slot_if_possible(src, inv.slot_id) return TRUE + . = ..() /obj/item/proc/dragged_onto(var/mob/user) return attack_hand_with_interaction_checks(user) +/obj/item/afterattack(var/atom/A, var/mob/user, var/proximity) + . = ..() + if(. || !proximity) + return + var/atom_heat = get_heat() + if(atom_heat > 0) + A.handle_external_heating(atom_heat, src, user) + return TRUE + return FALSE + /obj/item/attack_hand(mob/user) if(!user) @@ -325,6 +379,11 @@ if(!QDELETED(throwing)) throwing.finalize(hit=TRUE) + if(has_extension(src, /datum/extension/loaded_cell) && user.is_holding_offhand(src)) + var/datum/extension/loaded_cell/cell_handler = get_extension(src, /datum/extension/loaded_cell) + if(cell_handler.try_unload(user)) + return TRUE + if (loc == user) if(!user.try_unequip(src)) return TRUE @@ -368,8 +427,19 @@ if(S.collection_mode) //Mode is set to collect all items if(isturf(src.loc)) S.gather_all(src.loc, user) + return TRUE else if(S.can_be_inserted(src, user)) S.handle_item_insertion(src) + return TRUE + + if(has_extension(src, /datum/extension/loaded_cell)) + var/datum/extension/loaded_cell/cell_loaded = get_extension(src, /datum/extension/loaded_cell) + if(cell_loaded.has_tool_unload_interaction(W)) + return cell_loaded.try_unload(user, W) + else if(istype(W, /obj/item/cell)) + return cell_loaded.try_load(user, W) + + return FALSE /obj/item/proc/talk_into(mob/living/M, message, message_mode, var/verb = "says", var/decl/language/speaking = null) return @@ -387,10 +457,10 @@ for(var/obj/item/thing in user?.get_held_items()) thing.update_twohanding() if(play_dropsound && drop_sound && SSticker.mode) - addtimer(CALLBACK(src, .proc/dropped_sound_callback), 0, (TIMER_OVERRIDE | TIMER_UNIQUE)) + addtimer(CALLBACK(src, PROC_REF(dropped_sound_callback)), 0, (TIMER_OVERRIDE | TIMER_UNIQUE)) if(user && (z_flags & ZMM_MANGLE_PLANES)) - addtimer(CALLBACK(user, /mob/proc/check_emissive_equipment), 0, TIMER_UNIQUE) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, check_emissive_equipment)), 0, TIMER_UNIQUE) RAISE_EVENT(/decl/observ/mob_unequipped, user, src) RAISE_EVENT_REPEAT(/decl/observ/item_unequipped, src, user) @@ -422,7 +492,7 @@ add_fingerprint(user) hud_layerise() - addtimer(CALLBACK(src, .proc/reconsider_client_screen_presence, user.client, slot), 0) + addtimer(CALLBACK(src, PROC_REF(reconsider_client_screen_presence), user.client, slot), 0) //Update two-handing status var/mob/M = loc @@ -433,11 +503,11 @@ if(user) if(SSticker.mode) if(pickup_sound && (slot in user.get_held_item_slots())) - addtimer(CALLBACK(src, .proc/pickup_sound_callback), 0, (TIMER_OVERRIDE | TIMER_UNIQUE)) + addtimer(CALLBACK(src, PROC_REF(pickup_sound_callback)), 0, (TIMER_OVERRIDE | TIMER_UNIQUE)) else if(equip_sound) - addtimer(CALLBACK(src, .proc/equipped_sound_callback), 0, (TIMER_OVERRIDE | TIMER_UNIQUE)) + addtimer(CALLBACK(src, PROC_REF(equipped_sound_callback)), 0, (TIMER_OVERRIDE | TIMER_UNIQUE)) if(z_flags & ZMM_MANGLE_PLANES) - addtimer(CALLBACK(user, /mob/proc/check_emissive_equipment), 0, TIMER_UNIQUE) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, check_emissive_equipment)), 0, TIMER_UNIQUE) RAISE_EVENT(/decl/observ/mob_equipped, user, src, slot) RAISE_EVENT_REPEAT(/decl/observ/item_equipped, src, user, slot) @@ -449,8 +519,8 @@ //the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. //Set disable_warning to 1 if you wish it to not give you outputs. //Set ignore_equipped to 1 if you wish to ignore covering checks etc. when this item is already equipped. -/obj/item/proc/mob_can_equip(mob/M, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) - if(!slot || !M) +/obj/item/proc/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) + if(!slot || !user) return FALSE // Some slots don't have an associated handler as they are shorthand for various setup functions. @@ -458,37 +528,37 @@ switch(slot) // Putting stuff into backpacks. if(slot_in_backpack_str) - var/obj/item/storage/backpack/backpack = M.get_equipped_item(slot_back_str) - return istype(backpack) && backpack.can_be_inserted(src, M, TRUE) + var/obj/item/storage/backpack/backpack = user.get_equipped_item(slot_back_str) + return istype(backpack) && backpack.can_be_inserted(src, user, TRUE) // Equipping accessories. if(slot_tie_str) // Find something to equip the accessory to. for(var/check_slot in list(slot_w_uniform_str, slot_wear_suit_str)) - var/obj/item/clothing/check_gear = M.get_equipped_item(check_slot) + var/obj/item/clothing/check_gear = user.get_equipped_item(check_slot) if(istype(check_gear) && check_gear.can_attach_accessory(src)) return TRUE if(!disable_warning) - to_chat(M, SPAN_WARNING("You need to be wearing something you can attach \the [src] to.")) + to_chat(user, SPAN_WARNING("You need to be wearing something you can attach \the [src] to.")) return FALSE - var/datum/inventory_slot/inv_slot = M.get_inventory_slot_datum(slot) + var/datum/inventory_slot/inv_slot = user.get_inventory_slot_datum(slot) if(!inv_slot) return FALSE if(!force) - if(!ignore_equipped && !inv_slot.is_accessible(M, src, disable_warning)) + if(!ignore_equipped && !inv_slot.is_accessible(user, src, disable_warning)) return FALSE - if(!inv_slot.can_equip_to_slot(M, src, disable_warning, ignore_equipped)) + if(!inv_slot.can_equip_to_slot(user, src, disable_warning, ignore_equipped)) return FALSE return TRUE -/obj/item/proc/mob_can_unequip(mob/M, slot, disable_warning = 0) - if(!slot || !M || !canremove) +/obj/item/proc/mob_can_unequip(mob/user, slot, disable_warning = FALSE) + if(!slot || !user || !canremove) return FALSE - var/datum/inventory_slot/inv_slot = M.get_inventory_slot_datum(slot) - return inv_slot?.is_accessible(M, src, disable_warning) + var/datum/inventory_slot/inv_slot = user.get_inventory_slot_datum(slot) + return inv_slot?.is_accessible(user, src, disable_warning) /obj/item/proc/can_be_dropped_by_client(mob/M) return M.canUnEquip(src) @@ -562,7 +632,7 @@ /obj/item/reveal_blood() if(was_bloodied && !fluorescent) - fluorescent = 1 + fluorescent = FLUORESCENT_GLOWS blood_color = COLOR_LUMINOL blood_overlay.color = COLOR_LUMINOL update_icon() @@ -661,12 +731,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. user.visible_message("\The [user] peers through [zoomdevicename ? "the [zoomdevicename] of [src]" : "[src]"].") - events_repository.register(/decl/observ/destroyed, user, src, /obj/item/proc/unzoom) - events_repository.register(/decl/observ/moved, user, src, /obj/item/proc/unzoom) - events_repository.register(/decl/observ/dir_set, user, src, /obj/item/proc/unzoom) - events_repository.register(/decl/observ/item_unequipped, src, src, /obj/item/proc/zoom_drop) + events_repository.register(/decl/observ/destroyed, user, src, TYPE_PROC_REF(/obj/item, unzoom)) + events_repository.register(/decl/observ/moved, user, src, TYPE_PROC_REF(/obj/item, unzoom)) + events_repository.register(/decl/observ/dir_set, user, src, TYPE_PROC_REF(/obj/item, unzoom)) + events_repository.register(/decl/observ/item_unequipped, src, src, TYPE_PROC_REF(/obj/item, zoom_drop)) if(isliving(user)) - events_repository.register(/decl/observ/stat_set, user, src, /obj/item/proc/unzoom) + events_repository.register(/decl/observ/stat_set, user, src, TYPE_PROC_REF(/obj/item, unzoom)) /obj/item/proc/zoom_drop(var/obj/item/I, var/mob/user) unzoom(user) @@ -676,12 +746,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. return zoom = 0 - events_repository.unregister(/decl/observ/destroyed, user, src, /obj/item/proc/unzoom) - events_repository.unregister(/decl/observ/moved, user, src, /obj/item/proc/unzoom) - events_repository.unregister(/decl/observ/dir_set, user, src, /obj/item/proc/unzoom) - events_repository.unregister(/decl/observ/item_unequipped, src, src, /obj/item/proc/zoom_drop) + events_repository.unregister(/decl/observ/destroyed, user, src, TYPE_PROC_REF(/obj/item, unzoom)) + events_repository.unregister(/decl/observ/moved, user, src, TYPE_PROC_REF(/obj/item, unzoom)) + events_repository.unregister(/decl/observ/dir_set, user, src, TYPE_PROC_REF(/obj/item, unzoom)) + events_repository.unregister(/decl/observ/item_unequipped, src, src, TYPE_PROC_REF(/obj/item, zoom_drop)) if(isliving(user)) - events_repository.unregister(/decl/observ/stat_set, user, src, /obj/item/proc/unzoom) + events_repository.unregister(/decl/observ/stat_set, user, src, TYPE_PROC_REF(/obj/item, unzoom)) if(!user.client) return @@ -826,12 +896,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. return TRUE /obj/item/proc/reconsider_client_screen_presence(var/client/client, var/slot) - if(!ismob(loc) || !client) // Storage handles screen loc updating/setting itself so should be fine - screen_loc = null - else if(client) + if(!client) + return + if(client.mob?.item_should_have_screen_presence(src, slot)) client.screen |= src - if(!client.mob?.item_should_have_screen_presence(src, slot)) - screen_loc = null + else + client.screen -= src /obj/item/proc/gives_weather_protection() return FALSE @@ -857,3 +927,22 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. else if(current_size > STAGE_ONE) step_towards(src,S) else ..() + +/obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) + . = (loc == user && istype(over, /obj/screen)) || ..() + +// Supplied during loadout gear tweaking. +/obj/item/proc/set_custom_name(var/new_name) + SetName(new_name) + +// Supplied during loadout gear tweaking. +/obj/item/proc/set_custom_desc(var/new_desc) + desc = new_desc + +/obj/item/proc/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + if(loaded_cell_type && accepted_cell_type) + set_extension(src, (power_supply_extension_type || /datum/extension/loaded_cell), accepted_cell_type, loaded_cell_type, charge_value) + +/obj/item/proc/handle_loadout_equip_replacement(obj/item/old_item) + return diff --git a/code/game/objects/item_damage.dm b/code/game/objects/item_damage.dm index b9302da4318..fa8caf7822b 100644 --- a/code/game/objects/item_damage.dm +++ b/code/game/objects/item_damage.dm @@ -18,6 +18,7 @@ return 0 //must return a number //Apply damage + damage = min(health, damage) health = clamp(health - damage, 0, max_health) check_health(damage, damage_type, damage_flags) return damage @@ -27,6 +28,16 @@ return TRUE . = (!throwing) ? ..() : FALSE +// We only do this for the extension as other stuff that overrides get_cell() handles EMP in an override. +/obj/item/emp_act(var/severity) + // we do not use get_cell() here as some devices may return a non-extension cell + var/datum/extension/loaded_cell/cell_loaded = get_extension(src, /datum/extension/loaded_cell) + var/obj/item/cell/cell = cell_loaded?.get_cell() + if(cell) + cell.emp_act(severity) + update_icon() + return ..() + /obj/item/explosion_act(severity) if(QDELETED(src)) return @@ -115,25 +126,3 @@ M.take_organ_damage(7) SET_STATUS_MAX(M, STAT_BLURRY, rand(3,4)) return - -/obj/item/get_examined_damage_string(health_ratio) - if(!can_take_damage()) - return - . = ..() - -///Returns whether the item can take damages or if its invulnerable -/obj/item/proc/can_take_damage() - return (health != ITEM_HEALTH_NO_DAMAGE) && (max_health != ITEM_HEALTH_NO_DAMAGE) - -///Returns whether the object is currently damaged. -/obj/item/proc/is_damaged() - return can_take_damage() && (health < max_health) - -///Returns the percentage of health remaining for this object. -/obj/item/proc/get_percent_health() - return can_take_damage()? round((health * 100)/max_health, 0.01) : 100 - -///Returns the percentage of damage done to this object. -/obj/item/proc/get_percent_damage() - //Clamp from 0 to 100 so health values larger than max_health don't return unhelpful numbers - return clamp(100 - get_percent_health(), 0, 100) \ No newline at end of file diff --git a/code/game/objects/item_interactions.dm b/code/game/objects/item_interactions.dm index 856871e9baa..01f887cf4ff 100644 --- a/code/game/objects/item_interactions.dm +++ b/code/game/objects/item_interactions.dm @@ -1,6 +1,6 @@ /obj/item/get_alt_interactions(var/mob/user) . = ..() - if(config.expanded_alt_interactions) + if(get_config_value(/decl/config/toggle/expanded_alt_interactions)) LAZYADD(., list( /decl/interaction_handler/pick_up, /decl/interaction_handler/drop, diff --git a/code/game/objects/item_materials.dm b/code/game/objects/item_materials.dm index 60af82df511..f86ccb33173 100644 --- a/code/game/objects/item_materials.dm +++ b/code/game/objects/item_materials.dm @@ -8,7 +8,7 @@ if(blood_overlay) add_overlay(blood_overlay) if(global.contamination_overlay && contaminated) - overlays += global.contamination_overlay + add_overlay(global.contamination_overlay) /obj/item/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) . = ..() @@ -45,21 +45,6 @@ return physically_destroyed() -/obj/item/melt() - for(var/mat in matter) - var/decl/material/M = GET_DECL(mat) - if(!M) - log_warning("[src] ([type]) has a bad material path in its matter var.") - continue - var/turf/T = get_turf(src) - //TODO: Would be great to just call a proc to do that, like "Material.place_burn_product(loc, amount_matter)" so no need to care if its a gas or something else - var/datum/gas_mixture/environment = T?.return_air() - if(M.burn_product) - environment.adjust_gas(M.burn_product, M.fuel_value * (matter[mat] / SHEET_MATERIAL_AMOUNT)) - - new /obj/effect/decal/cleanable/molten_item(src) - qdel(src) - /obj/item/proc/shatter(var/consumed) var/turf/T = get_turf(src) T?.visible_message(SPAN_DANGER("\The [src] [material ? material.destruction_desc : "shatters"]!")) diff --git a/code/game/objects/item_mob_overlay.dm b/code/game/objects/item_mob_overlay.dm index a2c075c55b4..6f873e024da 100644 --- a/code/game/objects/item_mob_overlay.dm +++ b/code/game/objects/item_mob_overlay.dm @@ -23,7 +23,7 @@ var/global/list/bodypart_to_slot_lookup_table = list( // you can reasonably expect the icon_state to exist beforehand, or if you can cache the // value somewhere (as done below with use_single_icon in /obj/item/Initialize()). var/global/list/icon_state_cache = list() -/proc/check_state_in_icon(var/checkstate, var/checkicon, var/high_accuracy = FALSE) +/proc/check_state_in_icon(var/checkstate, var/checkicon) // isicon() is apparently quite expensive so short-circuit out early if we can. if(!istext(checkstate) || isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) return FALSE @@ -53,44 +53,44 @@ var/global/list/icon_state_cache = list() ..() update_world_inventory_state() -/mob/proc/get_bodytype_category() - return - /obj/item/reset_plane_and_layer() ..() update_world_inventory_state() -/obj/item/proc/get_mob_overlay(mob/user_mob, slot, bodypart) +/obj/item/proc/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE) + var/state_modifier = user_mob?.get_overlay_state_modifier() if(!use_single_icon) - var/mob_state = (item_state || icon_state) + var/mob_state = "[item_state || icon_state][state_modifier]" var/mob_icon = global.default_onmob_icons[slot] var/decl/bodytype/root_bodytype = user_mob.get_bodytype() if(istype(root_bodytype)) var/use_slot = (bodypart in root_bodytype.equip_adjust) ? bodypart : slot - return root_bodytype.get_offset_overlay_image(FALSE, mob_icon, mob_state, color, use_slot) + return root_bodytype.get_offset_overlay_image(mob_icon, mob_state, color, use_slot) return overlay_image(mob_icon, mob_state, color, RESET_COLOR) - var/bodytype = user_mob?.get_bodytype_category() || BODYTYPE_HUMANOID - var/useicon = get_icon_for_bodytype(bodytype) - if(bodytype != BODYTYPE_HUMANOID && !check_state_in_icon("[bodytype]-[slot]", useicon)) + var/bodytype = user_mob?.get_bodytype_category() || BODYTYPE_HUMANOID + var/useicon = get_icon_for_bodytype(bodytype) + var/use_state = "[bodytype]-[slot][state_modifier]" + + if(bodytype != BODYTYPE_HUMANOID && !check_state_in_icon(use_state, useicon) && use_fallback_if_icon_missing) var/fallback = get_fallback_slot(slot) - if(fallback && fallback != slot && check_state_in_icon("[bodytype]-[fallback]", useicon)) + if(fallback && fallback != slot && check_state_in_icon("[bodytype]-[fallback][state_modifier]", useicon)) slot = fallback else bodytype = BODYTYPE_HUMANOID useicon = get_icon_for_bodytype(bodytype) + use_state = "[bodytype]-[slot][state_modifier]" - var/use_state = "[bodytype]-[slot]" if(!check_state_in_icon(use_state, useicon) && global.bodypart_to_slot_lookup_table[slot]) - use_state = "[bodytype]-[global.bodypart_to_slot_lookup_table[slot]]" + use_state = "[bodytype]-[global.bodypart_to_slot_lookup_table[slot]][state_modifier]" if(!check_state_in_icon(use_state, useicon)) - var/fallback = get_fallback_slot(slot) + var/fallback = use_fallback_if_icon_missing && get_fallback_slot(slot) if(!fallback) return new /image slot = fallback - use_state = "[bodytype]-[slot]" + use_state = "[bodytype]-[slot][state_modifier]" if(!check_state_in_icon(use_state, useicon)) return new /image @@ -98,7 +98,7 @@ var/global/list/icon_state_cache = list() var/image/I = image(useicon, use_state) I.color = color I.appearance_flags = RESET_COLOR - . = adjust_mob_overlay(user_mob, bodytype, I, slot, bodypart) + . = adjust_mob_overlay(user_mob, bodytype, I, slot, bodypart, use_fallback_if_icon_missing) /obj/item/proc/get_fallback_slot(var/slot) return @@ -109,21 +109,18 @@ var/global/list/icon_state_cache = list() // Ensure ..() is called only at the end of this proc, and that `overlay` is mutated rather than replaced. // This is necessary to ensure that all the overlays are generated and tracked prior to being passed to // the bodytype offset proc, which can scrub icon/icon_state information as part of the offset process. -/obj/item/proc/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) - if(ishuman(user_mob)) - var/mob/living/carbon/human/H = user_mob - var/decl/bodytype/root_bodytype = H.get_bodytype() - if(root_bodytype.bodytype_category != bodytype) - var/list/overlays_to_offset = overlay.overlays - overlay = root_bodytype.get_offset_overlay_image(FALSE, overlay.icon, overlay.icon_state, color, (bodypart || slot)) - for(var/thing in overlays_to_offset) - var/image/I = thing // Technically an appearance but don't think we can cast to those - var/image/adjusted_overlay = root_bodytype.get_offset_overlay_image(FALSE, I.icon, I.icon_state, I.color, (bodypart || slot)) - adjusted_overlay.appearance_flags = I.appearance_flags - adjusted_overlay.plane = I.plane - adjusted_overlay.layer = I.layer - overlay.overlays += adjusted_overlay - +/obj/item/proc/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) + var/decl/bodytype/root_bodytype = user_mob?.get_bodytype() + if(root_bodytype && root_bodytype.bodytype_category != bodytype) + var/list/overlays_to_offset = overlay.overlays + overlay = root_bodytype.get_offset_overlay_image(overlay.icon, overlay.icon_state, color, (bodypart || slot)) + for(var/thing in overlays_to_offset) + var/image/I = thing // Technically an appearance but don't think we can cast to those + var/image/adjusted_overlay = root_bodytype.get_offset_overlay_image(I.icon, I.icon_state, I.color, (bodypart || slot)) + adjusted_overlay.appearance_flags = I.appearance_flags + adjusted_overlay.plane = I.plane + adjusted_overlay.layer = I.layer + overlay.overlays += adjusted_overlay . = overlay //Special proc belts use to compose their icon diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 5811667fb0b..c9c67e53fc7 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/blueprints.dmi' icon_state = "blueprints" attack_verb = list("attacked", "bapped", "hit") - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/paper var/valid_z_levels = list() var/area_prefix @@ -105,8 +105,8 @@ if(isnull(shuttle_name)) shuttle_name = S.shuttle update_linked_name(S, null, S.name) - events_repository.register(/decl/observ/name_set, S, src, .proc/update_linked_name) - events_repository.register(/decl/observ/destroyed, S, src, .proc/on_shuttle_destroy) + events_repository.register(/decl/observ/name_set, S, src, PROC_REF(update_linked_name)) + events_repository.register(/decl/observ/destroyed, S, src, PROC_REF(on_shuttle_destroy)) valid_z_levels += S.map_z area_prefix = S.name return TRUE @@ -119,8 +119,8 @@ desc = "Blueprints of \the [new_name]. There are several coffee stains on it." /obj/item/blueprints/shuttle/proc/on_shuttle_destroy(datum/destroyed) - events_repository.unregister(/decl/observ/name_set, destroyed, src, .proc/update_linked_name) - events_repository.unregister(/decl/observ/destroyed, destroyed, src, .proc/on_shuttle_destroy) + events_repository.unregister(/decl/observ/name_set, destroyed, src, PROC_REF(update_linked_name)) + events_repository.unregister(/decl/observ/destroyed, destroyed, src, PROC_REF(on_shuttle_destroy)) name = initial(name) desc = "Some dusty old blueprints. The markings are old, and seem entirely irrelevant for your wherabouts." valid_z_levels = list() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 435021e5aa6..1febbfd8949 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -6,8 +6,8 @@ icon = 'icons/obj/closets/bodybag.dmi' icon_state = "bodybag_folded" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic - + material = /decl/material/solid/organic/plastic + /obj/item/bodybag/attack_self(mob/user) var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) R.add_fingerprint(user) @@ -75,7 +75,7 @@ . = new item_path(get_turf(src)) qdel(src) -/obj/structure/closet/body_bag/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/structure/closet/body_bag/handle_mouse_drop(atom/over, mob/user, params) if(over == user && (in_range(src, user) || (src in user.contents))) fold(user) return TRUE diff --git a/code/game/objects/items/books/_book.dm b/code/game/objects/items/books/_book.dm index 0134843ce43..f4806822104 100644 --- a/code/game/objects/items/books/_book.dm +++ b/code/game/objects/items/books/_book.dm @@ -6,8 +6,8 @@ throw_range = 5 w_class = ITEM_SIZE_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") - material = /decl/material/solid/plastic - matter = list(/decl/material/solid/paper = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/plastic + matter = list(/decl/material/solid/organic/paper = MATTER_AMOUNT_REINFORCEMENT) var/dat // Actual page content var/pencode_dat // Cache pencode if input, so it can be edited later. @@ -34,6 +34,19 @@ if(SSpersistence.is_tracking(src, /decl/persistence_handler/book)) . = QDEL_HINT_LETMELIVE +/obj/item/book/proc/get_style_css() + return {" + + "} + /obj/item/book/attack_self(var/mob/user) return try_to_read(user) || ..() diff --git a/code/game/objects/items/books/fluff/_fluff.dm b/code/game/objects/items/books/fluff/_fluff.dm new file mode 100644 index 00000000000..f7ce2ae2fbd --- /dev/null +++ b/code/game/objects/items/books/fluff/_fluff.dm @@ -0,0 +1,20 @@ +/obj/item/book/fluff + unique = TRUE + abstract_type = /obj/item/book/fluff + var/fluff_text + +/obj/item/book/fluff/Initialize() + . = ..() + if(!fluff_text) + log_debug("Fluff book [type] spawned with no fluff text.") + return INITIALIZE_HINT_QDEL + dat = {" + + + [get_style_css()] + + + [fluff_text] + + + "} diff --git a/code/game/objects/items/books/fluff/science.dm b/code/game/objects/items/books/fluff/science.dm new file mode 100644 index 00000000000..830026a5bb9 --- /dev/null +++ b/code/game/objects/items/books/fluff/science.dm @@ -0,0 +1,133 @@ +/obj/item/book/fluff/anomaly_spectroscopy + name = "Spectroscopy: Analysing the Anomalies of the Cosmos" + icon_state = "anomaly" + author = "Doctor Martin Boyle, Director Research at the Lower Hydrolian Sector Listening Array" + title = "Spectroscopy: Analysing the Anomalies of the Cosmos" + fluff_text = {" + It's perhaps one of the most exciting times to be alive, with the recent breakthroughs in understanding and categorisation of things we may one day no longer call + 'anomalies,' but rather 'infrequent or rare occurrences of certain celestial weather or phenomena.' Perhaps a little more long winded, but no less eloquent all the + same! Why, look at the strides we're making in piercing the walls of spacetime or our steadily improving ability to clarify and stabilise subspace emissions; it's + certainly an exciting time to be alive. For the moment, the Hydrolian hasn't seen two spatial anomalies alike but the day will come and it is soon, I can feel it. + "} + +/obj/item/book/fluff/materials_chemistry_analysis + name = "Materials Analysis and the Chemical Implications" + icon_state = "chemistry" + author = "Jasper Pascal, Senior Lecturer in Materials Analysis at the University of Jol'Nar" + title = "Materials Analysis and the Chemical Implications" + fluff_text = {" + In today's high tech research fields, leaps and bounds are being made every day. Whether it's great strides forward in our understanding of the physical universe + or the operation of some fancy new piece of equipment, it seems like all the cool fields are producing new toys to play with, leaving doddery old fields such as + materials analysis and chemistry relegated to the previous few centuries, when we were still learning the makeup and structure of the elements. +

+ Well, when you're out there building the next gryo-whatsitron or isotope mobility thingummy, remember how the field of archaeology experienced a massive new rebirth + following the excavations at Paranol IV and consider how all of the scientific greats will come crawling back to basic paradigms of natural philosophy when they discover + a new element that defies classification. I defy you to classify it without reviving this once great field! + "} + +/obj/item/book/fluff/anomaly_testing + name = "Anomalous Materials and Energies" + icon_state = "triangulate" + author = "Norman York, formerly of the Tyrolion Institute on Titan" + title = "Anomalous Materials and Energies" + fluff_text = {" +

Contents

+
    +
  1. Foreword: Modern attitude towards anomalies
  2. +
  3. Triangulating anomalous energy readings
  4. +
  5. Harvesting and utilising anomalous energy signatures
  6. +
+
+

Modern attitude towards anomalies

+ It's only when confronted with things we don't know, that we may push back our knowledge of the world around us. Nowhere is this more obvious than the + vast and inscrutable mysterious of the cosmos that scholars from such august institutions as the Elysian Institute of the Sciences present + formulas and hypotheses for every few decades.
+
+ Using our vast, telescopic array installations and deep space satellite networks, we are able to detect anomalous energy fields and formations in deep space, + but are limited to those that are large enough to output energy that will stretch across light years worth of distance between stars.
+
+ While some sectors (such as the Hydrolian Rift and Keppel's Run) are replete with inexplicable energetic activity and unique phenomena found nowhere else in + the galaxy, the majority of space is dry, barren and cold - and if past experience has told us anything, it is that there are always more things we are + unable to explain.
+
+ Indeed, a great source of knowledge and technology has always been those who come before us, in the form of the multitudinous ancient alien precursors that + have left scattered remnants of their great past all over settled (and unexplored) space.
+
+ It is from xenoarchaeologists, high energy materials researchers, and technology reconstruction authorities that we are able to theorise on the gifts these + species have left behind, and in some cases even reverse engineer or rebuild the technology in question. My colleague, Doctor Raymond Ward of the + Tyrolian Institute on Titan, has made great breakthroughs in a related field through his pioneering development of universally reflective materials capable + of harvesting and 'bottling' up virtually any energy emissions yet encountered by spacefaring civilisations.
+
+ And yet, there are some amongst us who do not see the benefits of those who have come before us - indeed, some among them profess the opinion that there + is no species that could possibly match humanity in it's achievements and knowledge, or simply that employing non-human technology is dangerous and unethical. + Folly, say I. If it is their desire to throw onto the wayside the greatest achievements in the history of the galaxy, simply for preferment of the + greatest achievements in the history of mankind, then they have no business in the establishment of science.
+ Contents +

Triangulating anomalous energy readings

+ Strong energy emissions, when remaining constant from any one fixed location for millennia, can leave an 'imprint' or distinctive energy signature on other + matter composites that are spatially fixed relative to the source.
+
+ By taking samples of such 'fixed' matter, we can apply complex analytics such as the modified Fourier Transform Procedure to reverse engineer the path of the + energy, and determine the approximate distance and direction that the energy source is, relative to the sample's point in space. Modern portable devices can do + all this purely by taking readings of local radiation.
+
+ A canny researcher can thusly analyse radiation at pre-chosen points strategically scattered around an area, and if there are any anomalous energy + emissions in range of those points, combined the researcher can triangulate the source.
+ Contents +

Harvesting and utilising anomalous energy signatures

+ As mentioned in the foreword, my colleague from the Tyrolian Institute on Saturn's moon of Titan, in the Sol System, Doctor Raymond Ward has made great strides + in the area of harvesting and application of the energy emitted by anomalous phenomena from around the galaxy (although I profess I have not yet seen him + venture further from his birthplace on Earth than the comfortable distance of the Sol Cis-Oort Satellite Sphere).
+
+ By employing a patented semi-phased alloy with unique and fascinating properties, Ward's contraption is able to 'harvest' energy, store + it and redirect it later at will (with appropriate electronic mechanisms, of course). Although he professes to see or desire no commercial or material gain + for the application and use of said energy once it is harvested, there are no doubt myriad ways we can come to benefit from such things beyond mere research, + such as the reconstruction of torn cartilaginous tissue that a peculiar radiation from an amphibious species on Brachis IV was found to emit.
+ Contents + "} + +/obj/item/book/fluff/stasis + name = "Cellular Suspension, the New Cryogenics?" + icon_state = "stasis" + author = "Elvin Schmidt" + title = "Cellular Suspension, the New Cryogenics?" + fluff_text = {" +

Contents

+
    +
  1. Foreword: A replacement for cryosleep?
  2. +
  3. The breakthrough
  4. +
  5. Applying this new principle
  6. +
+
+

Foreword: A replacement for cryosleep?

+ The development of rudimentary cryofreezing in the 20th and 21st centuries was hailed as a crank science by some, but many early visionaries recognised the + potential it had to change the way we approach so many fields, such as medicine, therapeutics, and space travel. It was breakthroughs in the field in the 22nd and + later centuries that turned the procedure from science fiction to science fact, however. Since then, cryogenics has become a hallmark of modern science, and + regarded as one of the great achievements of our era. As with all sciences however, they have their time and are superseded by newer technological miracles when + it is over.
+ Contents +

The breakthrough

+ It was in examining the effects of decelerated high energy particles when transphased through a gravitational lens that the effects where primarily noticed. + Due to exigent properties of that dimension, transphasing those particles capable of existing with high stability levels has the effect of bringing + some of those effects into realspace. Examining the Hoffman emissions in particular, it was discovered that they exhibited a-entropic behaviour, and in what is + now termed the 'Effete Hoffman Principle,' it was found that metastabilising the Hoffman radiation resulted in the effect being applied across other physical + interactions, in particular forces and reactions.
+ Contents +

Applying this new principle

+ When combined with an appropriate energy-effect replicate for cryogenics (slowing down biological activity, thus stabilising the organics), the effect is + effectively identical to cryogenics, and while it consumes vastly more power and requires extremely complex equipment, it's (for all intents and purposes) superior + to cryogenics, all that remains is to 'commercialise' the process by enabling cheaper development and mass production.
+ The Effete Hoffman Principle can be tweak-combined with other effects however, for different purposes. A division of PMC Research initially developed the application + in prisons as a literal 'suspension field' where convicts are held immobile in the air, and the use quickly spread to numerous other areas.
+
+ By examining the material resonance properties of certain strong waveforms when combined with Hoffman radiation, an effect was produced able to reverse energy + transferral through matter, and to slow the effects of gravity. When combined with energy repulse technology, the triple effects compound themselves into a much + stronger field, although all three components do slightly different things. High energy researchers assure me of the following key points:
+
    +
  • The energy repulsion factor provides a 'shell' capable of weak suspension.
  • +
  • The Hoffman emissions nullify energy transferral and other kinetic activity, maintaining stability inside the field.
  • +
  • The resonant waveform combines the effects of the above two points, and applies it magnified onto it's synced 'resonance' materials.
  • +
+ As an interesting aside, a carbon waveform was chosen for the field in prison suspension fields, due to it's resonance with organic matter.
+ Contents + "} diff --git a/code/game/objects/items/books/manuals/_manual.dm b/code/game/objects/items/books/manuals/_manual.dm index aa5c491e6f1..7cee55d5709 100644 --- a/code/game/objects/items/books/manuals/_manual.dm +++ b/code/game/objects/items/books/manuals/_manual.dm @@ -1,27 +1,21 @@ /obj/item/book/manual - icon = 'icons/obj/library.dmi' - unique = 1 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified - var/url // Using full url or just tittle, example - Standard_Operating_Procedure (https://wiki.baystation12.net/index.php?title=Standard_Operating_Procedure) + unique = TRUE // Unable to be copied, unable to be modified + abstract_type = /obj/item/book/manual + var/guide_decl /obj/item/book/manual/Initialize() . = ..() - if(url) // URL provided for this manual - // If we haven't wikiurl or it included in url - just use url - if(config.wikiurl && !findtextEx(url, config.wikiurl, 1, length(config.wikiurl)+1)) - // If we have wikiurl, but it hasn't "index.php" then add it and making full link in url - if(config.wikiurl && !findtextEx(config.wikiurl, "/index.php", -10)) - if(findtextEx(config.wikiurl, "/", -1)) - url = config.wikiurl + "index.php?title=" + url - else - url = config.wikiurl + "/index.php?title=" + url - else //Or just making full link in url - url = config.wikiurl + "?title=" + url - dat = {" - - - - - - - - "} + var/guide_text = guide_decl && SScodex.get_manual_text(guide_decl) + if(!guide_text) + log_debug("Manual [type] spawned with invalid guide decl type ([guide_decl || null]).") + return INITIALIZE_HINT_QDEL + dat = {" + + + [get_style_css()] + + + [guide_text] + + + "} diff --git a/code/game/objects/items/books/manuals/engineering.dm b/code/game/objects/items/books/manuals/engineering.dm index cf54e3895fd..555b10c44e6 100644 --- a/code/game/objects/items/books/manuals/engineering.dm +++ b/code/game/objects/items/books/manuals/engineering.dm @@ -1,685 +1,76 @@ /obj/item/book/manual/engineering_guide - name = "Engineering Textbook" + name = "engineering reference manual" icon_state ="bookEngineering2" author = "Engineering Encyclopedia" title = "Engineering Textbook" - url = "Engineering" + guide_decl = /datum/codex_entry/guide/engineering /obj/item/book/manual/robotics_cyborgs - name = "Cyborgs for Dummies" + name = "robotics reference manual" icon_state = "borgbook" author = "XISC" title = "Cyborgs for Dummies" - - dat = {" - - - - - -

Cyborgs for Dummies

- -

Chapters

- -
    -
  1. Cyborg Related Equipment
  2. -
  3. Cyborg Modules
  4. -
  5. Cyborg Construction
  6. -
  7. Cyborg Maintenance
  8. -
  9. Cyborg Repairs
  10. -
  11. In Case of Emergency
  12. -
- - -

Cyborg Related Equipment

- -

Exosuit Fabricator

- The Exosuit Fabricator is the most important piece of equipment related to cyborgs. It allows the construction of the core cyborg parts. Without these machines, cyborgs cannot be built. It seems that they may also benefit from advanced research techniques. - -

Cyborg Recharging Station

- This useful piece of equipment will suck power out of the power systems to charge a cyborg's power cell back up to full charge. - -

Robotics Control Console

- This useful piece of equipment can be used to immobilize or destroy a cyborg. A word of warning: Cyborgs are expensive pieces of equipment, do not destroy them without good reason, or the Company may see to it that it never happens again. - - -

Cyborg Modules

- When a cyborg is created it picks out of an array of modules to designate its purpose. There are 11 different cyborg modules.
- All cyborg modules carry a flash. - -

Standard Cyborg

- The standard cyborg module is a multi-purpose cyborg. It is equipped with various modules, allowing it to do basic tasks.
A Standard Cyborg comes with: -
    -
  • Crowbar
  • -
  • Wrench
  • -
  • Stun Baton
  • -
  • Health Analyzer
  • -
  • Fire Extinguisher
  • -
- -

Research Cyborg

- The research cyborg module is an effective researching machine. It is equipped with tools to effectively run RnD.A Research Cyborg comes with: -
    -
  • Portable Destructive Analyzer
  • -
  • Research Gripper
  • -
  • Sheet Loader
  • -
  • Robot Analyzer
  • -
  • Robot Card
  • -
  • Set of Engineering Tools
  • -
  • Laser Scalpel
  • -
  • Circular Saw
  • -
  • Fire Extinguisher
  • -
  • Syringe
  • -
  • Chemistry Gripper
  • -
  • Nanopaste
  • -
- -

Engineering Cyborg

- The Engineering cyborg module comes equipped with various engineering-related tools to help with engineering-related tasks.
An Engineering Cyborg comes with: -
    -
  • A basic set of engineering tools
  • -
  • Metal Synthesizer
  • -
  • Plasteel Synthesizer
  • -
  • Reinforced Glass Synthesizer
  • -
  • Wire Synthesizer
  • -
  • Fire Extinguisher
  • -
  • Roll of Tape
  • -
  • Built-in Optical Meson Scanners
  • -
- -

Mining Cyborg

- The Mining Cyborg module comes equipped with the latest in mining equipment. They are efficient at mining due to no need for oxygen, but their power cells limit their time in the mines.
A Mining Cyborg comes with: -
    -
  • Wrench
  • -
  • Scredriver
  • -
  • Crowbar
  • -
  • Ore Satchel
  • -
  • Borg Drill
  • -
  • Mining Gripper
  • -
  • Ore Scanner
  • -
- -

Security Cyborg

- The Security Cyborg module is equipped with effective security measures used to apprehend and arrest criminals.
A Security Cyborg comes with: -
    -
  • Stun Baton
  • -
  • Handcuffs
  • -
  • Energy Gun
  • -
  • Megaphone
  • -
  • Roll of Tape
  • -
- -

Janitor Cyborg

- The Janitor Cyborg module is equipped with various cleaning-facilitating devices.
A Janitor Cyborg comes with: -
    -
  • Mop
  • -
  • Hand Bucket
  • -
  • Cleaning Spray Synthesizer and Spray Nozzle
  • -
  • Light Replacer
  • -
  • Trash Bag
  • -
- -

Service Cyborg

- The service cyborg module comes ready to serve your human needs. It includes various entertainment and refreshment devices. Occasionally some service cyborgs may have been referred to as "Bros."
A Service Cyborg comes with: -
    -
  • Service Gripper
  • -
  • Bucket
  • -
  • Hoe
  • -
  • Hatchet
  • -
  • Zippo Lighter
  • -
  • Rapid-Service-Fabricator (Produces various entertainment and refreshment objects)
  • -
  • Plant Analyzer
  • -
  • Robot Harvester
  • -
  • Rolling Pin
  • -
  • Knife
  • -
- -

Clerical Cyborg

- The clerical cyborg module is prepared to run the supply department, including a vareity of stamps.
A clerical cyborg comes with: -
    -
  • Pen
  • -
  • Paper Dispenser
  • -
  • Clerical Gripper
  • -
  • Hand Labeler
  • -
  • Generic Stamp
  • -
  • Denied Stamp
  • -
  • Package Wrapper
  • -
  • Destination Tagger
  • -
- -

Crisis Cyborg

- The crisis cyborg module is prepared to handle a variety of non-surgical medical emergencies.
A medical cyborg comes with: -
    -
  • Crowbar
  • -
  • Health Analyzer
  • -
  • Reagent Scanner
  • -
  • Roller Bed Rack
  • -
  • Body Bag Rack
  • -
  • Hypospray
  • -
  • Automatic Defibrillator
  • -
  • Industrial Dropper
  • -
  • Syringe
  • -
  • Chemistry Gripper
  • -
  • Fire Extinguisher
  • -
  • Inflatables Dispenser
  • -
  • Roll of Tape
  • -
- -

Surgeon Cyborg

- The surgeon cyborg modules is prepared to handle a variety of surgical medical emergencies.
A medical cyborg comes with: -
    -
  • Set of Surgery Tools
  • -
  • Health Analyzer
  • -
  • Roller Bed Rack
  • -
  • Body Bag Rack
  • -
  • Hypospray
  • -
  • Automatic Defibrillator
  • -
  • Industrial Dropper
  • -
  • Syringe
  • -
  • Chemistry Gripper
  • -
  • Fire Extinguisher
  • -
  • Inflatables Dispenser
  • -
  • Roll of Tape
  • -
- -

Cyborg Construction

- Cyborg construction is a rather easy process, requiring a decent amount of metal and a few other supplies.
The required materials to make a cyborg are: -
    -
  • Metal
  • -
  • Two Flashes
  • -
  • One Power Cell (Preferably rated to 15000w)
  • -
  • Some electrical wires
  • -
  • One Human Brain
  • -
  • One Man-Machine Interface
  • -
- Once you have acquired the materials, you can start on construction of your cyborg.
To construct a cyborg, follow the steps below: -
    -
  1. Start the Exosuit Fabricators constructing all of the cyborg parts
  2. -
  3. While the parts are being constructed, take your human brain, and place it inside the Man-Machine Interface
  4. -
  5. Once you have a Robot Head, place your two flashes inside the eye sockets
  6. -
  7. Once you have your Robot Chest, wire the Robot chest, then insert the power cell
  8. -
  9. Attach all of the Robot parts to the Robot frame
  10. -
  11. Insert the Man-Machine Interface (With the Brain inside) into the Robot Body
  12. -
  13. Congratulations! You have a new cyborg!
  14. -
- -

Cyborg Maintenance

- Occasionally Cyborgs may require maintenance of a couple types, this could include replacing a power cell with a charged one, or possibly maintaining the cyborg's internal wiring. - -

Replacing a Power Cell

- Replacing a Power cell is a common type of maintenance for cyborgs. It usually involves replacing the cell with a fully charged one, or upgrading the cell with a larger capacity cell.
The steps to replace a cell are as follows: -
    -
  1. Unlock the Cyborg's Interface by swiping your ID on it
  2. -
  3. Open the Cyborg's outer panel using a crowbar
  4. -
  5. Remove the old power cell
  6. -
  7. Insert the new power cell
  8. -
  9. Close the Cyborg's outer panel using a crowbar
  10. -
  11. Lock the Cyborg's Interface by swiping your ID on it, this will prevent non-qualified personnel from attempting to remove the power cell
  12. -
- -

Exposing the Internal Wiring

- Exposing the internal wiring of a cyborg is fairly easy to do, and is mainly used for cyborg repairs.
You can easily expose the internal wiring by following the steps below: -
    -
  1. Follow Steps 1 - 3 of "Replacing a Cyborg's Power Cell"
  2. -
  3. Open the cyborg's internal wiring panel by using a screwdriver to unsecure the panel
  4. -
- To re-seal the cyborg's internal wiring: -
    -
  1. Use a screwdriver to secure the cyborg's internal panel
  2. -
  3. Follow steps 4 - 6 of "Replacing a Cyborg's Power Cell" to close up the cyborg
  4. -
- -

Cyborg Repairs

- Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-travelling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs). - -

Dents

- If a cyborg becomes damaged due to impact from heavy or fast-moving objects, it will become dented. Sure, a dent may not seem like much, but it can compromise the structural integrity of the cyborg, possibly causing a critical failure. - Dents in a cyborg's frame are rather easy to repair, all you need is to apply a welding tool to the dented area, and the high-tech cyborg frame will repair the dent under the heat of the welder. - -

Excessive Heat Damage

- If a cyborg becomes damaged due to excessive heat, it is likely that the internal wires will have been damaged. You must replace those wires to ensure that the cyborg remains functioning properly.
To replace the internal wiring follow the steps below: -
    -
  1. Unlock the Cyborg's Interface by swiping your ID
  2. -
  3. Open the Cyborg's External Panel using a crowbar
  4. -
  5. Remove the Cyborg's Power Cell
  6. -
  7. Using a screwdriver, expose the internal wiring of the Cyborg
  8. -
  9. Replace the damaged wires inside the cyborg
  10. -
  11. Secure the internal wiring cover using a screwdriver
  12. -
  13. Insert the Cyborg's Power Cell
  14. -
  15. Close the Cyborg's External Panel using a crowbar
  16. -
  17. Lock the Cyborg's Interface by swiping your ID
  18. -
- These repair tasks may seem difficult, but are essential to keep your cyborgs running at peak efficiency. - -

In Case of Emergency

- In case of emergency, there are a few steps you can take. - -

"Rogue" Cyborgs

- If the cyborgs seem to become "rogue", they may have non-standard laws. In this case, use extreme caution. - To repair the situation, follow these steps: -
    -
  1. Locate the nearest robotics console
  2. -
  3. Determine which cyborgs are "Rogue"
  4. -
  5. Press the lockdown button to immobilize the cyborg
  6. -
  7. Locate the cyborg
  8. -
  9. Expose the cyborg's internal wiring
  10. -
  11. Check to make sure the LawSync and AI Sync lights are lit
  12. -
  13. If they are not lit, pulse the LawSync wire using a multitool to enable the cyborg's LawSync
  14. -
  15. Proceed to a cyborg upload console. The Company usually places these in the same location as AI upload consoles.
  16. -
  17. Use a "Reset" upload moduleto reset the cyborg's laws
  18. -
  19. Proceed to a Robotics Control console
  20. -
  21. Remove the lockdown on the cyborg
  22. -
- -

As a last resort

- If all else fails in a case of cyborg-related emergency, there may be only one option. Using a Robotics Control console, you may have to remotely detonate the cyborg. -

WARNING:

Do not detonate a borg without an explicit reason for doing so. Cyborgs are expensive pieces of company equipment, and you may be punished for detonating them without reason. - - - - "} + guide_decl = /datum/codex_entry/guide/robotics /obj/item/book/manual/engineering_construction - name = "Repairs and Construction" + name = "repair and construction reference manual" icon_state ="bookEngineering" - author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + author = "Engineering Encyclopedia" title = "Repairs and Construction" - url = "Guide_to_Construction" + guide_decl = /datum/codex_entry/guide/construction /obj/item/book/manual/engineering_particle_accelerator - name = "Particle Accelerator User's Guide" + name = "particle accelerator reference manual" icon_state ="bookParticleAccelerator" - author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + author = "Engineering Encyclopedia" title = "Particle Accelerator User's Guide" - -/obj/item/book/manual/engineering_particle_accelerator/Initialize() - . = ..() - dat = {" - - - - - -

Experienced User's Guide

- -

Setting up the accelerator

- -
    -
  1. Wrench all pieces to the floor
  2. -
  3. Add wires to all the pieces
  4. -
  5. Close all the panels with your screwdriver
  6. -
- -

Using the accelerator

- -
    -
  1. Open the control panel
  2. -
  3. Set the speed to 2
  4. -
  5. Start firing at the singularity generator
  6. -
  7. When the singularity reaches a large enough size so it starts moving on it's own set the speed down to 0, but don't shut it off
  8. -
  9. Remember to wear a radiation suit when working with this machine... we did tell you that at the start, right?
  10. -
- - - - "} - + guide_decl = /datum/codex_entry/guide/particle_accelerator /obj/item/book/manual/supermatter_engine - name = "Supermatter Engine Operating Manual" + name = "supermatter engine reference manual" icon_state = "bookSupermatter" author = "Central Engineering Division" title = "Supermatter Engine Operating Manual" - url = "Supermatter_Engine" + guide_decl = /datum/codex_entry/guide/supermatter /obj/item/book/manual/rust_engine - name = "R-UST Operating Manual" + name = "fusion reactor reference Manual" icon_state = "bookMagazine" author = "Cindy Crawfish" title = "R-UST Operating Manual" - url = "R-UST" + guide_decl = /datum/codex_entry/guide/fusion /obj/item/book/manual/engineering_hacking - name = "Hacking" + name = "hacking reference manual" icon_state ="bookHacking" - author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + author = "Engineering Encyclopedia" title = "Hacking" - url = "Hacking" + guide_decl = /datum/codex_entry/guide/hacking /obj/item/book/manual/engineering_singularity_safety - name = "Singularity Safety in Special Circumstances" + name = "singularity engine reference manual" icon_state ="bookEngineeringSingularitySafety" - author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + author = "Engineering Encyclopedia" title = "Singularity Safety in Special Circumstances" - - dat = {" - - - - -

Singularity Safety in Special Circumstances

- -

Power outage

- - A power problem has made you lose power? Could be wiring problems or syndicate power sinks. In any case follow these steps: - -
    -
  1. PANIC!
  2. -
  3. Get your ass over to engineering! QUICKLY!!!
  4. -
  5. Get to the Area Power Controller which controls the power to the emitters.
  6. -
  7. Swipe it with your ID card - if it doesn't unlock, continue with step 15.
  8. -
  9. Open the console and disengage the cover lock.
  10. -
  11. Pry open the APC with a Crowbar.
  12. -
  13. Take out the empty power cell.
  14. -
  15. Put in the new, full power cell - if you don't have one, continue with step 15.
  16. -
  17. Quickly put on a Radiation suit.
  18. -
  19. Check if the singularity field generators withstood the down-time - if they didn't, continue with step 15.
  20. -
  21. Since disaster was averted you now have to ensure it doesn't repeat. If it was a powersink which caused it and if the engineering APC is wired to the same powernet, which the powersink is on, you have to remove the piece of wire which links the APC to the powernet. If it wasn't a powersink which caused it, then skip to step 14.
  22. -
  23. Grab your crowbar and pry away the tile closest to the APC.
  24. -
  25. Use the wirecutters to cut the wire which is connecting the grid to the terminal.
  26. -
  27. Go to the bar and tell the guys how you saved them all. Stop reading this guide here.
  28. -
  29. GET THE FUCK OUT OF THERE!!!
  30. -
- -

Shields get damaged

- -
    -
  1. GET THE FUCK OUT OF THERE!!! FORGET THE WOMEN AND CHILDREN, SAVE YOURSELF!!!
  2. -
- - - "} + guide_decl = /datum/codex_entry/guide/singularity /obj/item/book/manual/ripley_build_and_repair - name = "APLU \"Ripley\" Construction and Operation Manual" + name = "exosuit construction reference manual" icon_state ="book" - author = "Randall Varn, Einstein Engines Senior Mechanic" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + author = "Randall Varn, Einstein Engines Senior Mechanic" title = "APLU \"Ripley\" Construction and Operation Manual" - - dat = {" - - - - -
-
- Weyland-Yutani - Building Better Worlds -

Autonomous Power Loader Unit \"Ripley\"

-
-

Specifications:

-
    -
  • Class: Autonomous Power Loader
  • -
  • Scope: Logistics and Construction
  • -
  • Weight: 820kg (without operator and with empty cargo compartment)
  • -
  • Height: 2.5m
  • -
  • Width: 1.8m
  • -
  • Top speed: 5km/hour
  • -
  • Operation in vacuum/hostile environment: Possible -
  • Airtank volume: 500 liters
  • -
  • Devices: -
      -
    • Hydraulic clamp
    • -
    • High-speed drill
    • -
    -
  • -
  • Propulsion device: Powercell-powered electro-hydraulic system
  • -
  • Powercell capacity: Varies
  • -
- -

Construction:

-
    -
  1. Connect all exosuit parts to the chassis frame.
  2. -
  3. Connect all hydraulic fittings and tighten them up with a wrench.
  4. -
  5. Adjust the servohydraulics with a screwdriver.
  6. -
  7. Wire the chassis (Cable is not included).
  8. -
  9. Use the wirecutters to remove the excess cable if needed.
  10. -
  11. Install the central control module (Not included. Use supplied datadisk to create one).
  12. -
  13. Secure the mainboard with a screwdriver.
  14. -
  15. Install the peripherals control module (Not included. Use supplied datadisk to create one).
  16. -
  17. Secure the peripherals control module with a screwdriver.
  18. -
  19. Install the internal armor plating (Not included due to corporate regulations. Can be made using 5 metal sheets).
  20. -
  21. Secure the internal armor plating with a wrench.
  22. -
  23. Weld the internal armor plating to the chassis.
  24. -
  25. Install the external reinforced armor plating (Not included due to corporate regulations. Can be made using 5 reinforced metal sheets).
  26. -
  27. Secure the external reinforced armor plating with a wrench.
  28. -
  29. Weld the external reinforced armor plating to the chassis.
  30. -
- -

Additional Information:

-
    -
  • The firefighting variation is made in a similar fashion.
  • -
  • A firesuit must be connected to the firefighter chassis for heat shielding.
  • -
  • Internal armor is plasteel for additional strength.
  • -
  • External armor must be installed in 2 parts, totalling 10 sheets.
  • -
  • Completed exosuit is more resilient against fire, and is a bit more durable overall.
  • -
  • The Company is determined to ensure the safety of its investments employees.
  • -
- - - "} + guide_decl = /datum/codex_entry/guide/mech_construction /obj/item/book/manual/atmospipes - name = "Pipes and You: Getting To Know Your Scary Tools" + name = "atmospherics reference manual" icon_state = "pipingbook" author = "Maria Crash, Senior Atmospherics Technician" title = "Pipes and You: Getting To Know Your Scary Tools" - dat = {" - - - - - -

Contents

-
    -
  1. Author's Foreword
  2. -
  3. Basic Piping
  4. -
  5. Insulated Pipes
  6. -
  7. Atmospherics Devices
  8. -
  9. Heat Exchange Systems
  10. -
  11. Final Checks
  12. -

- -

HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS


- Or: What the fuck does a "pressure regulator" do?

- - Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does. - Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So, - this will tell you what every device constructable by an ordinary pipe dispenser within atmospherics actually does. - You are not going to learn what to do with them to be the super best person ever, or how to play guitar with passive gates, - or something like that. Just what stuff does.

- - -

Basic Pipes

- The boring ones.
- Most ordinary pipes are pretty straightforward. They hold gas. If gas is moving in a direction for some reason, gas will flow in that direction. - That's about it. Even so, here's all of your wonderful pipe options.
- -
    -
  • Straight pipes: They're pipes. One-meter sections. Straight line. Pretty simple. Just about every pipe and device is based around this - standard one-meter size, so most things will take up as much space as one of these.
  • -
  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • -
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • -
  • 4-way manifold: A four-way junction.
  • -
  • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh, use them to decorate your house or something.
  • -
  • Manual valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
  • -
  • Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • -
- - An important note here is that pipes are now done in three distinct lines - general, supply, and scrubber. You can move gases between these with a universal adapter. Use the correct position for the correct location. - Connecting scrubbers to a supply position pipe makes you an idiot who gives everyone a difficult job. Insulated and HE pipes don't go through these positions. - -

Insulated Pipes

-
  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • -
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • -
  • 4-way manifold: A four-way junction.
  • -
  • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh. Use them to decorate your house or something.
  • -
  • Manual Valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
  • -
  • Manual T-Valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • - -

    Insulated Pipes


    - Special Public Service Announcement.
    - Our regular pipes are already insulated. These are completely worthless. Punch anyone who uses them.

    - -

    Devices:

    - They actually do something.
    - This is usually where people get frightened, afraid, and start calling on their gods and/or cowering in fear. Yes, I can see you doing that right now. - Stop it. It's unbecoming. Most of these are fairly straightforward.
    - -
      -
    • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 15000 kPa (kilopascals). - Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa - (though 18 kPa is preferred when using internals with pure oxygen, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa. - You will make engiborgs cry and the Chief Engineer will beat you.
    • -
    • Pressure regulator: These replaced the old passive gates. You can choose to regulate pressure by input or output, and regulate flow rate. Regulating by input means that when input pressure is above the limit, gas will flow. - Regulating by output means that when pressure is below the limit, gas will flow. Flow rate can be controlled.
    • -
    • Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
    • -
    • Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
    • -
    • Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
    • -
    • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers.. - Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely..
    • -
    • Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe, - the rest will continue out the other side. Can also output from 0-4500 kPa. The "omni" vairant allows you to set input and output sections freely.
    • -
    - -

    Heat Exchange Systems

    - Will not set you on fire.
    - These systems are used to only transfer heat between two pipes. They will not move gases or any other element, but will equalize the temperature (eventually). Note that because of how gases work (remember: pv=nRt), - a higher temperature will raise pressure, and a lower one will lower temperature.
    - -
  • Pipe: This is a pipe that will exchange heat with the surrounding atmosphere. Place in fire for superheating. Place in space for supercooling.
  • -
  • Bent pipe: Take a wild guess.
  • -
  • Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
  • -
  • Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch. - This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions.

  • - - That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please. - - - - - "} + guide_decl = /datum/codex_entry/guide/atmospherics /obj/item/book/manual/evaguide - name = "EVA Gear and You: Not Spending All Day Inside" + name = "\improper EVA reference manual" icon_state = "evabook" author = "Maria Crash, Senior Atmospherics Technician" title = "EVA Gear and You: Not Spending All Day Inside" - dat = {" - - - - - -

    EVA Gear and You: Not Spending All Day Inside

    - Or: How not to suffocate because there's a hole in your shoes
    - -

    Contents

    -
      -
    1. A foreword on using EVA gear
    2. -
    3. Donning a Civilian Suit
    4. -
    5. Putting on a Hardsuit
    6. -
    7. Cyclers and Other Modification Equipment
    8. -
    9. Final Checks
    10. -
    -
    - - EVA gear. Wonderful to use. It's useful for mining, engineering, and occasionally just surviving, if things are that bad. Most people have EVA training, - but apparently there are some people out in space who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections: - Civilian suits and hardsuits.

    - -

    Civilian Suits

    - The bulkiest things this side of Alpha Centauri
    - These suits are the grey ones that are stored in EVA. They're the more simple to get on, but are also a lot bulkier, and provide less protection from environmental hazards such as radiation or physical impact. - As Medical, Engineering, Security, and Mining all have hardsuits of their own, these don't see much use, but knowing how to put them on is quite useful anyways.

    - - First, take the suit. It should be in three pieces: A top, a bottom, and a helmet. Put the bottom on first, shoes and the like will fit in it. If you have magnetic boots, however, - put them on on top of the suit's feet. Next, get the top on, as you would a shirt. It can be somewhat awkward putting these pieces on, due to the makeup of the suit, - but to an extent they will adjust to you. You can then find the snaps and seals around the waist, where the two pieces meet. Fasten these, and double-check their tightness. - The red indicators around the waist of the lower half will turn green when this is done correctly. Next, put on whatever breathing apparatus you're using, be it a gas mask or a breath mask. Make sure the oxygen tube is fastened into it. - Put on the helmet now, straightforward, and make sure the tube goes into the small opening specifically for internals. Again, fasten seals around the neck, a small indicator light in the inside of the helmet should go from red to off when all is fastened. - There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit, - but it is recommended to have a full-sized tank on your back for EVA.

    - - These suits tend to be wearable by most species. They're large and flexible. They might be pretty uncomfortable for some, though, so keep that in mind.

    - -

    Hardsuits

    - Heavy, uncomfortable, still the best option.
    - These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.

    - - Similarly to the other suits, these are split into three parts. Fastening the pant and top are mostly the same as the other spacesuits, with the exception that these are a bit heavier, - though not as bulky. The helmet goes on differently, with the air tube feeding into the suit and out a hole near the left shoulder, while the helmet goes on turned ninety degrees counter-clockwise, - and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light. - The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.

    - - These suits generally only fit one species. Standard-issue suits are usually human-fitting by default, but there's equipment that can make modifications to the hardsuits to fit them to other species.

    - -

    Modification Equipment

    - How to actually make hardsuits fit you.
    - There's a variety of equipment that can modify hardsuits to fit species that can't fit into them, making life quite a bit easier.

    - - The first piece of equipment is a suit cycler. This is a large machine resembling the storage pods that are in place in some places. These are machines that will automatically tailor a suit to certain specifications. - The largest uses of them are for their cleaning functions and their ability to tailor suits for a species. Do not enter them physically. You will die from any of the functions being activated, and it will be painful. - These machines can both tailor a suit between species, and between types. This means you can convert engineering hardsuits to atmospherics, or the other way. This is useful. Use it if you can.

    - - There's also modification kits that let you modify suits yourself. These are extremely difficult to use unless you understand the actual construction of the suit. I do not recommend using them unless no other option is available. - -

    Final Checks

    -
      -
    • Are all seals fastened correctly?
    • -
    • If you have modified it manually, is absolutely everything sealed perfectly?
    • -
    • Do you either have shoes on under the suit, or magnetic boots on over it?
    • -
    • Do you have a mask on and internals on the suit or your back?
    • -
    • Do you have a way to communicate with your fellow crew in case something goes wrong?
    • -
    • Do you have a second person watching if this is a training session?

    • -
    - - If you don't have any further issues, go out and do whatever is necessary. - - - - "} + guide_decl = /datum/codex_entry/guide/eva diff --git a/code/game/objects/items/books/manuals/manuals.dm b/code/game/objects/items/books/manuals/manuals.dm index fc6dba675d1..6af9c841691 100644 --- a/code/game/objects/items/books/manuals/manuals.dm +++ b/code/game/objects/items/books/manuals/manuals.dm @@ -1,145 +1,27 @@ /obj/item/book/manual/chef_recipes - name = "Chef Recipes" + name = "recipe book" icon_state = "cooked_book" author = "Victoria Ponsonby" title = "Chef Recipes" - -/obj/item/book/manual/chef_recipes/Initialize() - . = ..() - dat = {" - - - - - [SScodex.get_guide(/decl/codex_category/recipes)] - - - "} + guide_decl = /decl/codex_category/recipes /obj/item/book/manual/barman_recipes - name = "Mixology 101" + name = "cocktail recipe book" icon_state = "barbook" author = "Sir John Rose" title = "Mixology 101" - -/obj/item/book/manual/barman_recipes/Initialize() - . = ..() - dat = {" - - - - - [SScodex.get_guide(/decl/codex_category/cocktails)] - - - "} + guide_decl = /decl/codex_category/cocktails /obj/item/book/manual/detective - name = "The Film Noir: Proper Procedures for Investigations" + name = "forensics reference manual" icon_state ="bookDetective" author = "The Company" title = "The Film Noir: Proper Procedures for Investigations" - - dat = {" - - - - -

    Detective Work

    - - Between your bouts of self-narration and drinking whiskey on the rocks, you might get a case or two to solve.
    - To have the best chance to solve your case, follow these directions: -

    -

      -
    1. Go to the crime scene.
    2. -
    3. Take your scanner and scan EVERYTHING (Yes, the doors, the tables, even the dog).
    4. -
    5. Once you are reasonably certain you have every scrap of evidence you can use, find all possible entry points and scan them, too.
    6. -
    7. Return to your office.
    8. -
    9. Using your forensic scanning computer, scan your scanner to upload all of your evidence into the database.
    10. -
    11. Browse through the resulting dossiers, looking for the one that either has the most complete set of prints, or the most suspicious items handled.
    12. -
    13. If you have 80% or more of the print (The print is displayed), go to step 10, otherwise continue to step 8.
    14. -
    15. Look for clues from the suit fibres you found on your perpetrator, and go about looking for more evidence with this new information, scanning as you go.
    16. -
    17. Try to get a fingerprint card of your perpetrator, as if used in the computer, the prints will be completed on their dossier.
    18. -
    19. Assuming you have enough of a print to see it, grab the biggest complete piece of the print and search the security records for it.
    20. -
    21. Since you now have both your dossier and the name of the person, print both out as evidence and get security to nab your baddie.
    22. -
    23. Give yourself a pat on the back and a bottle of the ship's finest vodka, you did it!
    24. -
    -

    - It really is that easy! Good luck! - - - "} + guide_decl = /datum/codex_entry/guide/detective /obj/item/book/manual/nuclear - name = "Fission Mailed: Nuclear Sabotage 101" + name = "nuclear device reference manual" icon_state ="bookNuclear" author = "Syndicate" title = "Fission Mailed: Nuclear Sabotage 101" - - dat = {" - - - - -

    Nuclear Explosives 101

    - Hello and thank you for choosing the Syndicate for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.

    - - First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done, to unbolt it, one must completely log in, which at this time may not be possible.
    - -

    To make the nuclear device functional

    -
      -
    • Place the nuclear device in the designated detonation zone.
    • -
    • Extend and anchor the nuclear device from its interface.
    • -
    • Insert the nuclear authorisation disk into the slot.
    • -
    • Type the numeric authorisation code into the keypad. This should have been provided.
      - Note: If you make a mistake, press R to reset the device. -
    • Press the E button to log on to the device.
    • -

    - - You now have activated the device. To deactivate the buttons at anytime, for example when you've already prepped the bomb for detonation, remove the authentication disk OR press R on the keypad.

    - Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option. Toggle off the SAFETY.
    - Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.

    - - So use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
    - Note: THE BOMB IS STILL SET AND WILL DETONATE

    - - Now before you remove the disk, if you need to move the bomb, you can toggle off the anchor, move it, and re-anchor.

    - - Remember the order:
    - Disk, Code, Safety, Timer, Disk, RUN!

    - Intelligence Analysts believe that normal corporate procedure is for the Captain to secure the nuclear authentication disk.

    - - Good luck! - - - "} + guide_decl = /datum/codex_entry/guide/nuclear_sabotage diff --git a/code/game/objects/items/books/manuals/medical.dm b/code/game/objects/items/books/manuals/medical.dm index f4d2e8a6d30..9bca7d84990 100644 --- a/code/game/objects/items/books/manuals/medical.dm +++ b/code/game/objects/items/books/manuals/medical.dm @@ -1,55 +1,22 @@ /obj/item/book/manual/medical_diagnostics_manual - name = "Medical Diagnostics Manual" + name = "medical diagnostics manual" desc = "First, do no harm. A detailed medical practitioner's guide." icon_state = "bookMedical" author = "Medical Department" title = "Medical Diagnostics Manual" - url = "Guide_to_Medicine" - -/obj/item/book/manual/medical_diagnostics_manual/Initialize() - . = ..() - dat = {" - - - - -
    -

    The Oath

    - - The Medical Oath sworn by recognised medical practitioners in the employ of [global.using_map.company_name]
    - -
      -
    1. Now, as a new doctor, I solemnly promise that I will, to the best of my ability, serve humanity-caring for the sick, promoting good health, and alleviating pain and suffering.
    2. -
    3. I recognise that the practice of medicine is a privilege with which comes considerable responsibility and I will not abuse my position.
    4. -
    5. I will practise medicine with integrity, humility, honesty, and compassion-working with my fellow doctors and other colleagues to meet the needs of my patients.
    6. -
    7. I shall never intentionally do or administer anything to the overall harm of my patients.
    8. -
    9. I will not permit considerations of gender, race, religion, political affiliation, sexual orientation, nationality, or social standing to influence my duty of care.
    10. -
    11. I will oppose policies in breach of human rights and will not participate in them. I will strive to change laws that are contrary to my profession's ethics and will work towards a fairer distribution of health resources.
    12. -
    13. I will assist my patients to make informed decisions that coincide with their own values and beliefs and will uphold patient confidentiality.
    14. -
    15. I will recognise the limits of my knowledge and seek to maintain and increase my understanding and skills throughout my professional life. I will acknowledge and try to remedy my own mistakes and honestly assess and respond to those of others.
    16. -
    17. I will seek to promote the advancement of medical knowledge through teaching and research.
    18. -
    19. I make this declaration solemnly, freely, and upon my honour.
    20. -

    - -
    - - - - - - "} + guide_decl = /datum/codex_entry/guide/ailments /obj/item/book/manual/chemistry_recipes - name = "Guide to Medicines & Drugs" + name = "pharmacology reference manual" desc = "A thick manual of chemistry, formulae and recipes useful for a Chemist." icon_state = "bookChemistry" author = "Big Pharma" - title = "Guide to Medicines & Drugs" - url = "List_of_Medical_Chemicals" \ No newline at end of file + title = "Guide to Pharmacology" + guide_decl = /decl/codex_category/materials/chemistry + +/obj/item/book/manual/surgical + name = "surgical reference manual" + icon_state = "bookMedical" + author = "Dr. Holmes MD" + title = "Guide to Surgery" + guide_decl = /decl/codex_category/surgery diff --git a/code/game/objects/items/books/manuals/science.dm b/code/game/objects/items/books/manuals/science.dm index 0894e7b787b..b7ff9268ecc 100644 --- a/code/game/objects/items/books/manuals/science.dm +++ b/code/game/objects/items/books/manuals/science.dm @@ -1,376 +1,13 @@ /obj/item/book/manual/excavation - name = "Out on the Dig" + name = "excavation reference manual" icon_state = "excavation" author = "Professor Patrick Mason, Curator of the Antiquities Museum on Ichar VII" title = "Out on the Dig" - dat = {" - - - - - -

    Contents

    -
      -
    1. Prepping the expedition
    2. -
    3. Knowing your tools
    4. -
    5. Finding the dig
    6. -
    7. Analysing deposits
    8. -
    9. Extracting your first find
    10. -
    -
    - -

    Prepping the expedition

    - Every digsite I've been to, someone has forgotten something and I've never yet been to a dig that hasn't had me hiking to get to it - so gather your gear - and get it to the site the first time. You learn quick that time is money, when you've got a shipful of bandits searching for you the next valley over, - but don't be afraid to clear some space if there are any inconvenient boulders in the way.
    -
      -
    • Floodlights (if it's dark)
    • -
    • Wooden trestle tables (for holding tools and finds)
    • -
    • Suspension field generator
    • -
    • Load bearing servitors (such as a mulebot, or hover-tray)
    • -
    • Spare energy packs
    • -

    - Contents - -

    Knowing your tools

    - Every archaeologist has a plethora of tools at their disposal, but here's the important ones:
    -
      -
    • Picks, pickaxes, and brushes - don't underestimate the the smallest or largest in your arsenal, each one clears a different amount - of the rockface so each one has a use.
    • -
    • Measuring tape - don't leave home without it, you can use it to measure the depth a rock face has been excavated to.
    • -
    • GPS locator - knowing where you are is the first step to not be lost.
    • -
    • Core sampler - use this to take core samples from rock faces, which you can then run to the lab for analysis.
    • -
    • Depth scanner - uses X-ray diffraction to locate anomalous densities in rock, indicating archaeological deposits or mineral veins. - Comes with a handy reference log containing coordinates and time of each scan.
    • -
    • Alden-Saraspova counter - uses a patented application of Fourier Transform analysis to determine the difference between background and - exotic radiation. Use it to determine how far you are from anomalous energy sources.
    • -
    • Radio beacon locator - leave a beacon at an item of interest, then track it down later with this handy gadget. Watch for interference from other - devices though.
    • -
    • Flashlight or portable light source - Self explanatory, I hope.
    • -
    • Environmental safety gear - This one's dependent on the environment you're working in, but enclosed footwear and a pack of internals - could save your life.
    • -
    • Anomaly safety gear - A biosealed and catalysis-resistant suit along with eye shielding, tinted hood, and non-reactive disposable gloves are - the best kind of protection you can hope for from the errors our forebears may have unleashed.
    • -
    • Personal defence weapon - Never know what you'll find on the dig: pirates, natives, ancient guardians, carnivorous wildlife... - it pays in blood to be prepared.
    • -

    - Contents - -

    Finding the dig

    - Wouldn't be an archaeologist without their dig, but everyone has to start somewhere. Here's a basic procedure I go through when cataloguing a new planet:
    -
      -
    • Get in touch with the locals (in particular geologists, miners, and farmers) - Never know what's been turned up by accident, then left to - gather dust on a shelf.
    • -
    • Check the obvious areas first - even if you're pressed for time, these ones are the generally easiest to search, and the most likely targets - of your rivals.
    • -
    • Do some prospecting - the earth mother isn't in the habit of displaying her secrets to the world (although sometimes you get lucky). - Drop a shaft and clear away a bit of surface rock here and there, you never know what might be lurking below the surface.
    • -
    • Tips on unearthing a deposit - How do you know when you're golden? Look for telltale white strata that looks strange or out of place, or if - something has broken under your pick while you're digging. Your depth scanner is your best friend, but even it can't distinguish between - ordinary minerals and ancient leavings, if in doubt then err on the side of caution.
    • -

    - Contents - -

    Analysing the contents of a dig

    - You've found some unusual strata, but it's not all peaches from here. No archaeologist ever managed to pull a bone from the earth without doing thorough - chemical analysis on every two meters of rock face nearby.
    -
      -
    • Take core samples - Grab a rock core for every 4m^2.
    • -
    • Clear around any potential finds - Clear away ordinary rock, leaving your prizes reachable in a clearly marked area.
    • -
    • Haul off excess rock - It's easy for a dig to get cluttered, and a neat archaeologist is a successful archaeologist.
    • -
    • Don't be afraid to be cautious - It's slower sometimes, but the extra time will be worth the payoff when you find an Exolitic relic.
    • -
    • Chemical analysis - I won't go into detail here, but the labwork is essential to any successful extraction. Marshal your core samples, and - send them off to the labcoated geniuses.
    • -

    - Contents - -

    Extracting your first find

    -
      -
    • Scan the rock - Use a depth scanner to determine the find's depth and clearance. DON'T FORGET THESE.
    • -
    • Choose stasis field - Chemical analysis on a core sample from the rock face will tell you which field is necessary to extract the find safely.
    • -
    • Setup field gen - Bolt it down, choose the field, check the charge, and activate it. If you forget it, you'll wish you hadn't when that priceless - Uryom vase crumbles as it sees the light of day.
    • -
    • FUNCTIONAL AND SAFE digging - Dig into the rock until you've cleared away a depth equal to (the anomaly depth MINUS the clearance range). The find - should come loose on it's own, but it will be in the midst of a chunk of rock. Use a welder or miniature excavation tool to clear away the excess.
    • -
    • FANCY AND SPEEDY digging - Dig into the rock until you've cleared away a depth equal to the anomaly depth, but without any of your strokes - entering the clearance range.
    • -
    • The big find - Sometimes, you'll chance upon something big, both literally and figuratively. Giant statues and functioning remnants of Precursor - technology are just as exciting, to the right buyers. If your digging leaves a large boulder behind, dig into it normally and see if anything's hidden - inside.
    • -

    - Contents - - - - "} + guide_decl = /datum/codex_entry/guide/xenoarchaeology /obj/item/book/manual/mass_spectrometry - name = "High Power Mass Spectrometry: A Comprehensive Guide" + name = "mass spectrometry reference manual" icon_state = "analysis" author = "Winton Rice, Chief Mass Spectrometry Technician at the Institute of Applied Sciences on Arcadia" title = "High powered mass spectrometry, a comprehensive guide" - dat = {" - - - - - -

    Contents

    -
      -
    1. A note on terms
    2. -
    3. Analysis progression
    4. -
    5. Heat management
    6. -
    7. Ambient radiation
    8. -
    - -
    -

    A note on terms

    -
      -
    • Mass spectrometry - MS is the procedure used used to measure and quantify the components of matter. The most prized tool in the field of - 'Materials analysis.'
    • -
    • Radiometric dating - MS applied using the right carrier reagents can be used to accurately determine the age of a sample.
    • -
    • Dissonance ratio - This is a pseudoarbitrary value indicating the overall presence of a particular element in a greater composite. - It takes into account volume, density, molecular excitation and isotope spread.
    • -
    • Vacuum seal integrity - A reference to how close an airtight seal is to failure.
    • -

    - Contents - -

    Analysis progression

    - Modern mass spectrometry requires constant attention from the diligent researcher in order to be successful. There are many different elements to juggle, - and later chapters will delve into them. For the spectrometry assistant, the first thing you need to know is that the scanner wavelength is automatically - calculated for you. Just tweak the settings and try to match it with the actual wavelength as closely as possible.
    -
    - Contents - -

    Seal integrity

    - In order to maintain sterile and environmentally static procedures, a special chamber is set up inside the spectrometer. It's protected by a proprietary vacuum seal - produced by top tier industrial science. It will only last for a certain number of scans before failing outright, but it can be resealed through use of nanite paste. - Unfortunately, it's susceptible to malforming under heat stress so exposing it to higher temperatures will cause it's operation life to drop significantly.
    -
    - Contents - -

    Heat management

    - The scanner relies on a gyro-rotational system that varies in speed and intensity. Over the course of an ordinary scan, the RPMs can change dramatically. Higher RPMs - means greater heat generation, but is necessary for the ongoing continuation of the scan. To offset heat production, spectrometers have an inbuilt cooling system. - Researchers can modify the flow rate of water to aid in dropping temperature as necessary, but are advised that frequent water replacements may be necessary - depending on coolant purity. Other substances may be viable substitutes, but nowhere near as effective as water itself.
    -
    - Contents - -

    Ambient radiation

    - Researchers are warned that while operational, mass spectrometers emit period bursts of radiation and are thus advised to wear protective gear. In the event of - radiation spikes, there is also a special shield that can be lowered to block emissions. Lowering this, however, will have the effect of blocking the scanner - so use it sparingly.
    -
    - Contents - - - - "} - -/obj/item/book/manual/anomaly_spectroscopy - name = "Spectroscopy: Analysing the Anomalies of the Cosmos" - icon_state = "anomaly" - author = "Doctor Martin Boyle, Director Research at the Lower Hydrolian Sector Listening Array" - title = "Spectroscopy: Analysing the Anomalies of the Cosmos" - dat = {" - - - - -
    - It's perhaps one of the most exciting times to be alive, with the recent breakthroughs in understanding and categorisation of things we may one day no longer call - 'anomalies,' but rather 'infrequent or rare occurrences of certain celestial weather or phenomena.' Perhaps a little more long winded, but no less eloquent all the - same! Why, look at the strides we're making in piercing the walls of spacetime or our steadily improving ability to clarify and stabilise subspace emissions; it's - certainly an exciting time to be alive. For the moment, the Hydrolian hasn't seen two spatial anomalies alike but the day will come and it is soon, I can feel it. - - "} - -/obj/item/book/manual/materials_chemistry_analysis - name = "Materials Analysis and the Chemical Implications" - icon_state = "chemistry" - author = "Jasper Pascal, Senior Lecturer in Materials Analysis at the University of Jol'Nar" - title = "Materials Analysis and the Chemical Implications" - dat = {" - - - - -
    - In today's high tech research fields, leaps and bounds are being made every day. Whether it's great strides forward in our understanding of the physical universe - or the operation of some fancy new piece of equipment, it seems like all the cool fields are producing new toys to play with, leaving doddery old fields such as - materials analysis and chemistry relegated to the previous few centuries, when we were still learning the makeup and structure of the elements.
    -
    - Well, when you're out there building the next gryo-whatsitron or isotope mobility thingummy, remember how the field of archaeology experienced a massive new rebirth - following the excavations at Paranol IV and consider how all of the scientific greats will come crawling back to basic paradigms of natural philosophy when they discover - a new element that defies classification. I defy you to classify it without reviving this once great field! - "} - -/obj/item/book/manual/anomaly_testing - name = "Anomalous Materials and Energies" - icon_state = "triangulate" - author = "Norman York, formerly of the Tyrolion Institute on Titan" - title = "Anomalous Materials and Energies" - dat = {" - - - - - -

    Contents

    -
      -
    1. Foreword: Modern attitude towards anomalies
    2. -
    3. Triangulating anomalous energy readings
    4. -
    5. Harvesting and utilising anomalous energy signatures
    6. -
    -
    -

    Modern attitude towards anomalies

    - It's only when confronted with things we don't know, that we may push back our knowledge of the world around us. Nowhere is this more obvious than the - vast and inscrutable mysterious of the cosmos that scholars from such august institutions as the Elysian Institute of the Sciences present - formulas and hypotheses for every few decades.
    -
    - Using our vast, telescopic array installations and deep space satellite networks, we are able to detect anomalous energy fields and formations in deep space, - but are limited to those that are large enough to output energy that will stretch across light years worth of distance between stars.
    -
    - While some sectors (such as the Hydrolian Rift and Keppel's Run) are replete with inexplicable energetic activity and unique phenomena found nowhere else in - the galaxy, the majority of space is dry, barren and cold - and if past experience has told us anything, it is that there are always more things we are - unable to explain.
    -
    - Indeed, a great source of knowledge and technology has always been those who come before us, in the form of the multitudinous ancient alien precursors that - have left scattered remnants of their great past all over settled (and unexplored) space.
    -
    - It is from xenoarchaeologists, high energy materials researchers, and technology reconstruction authorities that we are able to theorise on the gifts these - species have left behind, and in some cases even reverse engineer or rebuild the technology in question. My colleague, Doctor Raymond Ward of the - Tyrolian Institute on Titan, has made great breakthroughs in a related field through his pioneering development of universally reflective materials capable - of harvesting and 'bottling' up virtually any energy emissions yet encountered by spacefaring civilisations.
    -
    - And yet, there are some amongst us who do not see the benefits of those who have come before us - indeed, some among them profess the opinion that there - is no species that could possibly match humanity in it's achievements and knowledge, or simply that employing non-human technology is dangerous and unethical. - Folly, say I. If it is their desire to throw onto the wayside the greatest achievements in the history of the galaxy, simply for preferment of the - greatest achievements in the history of mankind, then they have no business in the establishment of science.
    - Contents - -

    Triangulating anomalous energy readings

    - Strong energy emissions, when remaining constant from any one fixed location for millennia, can leave an 'imprint' or distinctive energy signature on other - matter composites that are spatially fixed relative to the source.
    -
    - By taking samples of such 'fixed' matter, we can apply complex analytics such as the modified Fourier Transform Procedure to reverse engineer the path of the - energy, and determine the approximate distance and direction that the energy source is, relative to the sample's point in space. Modern portable devices can do - all this purely by taking readings of local radiation.
    -
    - A canny researcher can thusly analyse radiation at pre-chosen points strategically scattered around an area, and if there are any anomalous energy - emissions in range of those points, combined the researcher can triangulate the source.
    - Contents - -

    Harvesting and utilising anomalous energy signatures

    - As mentioned in the foreword, my colleague from the Tyrolian Institute on Saturn's moon of Titan, in the Sol System, Doctor Raymond Ward has made great strides - in the area of harvesting and application of the energy emitted by anomalous phenomena from around the galaxy (although I profess I have not yet seen him - venture further from his birthplace on Earth than the comfortable distance of the Sol Cis-Oort Satellite Sphere).
    -
    - By employing a patented semi-phased alloy with unique and fascinating properties, Ward's contraption is able to 'harvest' energy, store - it and redirect it later at will (with appropriate electronic mechanisms, of course). Although he professes to see or desire no commercial or material gain - for the application and use of said energy once it is harvested, there are no doubt myriad ways we can come to benefit from such things beyond mere research, - such as the reconstruction of torn cartilaginous tissue that a peculiar radiation from an amphibious species on Brachis IV was found to emit.
    - Contents - - - - "} - -/obj/item/book/manual/stasis - name = "Cellular Suspension, the New Cryogenics?" - icon_state = "stasis" - author = "Elvin Schmidt" - title = "Cellular Suspension, the New Cryogenics?" - dat = {" - - - - - -

    Contents

    -
      -
    1. Foreword: A replacement for cryosleep?
    2. -
    3. The breakthrough
    4. -
    5. Applying this new principle
    6. -
    -
    -

    Foreword: A replacement for cryosleep?

    - The development of rudimentary cryofreezing in the 20th and 21st centuries was hailed as a crank science by some, but many early visionaries recognised the - potential it had to change the way we approach so many fields, such as medicine, therapeutics, and space travel. It was breakthroughs in the field in the 22nd and - later centuries that turned the procedure from science fiction to science fact, however. Since then, cryogenics has become a hallmark of modern science, and - regarded as one of the great achievements of our era. As with all sciences however, they have their time and are superseded by newer technological miracles when - it is over.
    - Contents - -

    The breakthrough

    - It was in examining the effects of decelerated high energy particles when transphased through a gravitational lens that the effects where primarily noticed. - Due to exigent properties of that dimension, transphasing those particles capable of existing with high stability levels has the effect of bringing - some of those effects into realspace. Examining the Hoffman emissions in particular, it was discovered that they exhibited a-entropic behaviour, and in what is - now termed the 'Effete Hoffman Principle,' it was found that metastabilising the Hoffman radiation resulted in the effect being applied across other physical - interactions, in particular forces and reactions.
    - Contents - -

    Applying this new principle

    - When combined with an appropriate energy-effect replicate for cryogenics (slowing down biological activity, thus stabilising the organics), the effect is - effectively identical to cryogenics, and while it consumes vastly more power and requires extremely complex equipment, it's (for all intents and purposes) superior - to cryogenics, all that remains is to 'commercialise' the process by enabling cheaper development and mass production.
    - The Effete Hoffman Principle can be tweak-combined with other effects however, for different purposes. A division of PMC Research initially developed the application - in prisons as a literal 'suspension field' where convicts are held immobile in the air, and the use quickly spread to numerous other areas.
    -
    - By examining the material resonance properties of certain strong waveforms when combined with Hoffman radiation, an effect was produced able to reverse energy - transferral through matter, and to slow the effects of gravity. When combined with energy repulse technology, the triple effects compound themselves into a much - stronger field, although all three components do slightly different things. High energy researchers assure me of the following key points:
    -
      -
    • The energy repulsion factor provides a 'shell' capable of weak suspension.
    • -
    • The Hoffman emissions nullify energy transferral and other kinetic activity, maintaining stability inside the field.
    • -
    • The resonant waveform combines the effects of the above two points, and applies it magnified onto it's synced 'resonance' materials.
    • -
    - As an interesting aside, a carbon waveform was chosen for the field in prison suspension fields, due to it's resonance with organic matter.
    - Contents - - - - "} \ No newline at end of file + guide_decl = /datum/codex_entry/guide/mass_spectrometry diff --git a/code/game/objects/items/books/skill/_skill.dm b/code/game/objects/items/books/skill/_skill.dm new file mode 100644 index 00000000000..e2ff9fb7868 --- /dev/null +++ b/code/game/objects/items/books/skill/_skill.dm @@ -0,0 +1,283 @@ +/* +Skill books that increase your skills while you activate and hold them +*/ + +/obj/item/book/skill + name = "textbook" // requires default names for tradershop, cant rely on Initialize for names + desc = "A blank textbook. (Notify admin)" + author = "The Oracle of Bakersroof" + icon_state = "book2" + force = 4 + w_class = ITEM_SIZE_LARGE // Skill books are THICC with knowledge. Up one level from regular books to prevent library-in-a-bag silliness. + unique = TRUE + material = /decl/material/solid/organic/plastic + matter = list(/decl/material/solid/organic/wood = MATTER_AMOUNT_REINFORCEMENT) + abstract_type = /obj/item/book/skill + + var/decl/hierarchy/skill/skill // e.g. SKILL_LITERACY + var/skill_req = SKILL_NONE // The level the user needs in the skill to benefit from the book, e.g. SKILL_PROF + var/weakref/reading // To check if the book is actively being used + var/custom = FALSE // To bypass init stuff, for player made textbooks and weird books. If true must have details manually set + var/ez_read = FALSE // Set to TRUE if you can read it without basic literacy skills + + var/skill_name = "missing skill name" + var/progress = INFINITY // used to track the progress of making a custom book. defaults as finished so, you know, you can read the damn thing + + var/static/list/skill_name_patterns = list( + "$SKILL_NAME$ for Idiots", + "How To Learn $SKILL_NAME$ and Not Get Laughed At", + "Teaching Yourself $SKILL_NAME$: Volume $RAND$", + "Getting the Hands-Off Experience You Need with $SKILL_NAME$", + "Master $SKILL_NAME$ in $RAND$ easy steps!", + "$SKILL_NAME$ Just Like Mum", + "How To $SKILL_NAME$ Good Enough For Your Father", + "How To Win Your Dad's Approval With $SKILL_NAME$", + "Make a Living with $SKILL_NAME$ Like Your Old Man Always Wanted You To", + "$SKILL_NAME$: Secret Techniques", + "The Dos, Don'ts and Oh Gods Please Nos of $SKILL_NAME$", + "The Death Of $SKILL_NAME$", + "Everything You Never Wanted To Know About $SKILL_NAME$ But Have Been Reluctantly Forced To Find Out", + "$SKILL_NAME$ For The Busy Professional", + "Learning $SKILL_NAME$ In A Hurry Because You Lied On Your Resume", + "Help! My Life Suddenly Depends On $SKILL_NAME$", + "What The Fuck is $ARTICLE_SKILL_NAME$?", + "Starting $ARTICLE_SKILL_NAME$ Business By Yourself", + "Even You Can Learn $SKILL_NAME$!", + "How To Impress Your Parents with $SKILL_NAME$", + "How To Become A Master of $SKILL_NAME$", + "Everything The Government Doesn't Want You To Know About $SKILL_NAME$", + "$SKILL_NAME$ For Kids!", + "$SKILL_NAME$: Volume $RAND$", + "Understanding $SKILL_NAME$: $RAND_TH$ Edition", + "Dealing With Ungrateful Customers Dissatisfied With Your Perfectly Acceptable $SKILL_NAME$ Services", + "Really big book of $SKILL_NAME$" + ) + + // Lists used when producing custom skillbooks. + var/static/list/failure_messages = list( + "Your hand slips and you accidentally rip your pen through several pages, ruining your hard work!", + "Your pen slips, dragging a haphazard line across both open pages! Now you need to do those again!" + ) + /// Messages are in order of progress. + var/static/list/progress_messages = list( + "Still quite a few blank pages left.", + "Feels like you're near halfway done.", + "You've made good progress.", + "Just needs a few finishing touches.", + "And then finish it. Done!" + ) + var/static/list/charge_messages = list( + "Your mind instantly recoils at the idea of having to write another textbook. No thank you!", + "You are far too mentally exhausted to write another textbook. Maybe another day.", + "Your hand aches in response to the very idea of more textbook writing." + ) + +/obj/item/book/skill/Initialize() + + . = ..() + + global.events_repository.register(/decl/observ/moved, src, src, PROC_REF(check_buff)) + + if(!custom && skill && skill_req)// custom books should already have all they need + + skill_name = initial(skill.name) + + var/title_name = capitalize(skill_name) + title = replacetext(pick(skill_name_patterns), "$SKILL_NAME$", title_name) + title = replacetext(title, "$RAND$", rand(1,100)) + title = replacetext(title, "$RAND_TH$", "[rand(1,100)]\th") + title = replacetext(title, "$ARTICLE_SKILL_NAME$", capitalize(ADD_ARTICLE(title_name))) + title = "\"[title]\"" + + switch(skill_req) // check what skill_req the book has + if(SKILL_NONE) // none > basic + name = "beginner [skill_name] textbook" + desc = "A copy of [title] by [author]. The only reason this book is so big is because all the words are printed very large! Presumably so you, an idiot, can read it." + if(SKILL_BASIC) // basic > adept + name = "intermediate [skill_name] textbook" + desc = "A copy of [title] by [author]. Dry and long, but not unmanageable. Basic knowledge is required to understand the concepts written." + if(SKILL_ADEPT) // adept > expert + name = "advanced [skill_name] textbook" + desc = "A copy of [title] by [author]. Those not already trained in the subject will have a hard time reading this. Try not to drop it either, it will put a hole in the floor." + if(SKILL_EXPERT to SKILL_MAX) //expert > prof + name = "theoretical [skill_name] textbook" + desc = "A copy of [title] by [author]. Significant experience in the subject is required to read this incredibly information dense block of paper. Sadly, does not come in audio form." + + if((!skill || !skill_req) && !custom)//That's a bad book, so just grab ANY child to replace it. Custom books are fine though they can be bad if they want. + if(subtypesof(src.type)) + var/new_book = pick(subtypesof(src.type)) + new new_book(src.loc) + qdel_self() + +/datum/skill_buff/skill_book + limit = 1 // you can only read one book at a time nerd, therefore you can only get one buff at a time + +/obj/item/book/skill/get_single_monetary_worth() + . = max(..(), 200) + (100 * skill_req) + +/obj/item/book/skill/proc/check_can_read(mob/user) + if(QDELETED(user)) + return FALSE + var/effective_title = length(title) ? title : "the textbook" + if(!CanPhysicallyInteract(user)) + to_chat(user, SPAN_WARNING("You can't reach [effective_title]!")) + return FALSE + if(!skill || (custom && progress == 0)) + to_chat(user, SPAN_WARNING("[capitalize(effective_title)] is blank!")) + return FALSE + if(custom && progress <= length(progress_messages)) + to_chat(user, SPAN_WARNING("[capitalize(effective_title)] is unfinished! You can't learn from it in this state!")) + return FALSE + if(!ez_read &&!user.skill_check(SKILL_LITERACY, SKILL_BASIC)) + to_chat(user, SPAN_WARNING(pick(list( + "Haha, you know you can't read. Good joke. Put [effective_title] back.", + "You open up [effective_title], but there aren't any pictures, so you close it again.", + "You don't know how to read! What good is [effective_title] to you?!" + )))) + return FALSE + + if(reading) + if(reading.resolve() != user) + to_chat(user, SPAN_WARNING("\The [reading.resolve()] is already reading [effective_title]!")) + else + to_chat(user, SPAN_WARNING("You are already reading [effective_title]!")) + return FALSE + + if(user.too_many_buffs(/datum/skill_buff/skill_book)) + to_chat(user, SPAN_WARNING("You can't read two books at once!")) + return FALSE + + if(!user.skill_check(skill, skill_req)) + to_chat(user, SPAN_WARNING("[capitalize(title)] is too advanced for you! Try something easier, perhaps the \"For Idiots\" edition?")) + return FALSE + + if(user.get_skill_value(skill) > skill_req) + to_chat(user, SPAN_WARNING("You already know everything [effective_title] has to teach you!")) + return FALSE + + return TRUE + +/obj/item/book/skill/verb/read_book() + set name = "Read Book" + set category = "Object" + set src in view(1) + try_to_read(usr) + +/obj/item/book/skill/try_to_read(mob/user) + + if(isobserver(user)) + to_chat(user, SPAN_WARNING("Ghosts can't read! Go away!")) + return TRUE + + if(isturf(loc)) + user.face_atom(src) + + if(user && user == reading?.resolve()) + //Close book, get rid of buffs + unlearn(user) + to_chat(user, SPAN_NOTICE("You close [title]. That's enough learning for now.")) + reading = null + STOP_PROCESSING(SSprocessing, src) + return TRUE + + if(!check_can_read(user)) + return FALSE + + to_chat(user, SPAN_NOTICE("You open up [title] and start reading...")) + if(!user.do_skilled(4 SECONDS, SKILL_LITERACY, src, 0.75)) + to_chat(user, SPAN_DANGER("Your perusal of [title] was interrupted!")) + return TRUE + + if(!check_can_read(user)) + return TRUE + + var/list/buff = list() + buff[skill] = 1 + user.buff_skill(buff, buff_type = /datum/skill_buff/skill_book) + reading = weakref(user) + to_chat(user, SPAN_NOTICE("You find the information you need! Better keep the page open to reference it.")) + START_PROCESSING(SSprocessing, src) + return TRUE + +// buff removal +/obj/item/book/skill/proc/unlearn(var/mob/user) + var/list/F = user.fetch_buffs_of_type(/datum/skill_buff/skill_book, 0) + for(var/datum/skill_buff/skill_book/S in F) + S.remove() + +/obj/item/book/skill/Process() + if(!reading) + return PROCESS_KILL + check_buff() + +/obj/item/book/skill/proc/check_buff() + if(!reading) + return + var/mob/R = reading.resolve() + if(!istype(R) || !CanPhysicallyInteract(R)) + remove_buff() + +/obj/item/book/skill/proc/remove_buff() + var/mob/R = reading?.resolve() + reading = null + if(istype(R)) + to_chat(R, SPAN_DANGER("You lose the page you were on! You can't cross-reference using [title] like this!")) + if(R.fetch_buffs_of_type(/datum/skill_buff/skill_book, 0)) + unlearn(R) + STOP_PROCESSING(SSprocessing, src) + +/obj/item/book/skill/Destroy() + global.events_repository.unregister(/decl/observ/moved, src, src) + remove_buff() + . = ..() + + + + + + +////////////////////// +// SHELF SHELF SHELF// +////////////////////// + +/obj/structure/bookcase/skill_books + name = "textbook bookcase" + // Contains a list of parent types but doesn't actually DO anything with them. Use a child of this book case + var/static/list/catalogue = list( + /obj/item/book/skill/organizational/finance, + /obj/item/book/skill/organizational/literacy, + /obj/item/book/skill/general/eva, + /obj/item/book/skill/general/mech, + /obj/item/book/skill/general/pilot, + /obj/item/book/skill/general/hauling, + /obj/item/book/skill/general/computer, + /obj/item/book/skill/service/botany, + /obj/item/book/skill/service/cooking, + /obj/item/book/skill/security/combat, + /obj/item/book/skill/security/weapons, + /obj/item/book/skill/security/forensics, + /obj/item/book/skill/engineering/construction, + /obj/item/book/skill/engineering/electrical, + /obj/item/book/skill/engineering/atmos, + /obj/item/book/skill/engineering/engines, + /obj/item/book/skill/research/devices, + /obj/item/book/skill/research/science, + /obj/item/book/skill/medical/chemistry, + /obj/item/book/skill/medical/medicine, + /obj/item/book/skill/medical/anatomy + ) + +//give me ALL the textbooks +/obj/structure/bookcase/skill_books/all/Initialize() + . = ..() + for(var/category in catalogue) + for(var/real_book in subtypesof(category)) + new real_book(src) + +//Bookshelf with some random textbooks +/obj/structure/bookcase/skill_books/random/Initialize() + . = ..() + for(var/category in catalogue) + for(var/real_book in subtypesof(category)) + if(prob(20)) + new real_book(src) diff --git a/code/game/objects/items/books/skill/_skill_custom.dm b/code/game/objects/items/books/skill/_skill_custom.dm new file mode 100644 index 00000000000..66fa10cf151 --- /dev/null +++ b/code/game/objects/items/books/skill/_skill_custom.dm @@ -0,0 +1,193 @@ +////////////////////// +//Custom Skill Books// +////////////////////// + +//custom skill books made by players. Right now it is extremely dodgy and bad and i'm sorry +/obj/item/book/skill/custom + name = "blank textbook" + desc = "A somewhat heftier blank book, just ready to filled with knowledge and sold at an unreasonable price." + custom = TRUE + author = null + progress = 0 + icon_state = "tb_white" + var/skill_option_string = "Skill" //changes to "continue writing content" when the book is in progress + var/true_author //Used to keep track of who is actually writing the book. + var/writing_time = 15 SECONDS // time it takes to write a segment of the book. This happens 6 times total + +//these all show up in the book fabricator +/obj/item/book/skill/custom/circle + icon_state = "tb_white_circle" +/obj/item/book/skill/custom/star + icon_state = "tb_white_star" +/obj/item/book/skill/custom/hourglass + icon_state = "tb_white_hourglass" +/obj/item/book/skill/custom/cracked + icon_state = "tb_white_cracked" +/obj/item/book/skill/custom/gun + icon_state = "tb_white_gun" +/obj/item/book/skill/custom/wrench + icon_state = "tb_white_wrench" +/obj/item/book/skill/custom/glass + icon_state = "tb_white_glass" + +/obj/item/book/skill/custom/cross + icon_state = "tb_white_cross" +/obj/item/book/skill/custom/text + icon_state = "tb_white_text" +/obj/item/book/skill/custom/download + icon_state = "tb_white_download" +/obj/item/book/skill/custom/uparrow + icon_state = "tb_white_uparrow" +/obj/item/book/skill/custom/percent + icon_state = "tb_white_percent" +/obj/item/book/skill/custom/flask + icon_state = "tb_white_flask" +/obj/item/book/skill/custom/detective + icon_state = "tb_white_detective" +/obj/item/book/skill/custom/device + icon_state = "tb_white_device" +/obj/item/book/skill/custom/smile + icon_state = "tb_white_smile" +/obj/item/book/skill/custom/exclamation + icon_state = "tb_white_exclamation" +/obj/item/book/skill/custom/question + icon_state = "tb_white_question" + +/obj/item/book/skill/custom/attackby(obj/item/pen, mob/user) + if(IS_PEN(pen)) + + if(!user.skill_check(SKILL_LITERACY, SKILL_BASIC)) + to_chat(user, SPAN_WARNING("You can't even read, yet you want to write a whole educational textbook?")) + return + if(!user.skill_check(SKILL_LITERACY, SKILL_PROF)) + to_chat(user, SPAN_WARNING("You have no clue as to how to write an entire textbook in a way that is actually useful. Maybe a regular book would be better?")) + return + var/state_check = skill_option_string // the state skill_option_string is in just before opening the input + var/choice = input(user, "What would you like to change?","Textbook editing") as null|anything in list("Title", "Author", skill_option_string) + if(!can_write(pen,user)) + return + + switch(choice) + if("Title") + edit_title(pen, user) + + if("Skill") + if(state_check != "Skill") // make sure someone hasn't already started the book while we were staring at menus woops + to_chat(user, SPAN_WARNING("The skill has already been selected and the writing started.")) + return + edit_skill(pen, user) + + if("Continue writing content") + if(state_check != "Continue writing content") + return + continue_skill(pen, user) + + if("Author") + edit_author(pen, user) + + else + return + + if(skill && title && author) // we have everything we need so lets set a good description + desc = "A handwritten textbook titled [title], by [author]. Looks like it teaches [skill_name]." + return + ..() + +/obj/item/book/skill/custom/proc/can_write(var/obj/item/pen, var/mob/user) + if(user.get_active_hand() == pen && CanPhysicallyInteractWith(user,src) && !QDELETED(src) && !QDELETED(pen)) + return TRUE + else + to_chat(user,SPAN_DANGER("How can you expect to write anything when you can't physically put pen to paper?")) + return FALSE + +/obj/item/book/skill/custom/proc/edit_title(var/obj/item/pen, var/mob/user) + var/newtitle = reject_bad_text(sanitize_safe(input(user, "Write a new title:"))) + if(!can_write(pen,user)) + return + if(!newtitle) + to_chat(user, "The title is invalid.") + return + else + newtitle = user.handle_writing_literacy(user, newtitle) + if(newtitle) + title = newtitle + SetName(title) + +/obj/item/book/skill/custom/proc/edit_author(var/obj/item/pen, var/mob/user) + var/newauthor = sanitize(input(user, "Write the author's name:")) + if(!can_write(pen,user)) + return + if(!newauthor) + to_chat(user, SPAN_WARNING("The author name is invalid.")) + return + else + newauthor = user.handle_writing_literacy(user, newauthor) + if(newauthor) + author = newauthor + +/obj/item/book/skill/custom/proc/edit_skill(var/obj/item/pen, var/mob/user) + if(user.skillset.literacy_charges <= 0) + to_chat(user, SPAN_WARNING(pick(charge_messages))) + return + + //Choosing the skill + var/list/skill_choices = list() + for(var/decl/hierarchy/skill/S in global.skills) + if(user.skill_check(S.type, SKILL_BASIC)) + LAZYADD(skill_choices, S) + var/decl/hierarchy/skill/skill_choice = input(user, "What subject does your textbook teach?", "Textbook skill selection") as null|anything in skill_choices + if(!can_write(pen,user) || progress > length(progress_messages)) + return + if(!skill_choice) + to_chat(user, SPAN_WARNING("Textbook skill selection cancelled.")) + return + var/newskill = skill_choice.type + + //Choosing the level + var/list/skill_levels = skill_choice.levels.Copy() + for(var/SL in skill_levels) + if(!user.skill_check(newskill, skill_levels.Find(SL))) + LAZYREMOVE(skill_levels, SL) + else + skill_levels[SL] = skill_levels.Find(SL) + LAZYREMOVE(skill_levels,skill_levels[1]) + var/newskill_level = input(user, "What level of education does it provide?","Textbook skill level") as null|anything in skill_levels + if(!can_write(pen,user) || progress > length(progress_messages)) + return + if(!newskill_level) + to_chat(user, SPAN_WARNING("Textbook skill level selection cancelled.")) + return + var/usable_level = skill_levels[newskill_level] + if(newskill && usable_level) + if(!do_after(user, writing_time, src)) + to_chat(user, SPAN_DANGER(pick(failure_messages))) + return + //everything worked out so now we can put the learnings in the book + to_chat(user, SPAN_NOTICE("You start writing your book, getting a few pages in.")) + skill = newskill + skill_name = skill_choice.name + skill_req = (usable_level - 1) + desc = "A handwritten textbook on [skill_choice]! Wow!" + progress++ + skill_option_string = "Continue writing content" + true_author = user.name + +/obj/item/book/skill/custom/proc/continue_skill(var/obj/item/pen, var/mob/user) + if(user.skillset.literacy_charges <= 0) + to_chat(user, SPAN_WARNING(pick(charge_messages))) + return + if(progress > length(progress_messages)) // shouldn't happen but here just in case + to_chat(user, SPAN_WARNING("This book is already finished! There's no need to add anything else!")) + return + if(true_author != user.name) + to_chat(user, SPAN_WARNING("This isn't your work and you're not really sure how to continue it.")) + return + else + if(!do_after(user, writing_time, src)) + to_chat(user, SPAN_DANGER(pick(failure_messages))) + return + to_chat(user, SPAN_NOTICE("You continue writing your book. [progress_messages[progress]]")) + progress++ + if(progress > length(progress_messages)) // book is finished! yay! + user.skillset.literacy_charges -= 1 + skill_option_string = "Cancel" \ No newline at end of file diff --git a/code/game/objects/items/books/skill/engineering.dm b/code/game/objects/items/books/skill/engineering.dm new file mode 100644 index 00000000000..077a2486740 --- /dev/null +++ b/code/game/objects/items/books/skill/engineering.dm @@ -0,0 +1,96 @@ +/* +ENGINEERING +*/ +/obj/item/book/skill/engineering + abstract_type = /obj/item/book/skill/engineering + icon_state = "bookEngineering" + +//construction +/obj/item/book/skill/engineering/construction/ + author = "Robert Bildar" + skill = SKILL_CONSTRUCTION + +/obj/item/book/skill/engineering/construction/basic + name = "beginner construction textbook" + +/obj/item/book/skill/engineering/construction/adept + skill_req = SKILL_BASIC + name = "intermediate construction textbook" + +/obj/item/book/skill/engineering/construction/expert + skill_req = SKILL_ADEPT + name = "advanced construction textbook" + +/obj/item/book/skill/engineering/construction/prof + skill_req = SKILL_EXPERT + name = "theoretical construction textbook" + +//electrical +/obj/item/book/skill/engineering/electrical + skill = SKILL_ELECTRICAL + author = "Ariana Vanderbalt" + +/obj/item/book/skill/engineering/electrical/basic + name = "beginner electrical engineering textbook" + +/obj/item/book/skill/engineering/electrical/adept + skill_req = SKILL_BASIC + name = "intermediate electrical engineering textbook" + +/obj/item/book/skill/engineering/electrical/expert + skill_req = SKILL_ADEPT + name = "advanced electrical engineering textbook" + +/obj/item/book/skill/engineering/electrical/prof + skill_req = SKILL_EXPERT + name = "theoretical electrical engineering textbook" + +//engines +/obj/item/book/skill/engineering/engines + skill = SKILL_ENGINES + author = "Gilgamesh Scholz" + +/obj/item/book/skill/engineering/engines/basic + name = "beginner engines textbook" + +/obj/item/book/skill/engineering/engines/adept + skill_req = SKILL_BASIC + name = "intermediate engines textbook" + +/obj/item/book/skill/engineering/engines/expert + skill_req = SKILL_ADEPT + name = "advanced engines textbook" + +/obj/item/book/skill/engineering/engines/prof + skill_req = SKILL_EXPERT + name = "theoretical engines textbook" + +/obj/item/book/skill/engineering/engines/prof/magazine + name = "theoretical engines magazine" + title = "\improper WetSkrell magazine" + icon_state = "bookMagazine" + custom = TRUE + author = "Unknown" + desc = "Sure, it includes highly detailed information on extremely advanced engine and power generator systems... but why is it written in marker on a tentacle porn magazine?" + w_class = ITEM_SIZE_NORMAL + +//atmos +/obj/item/book/skill/engineering/atmos + skill = SKILL_ATMOS + author = "Maria Crash" + icon_state = "pipingbook" + +/obj/item/book/skill/engineering/atmos/basic + name = "beginner atmospherics textbook" + +/obj/item/book/skill/engineering/atmos/adept + skill_req = SKILL_BASIC + name = "intermediate atmospherics textbook" + +/obj/item/book/skill/engineering/atmos/expert + skill_req = SKILL_ADEPT + name = "advanced atmospherics textbook" + +/obj/item/book/skill/engineering/atmos/prof + skill_req = SKILL_EXPERT + name = "theoretical atmospherics textbook" diff --git a/code/game/objects/items/books/skill/general.dm b/code/game/objects/items/books/skill/general.dm new file mode 100644 index 00000000000..5696db54a14 --- /dev/null +++ b/code/game/objects/items/books/skill/general.dm @@ -0,0 +1,110 @@ +/* +GENERAL +*/ +/obj/item/book/skill/general + abstract_type = /obj/item/book/skill/general + +//eva +/obj/item/book/skill/general/eva + icon_state = "evabook" + skill = SKILL_EVA + author = "Big Dark" + +/obj/item/book/skill/general/eva/basic + name = "beginner extra-vehicular activity textbook" + +/obj/item/book/skill/general/eva/adept + skill_req = SKILL_BASIC + name = "intermediate extra-vehicular activity textbook" + +/obj/item/book/skill/general/eva/expert + skill_req = SKILL_ADEPT + name = "advanced extra-vehicular activity textbook" + +/obj/item/book/skill/general/eva/prof + skill_req = SKILL_EXPERT + name = "theoretical extra-vehicular activity textbook" + +//mech +/obj/item/book/skill/general/mech + icon_state = "tb_mech" + skill = SKILL_MECH + author = "J.T. Marsh" + +/obj/item/book/skill/general/mech/basic + name = "beginner exosuit operation textbook" + +/obj/item/book/skill/general/mech/adept + skill_req = SKILL_BASIC + name = "intermediate exosuit operation textbook" + +/obj/item/book/skill/general/mech/expert + skill_req = SKILL_ADEPT + name = "advanced exosuit operation textbook" + +/obj/item/book/skill/general/mech/prof + skill_req = SKILL_EXPERT + name = "theoretical exosuit operation textbook" + +//piloting +/obj/item/book/skill/general/pilot + skill = SKILL_PILOT + author = "Sumi Shimamoto" + icon_state = "tb_pilot" + +/obj/item/book/skill/general/pilot/basic + name = "beginner piloting textbook" + +/obj/item/book/skill/general/pilot/adept + skill_req = SKILL_BASIC + name = "intermediate piloting textbook" + +/obj/item/book/skill/general/pilot/expert + skill_req = SKILL_ADEPT + name = "advanced piloting textbook" + +/obj/item/book/skill/general/pilot/prof + skill_req = SKILL_EXPERT + name = "theoretical piloting textbook" + +//hauling +/obj/item/book/skill/general/hauling + skill = SKILL_HAULING + author = "Chiel Brunt" + icon_state = "tb_hauling" + +/obj/item/book/skill/general/hauling/basic + name = "beginner athletics textbook" + +/obj/item/book/skill/general/hauling/adept + skill_req = SKILL_BASIC + name = "intermediate athletics textbook" + +/obj/item/book/skill/general/hauling/expert + skill_req = SKILL_ADEPT + name = "advanced athletics textbook" + +/obj/item/book/skill/general/hauling/prof + skill_req = SKILL_EXPERT + name = "theoretical athletics textbook" + +//computer +/obj/item/book/skill/general/computer + skill = SKILL_COMPUTER + author = "Simona Castiglione" + icon_state = "bookNuclear" + +/obj/item/book/skill/general/computer/basic + name = "beginner information technology textbook" + +/obj/item/book/skill/general/computer/adept + skill_req = SKILL_BASIC + name = "intermediate information technology textbook" + +/obj/item/book/skill/general/computer/expert + skill_req = SKILL_ADEPT + name = "advanced information technology textbook" + +/obj/item/book/skill/general/computer/prof + skill_req = SKILL_EXPERT + name = "theoretical information technology textbook" diff --git a/code/game/objects/items/books/skill/medical.dm b/code/game/objects/items/books/skill/medical.dm new file mode 100644 index 00000000000..9caeeb1699f --- /dev/null +++ b/code/game/objects/items/books/skill/medical.dm @@ -0,0 +1,71 @@ +/* +MEDICAL +*/ +/obj/item/book/skill/medical + abstract_type = /obj/item/book/skill/medical + icon_state = "bookMedical" + +//chemistry +/obj/item/book/skill/medical/chemistry + icon_state = "chemistry" + author = "Dr. Shinula Nyekundujicho" + skill = SKILL_CHEMISTRY + +/obj/item/book/skill/medical/chemistry/basic + name = "beginner chemistry textbook" + +/obj/item/book/skill/medical/chemistry/adept + skill_req = SKILL_BASIC + name = "intermediate chemistry textbook" + +/obj/item/book/skill/medical/chemistry/expert + skill_req = SKILL_ADEPT + name = "advanced chemistry textbook" + +/obj/item/book/skill/medical/chemistry/prof + skill_req = SKILL_EXPERT + name = "theoretical chemistry textbook" + +//medicine +/obj/item/book/skill/medical/medicine + author = "Dr. Nagarjuna Siddha" + skill = SKILL_MEDICAL + +/obj/item/book/skill/medical/medicine/basic + name = "beginner medicine textbook" + title = "\"Instructional Guide on How Rubbing Dirt In Wounds Might Not Be The Right Approach To Stopping Bleeding Anymore\"" + desc = "A copy of \"Instructional Guide on How Rubbing Dirt In Wounds Might Not Be The Right Approach To Stopping Bleeding Anymore\" by Dr. Merrs. Despite the information density of this heavy book, it lacks any and all teachings regarding bedside manner." + author = "Dr. Merrs" + custom = TRUE + +/obj/item/book/skill/medical/medicine/adept + skill_req = SKILL_BASIC + name = "intermediate medicine textbook" + +/obj/item/book/skill/medical/medicine/expert + skill_req = SKILL_ADEPT + name = "advanced medicine textbook" + +/obj/item/book/skill/medical/medicine/prof + skill_req = SKILL_EXPERT + name = "theoretical medicine textbook" + +//anatomy +/obj/item/book/skill/medical/anatomy + author = "Dr. Basil Cartwright" + skill = SKILL_ANATOMY + +/obj/item/book/skill/medical/anatomy/basic + name = "beginner anatomy textbook" + +/obj/item/book/skill/medical/anatomy/adept + skill_req = SKILL_BASIC + name = "intermediate anatomy textbook" + +/obj/item/book/skill/medical/anatomy/expert + skill_req = SKILL_ADEPT + name = "advanced anatomy textbook" + +/obj/item/book/skill/medical/anatomy/prof + skill_req = SKILL_EXPERT + name = "theoretical anatomy textbook" \ No newline at end of file diff --git a/code/game/objects/items/books/skill/organizational.dm b/code/game/objects/items/books/skill/organizational.dm new file mode 100644 index 00000000000..87b37123301 --- /dev/null +++ b/code/game/objects/items/books/skill/organizational.dm @@ -0,0 +1,38 @@ +/* +ORGANIZATIONAL +*/ +/obj/item/book/skill/organizational + abstract_type = /obj/item/book/skill/organizational + +//literacy +/obj/item/book/skill/organizational/literacy + skill = SKILL_LITERACY + +/obj/item/book/skill/organizational/literacy/basic + name = "alphabet book" + icon_state = "tb_literacy" + author = "Dorothy Mulch" + custom = TRUE + w_class = ITEM_SIZE_NORMAL // A little bit smaller c: + ez_read = TRUE + +//finance +/obj/item/book/skill/organizational/finance + skill = SKILL_FINANCE + author = "Cadence Bennett" + icon_state = "tb_finance" + +/obj/item/book/skill/organizational/finance/basic + name = "beginner finance textbook" + +/obj/item/book/skill/organizational/finance/adept + skill_req = SKILL_BASIC + name = "intermediate finance textbook" + +/obj/item/book/skill/organizational/finance/expert + skill_req = SKILL_ADEPT + name = "advanced finance textbook" + +/obj/item/book/skill/organizational/finance/prof + skill_req = SKILL_EXPERT + name = "theoretical finance textbook" diff --git a/code/game/objects/items/books/skill/research.dm b/code/game/objects/items/books/skill/research.dm new file mode 100644 index 00000000000..4c1a666af74 --- /dev/null +++ b/code/game/objects/items/books/skill/research.dm @@ -0,0 +1,46 @@ +/* +RESEARCH +*/ +/obj/item/book/skill/research + abstract_type = /obj/item/book/skill/research + icon_state = "analysis" + +//devices +/obj/item/book/skill/research/devices + author = "Nilva Plosinjak" + skill = SKILL_DEVICES + +/obj/item/book/skill/research/devices/basic + name = "beginner complex devices textbook" + +/obj/item/book/skill/research/devices/adept + skill_req = SKILL_BASIC + name = "intermediate complex devices textbook" + +/obj/item/book/skill/research/devices/expert + skill_req = SKILL_ADEPT + name = "advanced complex devices textbook" + +/obj/item/book/skill/research/devices/prof + skill_req = SKILL_EXPERT + name = "theoretical complex devices textbook" + +//science +/obj/item/book/skill/research/science + author = "Hui Ying Ch'ien" + skill = SKILL_SCIENCE + +/obj/item/book/skill/research/science/basic + name = "beginner science textbook" + +/obj/item/book/skill/research/science/adept + skill_req = SKILL_BASIC + name = "intermediate science textbook" + +/obj/item/book/skill/research/science/expert + skill_req = SKILL_ADEPT + name = "advanced science textbook" + +/obj/item/book/skill/research/science/prof + skill_req = SKILL_EXPERT + name = "theoretical science textbook" diff --git a/code/game/objects/items/books/skill/security.dm b/code/game/objects/items/books/skill/security.dm new file mode 100644 index 00000000000..4fdfd1367a8 --- /dev/null +++ b/code/game/objects/items/books/skill/security.dm @@ -0,0 +1,69 @@ +/* +SECURITY +*/ +/obj/item/book/skill/security + abstract_type = /obj/item/book/skill/security + icon_state = "bookSpaceLaw" + +//combat +/obj/item/book/skill/security/combat + skill = SKILL_COMBAT + author = "Autumn Eckhardstein" + icon_state = "tb_combat" + +/obj/item/book/skill/security/combat/basic + name = "beginner close combat textbook" + +/obj/item/book/skill/security/combat/adept + skill_req = SKILL_BASIC + name = "intermediate close combat textbook" + +/obj/item/book/skill/security/combat/expert + skill_req = SKILL_ADEPT + name = "advanced close combat textbook" + +/obj/item/book/skill/security/combat/prof + skill_req = SKILL_EXPERT + name = "theoretical close combat textbook" + +//weapons +/obj/item/book/skill/security/weapons + skill = SKILL_WEAPONS + author = "Miho Tatsu" + icon_state = "tb_weapon" + +/obj/item/book/skill/security/weapons/basic + name = "beginner weapons expertise textbook" + +/obj/item/book/skill/security/weapons/adept + skill_req = SKILL_BASIC + name = "intermediate weapons expertise textbook" + +/obj/item/book/skill/security/weapons/expert + skill_req = SKILL_ADEPT + name = "advanced weapons expertise textbook" + +/obj/item/book/skill/security/weapons/prof + skill_req = SKILL_EXPERT + name = "theoretical weapons expertise textbook" + +//forensics +/obj/item/book/skill/security/forensics + icon_state = "bookDetective" + skill = SKILL_FORENSICS + author = "Samuel Vimes" + +/obj/item/book/skill/security/forensics/basic + name = "beginner forensics textbook" + +/obj/item/book/skill/security/forensics/adept + skill_req = SKILL_BASIC + name = "intermediate forensics textbook" + +/obj/item/book/skill/security/forensics/expert + skill_req = SKILL_ADEPT + name = "advanced forensics textbook" + +/obj/item/book/skill/security/forensics/prof + skill_req = SKILL_EXPERT + name = "theoretical forensics textbook" diff --git a/code/game/objects/items/books/skill/service.dm b/code/game/objects/items/books/skill/service.dm new file mode 100644 index 00000000000..04d93d9341b --- /dev/null +++ b/code/game/objects/items/books/skill/service.dm @@ -0,0 +1,47 @@ +/* +SERVICE +*/ +/obj/item/book/skill/service + abstract_type = /obj/item/book/skill/service + +//botany +/obj/item/book/skill/service/botany + icon_state = "bookHydroponicsPodPeople" + skill = SKILL_BOTANY + author = "Mai Dong Chat" + +/obj/item/book/skill/service/botany/basic + name = "beginner botany textbook" + +/obj/item/book/skill/service/botany/adept + skill_req = SKILL_BASIC + name = "intermediate botany textbook" + +/obj/item/book/skill/service/botany/expert + skill_req = SKILL_ADEPT + name = "advanced botany textbook" + +/obj/item/book/skill/service/botany/prof + skill_req = SKILL_EXPERT + name = "theoretical botany textbook" + +//cooking +/obj/item/book/skill/service/cooking + icon_state = "barbook" + skill = SKILL_COOKING + author = "Lavinia Burrows" + +/obj/item/book/skill/service/cooking/basic + name = "beginner cooking textbook" + +/obj/item/book/skill/service/cooking/adept + skill_req = SKILL_BASIC + name = "intermediate cooking textbook" + +/obj/item/book/skill/service/cooking/expert + skill_req = SKILL_ADEPT + name = "advanced cooking textbook" + +/obj/item/book/skill/service/cooking/prof + skill_req = SKILL_EXPERT + name = "theoretical cooking textbook" diff --git a/code/game/objects/items/books/skill_book.dm b/code/game/objects/items/books/skill_book.dm deleted file mode 100644 index 7fa53d5147d..00000000000 --- a/code/game/objects/items/books/skill_book.dm +++ /dev/null @@ -1,945 +0,0 @@ -#define RANDOM_BOOK_TITLE(skill_name) pick(list("\"[skill_name] for Idiots\"", \ - "\"How To Learn [skill_name] and Not Get Laughed At\"", \ - "\"Teaching Yourself [skill_name]: Volume [rand(1,100)]\"", \ - "\"Getting the Hands-Off Experience You Need with [skill_name]\"", \ - "\"Master [skill_name] in [rand(100,999)] easy steps!\"", \ - "\"[skill_name] Just Like Mum\"", \ - "\"How To [skill_name] Good Enough For Your Father\"", \ - "\"How To Win Your Dad's Approval With [skill_name]\"", \ - "\"Make a Living with [skill_name] Like Your Old Man Always Wanted You To\"", \ - "\"[skill_name]: Secret Techniques\"", \ - "\"The Dos, Don'ts and Oh Gods Please Nos of [skill_name]\"", \ - "\"The Death Of [skill_name]\"", \ - "\"Everything You Never Wanted To Know About [skill_name] But Have Been Reluctantly Forced To Find Out\"", \ - "\"[skill_name] For The Busy Professional\"", \ - "\"Learning [skill_name] In A Hurry Because You Lied On Your Resume\"", \ - "\"Help! My Life Suddenly Depends On [skill_name]\"", \ - "\"What The Fuck is [capitalize(ADD_ARTICLE(capitalize(skill_name)))]?\"", \ - "\"Starting [capitalize(ADD_ARTICLE(capitalize(skill_name)))] Business By Yourself\"", \ - "\"Even You Can Learn [skill_name]!\"", \ - "\"How To Impress Your Matriarch with [skill_name]\"", \ - "\"How To Become A Patriarch of [skill_name]\"", \ - "\"Everything The Government Doesn't Want You To Know About [skill_name]\"", \ - "\"[skill_name] For Younglets\"", \ - "\"[skill_name]: Volume [rand(1,100)]\"", \ - "\"Understanding [skill_name]: [rand(1,100)]\th Edition\"", \ - "\"Dealing With Ungrateful Customers Dissatisfied With Your Perfectly Acceptable [skill_name] Services\"", \ - "\"Really big book of [skill_name]\"")) -#define SKILLBOOK_PROG_NONE 0 -#define SKILLBOOK_PROG_FINISH 6 - -/* -Skill books that increase your skills while you activate and hold them -*/ - -/obj/item/book/skill - name = "textbook" // requires default names for tradershop, cant rely on Initialize for names - desc = "A blank textbook. (Notify admin)" - author = "The Oracle of Bakersroof" - icon_state = "book2" - force = 4 - w_class = ITEM_SIZE_LARGE // Skill books are THICC with knowledge. Up one level from regular books to prevent library-in-a-bag silliness. - unique = TRUE - material = /decl/material/solid/plastic - matter = list(/decl/material/solid/wood = MATTER_AMOUNT_REINFORCEMENT) - abstract_type = /obj/item/book/skill - - var/decl/hierarchy/skill/skill // e.g. SKILL_LITERACY - var/skill_req = SKILL_NONE // The level the user needs in the skill to benefit from the book, e.g. SKILL_PROF - var/weakref/reading // To check if the book is actively being used - var/custom = FALSE // To bypass init stuff, for player made textbooks and weird books. If true must have details manually set - var/ez_read = FALSE // Set to TRUE if you can read it without basic literacy skills - - var/skill_name = "missing skill name" - var/progress = SKILLBOOK_PROG_FINISH // used to track the progress of making a custom book. defaults as finished so, you know, you can read the damn thing - -/obj/item/book/skill/Initialize() - - . = ..() - - global.events_repository.register(/decl/observ/moved, src, src, .proc/check_buff) - - if(!custom && skill && skill_req)// custom books should already have all they need - skill_name = initial(skill.name) - title = RANDOM_BOOK_TITLE(capitalize(skill_name)) - switch(skill_req) // check what skill_req the book has - if(SKILL_NONE) // none > basic - name = "beginner [skill_name] textbook" - desc = "A copy of [title] by [author]. The only reason this book is so big is because all the words are printed very large! Presumably so you, an idiot, can read it." - if(SKILL_BASIC) // basic > adept - name = "intermediate [skill_name] textbook" - desc = "A copy of [title] by [author]. Dry and long, but not unmanageable. Basic knowledge is required to understand the concepts written." - if(SKILL_ADEPT) // adept > expert - name = "advanced [skill_name] textbook" - desc = "A copy of [title] by [author]. Those not already trained in the subject will have a hard time reading this. Try not to drop it either, it will put a hole in the floor." - if(SKILL_EXPERT to SKILL_MAX) //expert > prof - name = "theoretical [skill_name] textbook" - desc = "A copy of [title] by [author]. Significant experience in the subject is required to read this incredibly information dense block of paper. Sadly, does not come in audio form." - - if((!skill || !skill_req) && !custom)//That's a bad book, so just grab ANY child to replace it. Custom books are fine though they can be bad if they want. - if(subtypesof(src.type)) - var/new_book = pick(subtypesof(src.type)) - new new_book(src.loc) - qdel_self() - -/datum/skill_buff/skill_book - limit = 1 // you can only read one book at a time nerd, therefore you can only get one buff at a time - -/obj/item/book/skill/get_single_monetary_worth() - . = max(..(), 200) + (100 * skill_req) - -/obj/item/book/skill/proc/check_can_read(mob/user) - if(QDELETED(user)) - return FALSE - var/effective_title = length(title) ? title : "the textbook" - if(!CanPhysicallyInteract(user)) - to_chat(user, SPAN_WARNING("You can't reach [effective_title]!")) - return FALSE - if(!skill || (custom && progress == SKILLBOOK_PROG_NONE)) - to_chat(user, SPAN_WARNING("[capitalize(effective_title)] is blank!")) - return FALSE - if(custom && progress < SKILLBOOK_PROG_FINISH) - to_chat(user, SPAN_WARNING("[capitalize(effective_title)] is unfinished! You can't learn from it in this state!")) - return FALSE - if(!ez_read &&!user.skill_check(SKILL_LITERACY, SKILL_BASIC)) - to_chat(user, SPAN_WARNING(pick(list( - "Haha, you know you can't read. Good joke. Put [effective_title] back.", - "You open up [effective_title], but there aren't any pictures, so you close it again.", - "You don't know how to read! What good is [effective_title] to you?!" - )))) - return FALSE - - if(reading) - if(reading.resolve() != user) - to_chat(user, SPAN_WARNING("\The [reading.resolve()] is already reading [effective_title]!")) - else - to_chat(user, SPAN_WARNING("You are already reading [effective_title]!")) - return FALSE - - if(user.too_many_buffs(/datum/skill_buff/skill_book)) - to_chat(user, SPAN_WARNING("You can't read two books at once!")) - return FALSE - - if(!user.skill_check(skill, skill_req)) - to_chat(user, SPAN_WARNING("[capitalize(title)] is too advanced for you! Try something easier, perhaps the \"For Idiots\" edition?")) - return FALSE - - if(user.get_skill_value(skill) > skill_req) - to_chat(user, SPAN_WARNING("You already know everything [effective_title] has to teach you!")) - return FALSE - - return TRUE - -/obj/item/book/skill/verb/read_book() - set name = "Read Book" - set category = "Object" - set src in view(1) - try_to_read(usr) - -/obj/item/book/skill/try_to_read(mob/user) - - if(isobserver(user)) - to_chat(user, SPAN_WARNING("Ghosts can't read! Go away!")) - return TRUE - - if(isturf(loc)) - user.face_atom(src) - - if(user && user == reading?.resolve()) - //Close book, get rid of buffs - unlearn(user) - to_chat(user, SPAN_NOTICE("You close [title]. That's enough learning for now.")) - reading = null - STOP_PROCESSING(SSprocessing, src) - return TRUE - - if(!check_can_read(user)) - return FALSE - - to_chat(user, SPAN_NOTICE("You open up [title] and start reading...")) - if(!user.do_skilled(4 SECONDS, SKILL_LITERACY, src, 0.75)) - to_chat(user, SPAN_DANGER("Your perusal of [title] was interrupted!")) - return TRUE - - if(!check_can_read(user)) - return TRUE - - var/list/buff = list() - buff[skill] = 1 - user.buff_skill(buff, buff_type = /datum/skill_buff/skill_book) - reading = weakref(user) - to_chat(user, SPAN_NOTICE("You find the information you need! Better keep the page open to reference it.")) - START_PROCESSING(SSprocessing, src) - return TRUE - -// buff removal -/obj/item/book/skill/proc/unlearn(var/mob/user) - var/list/F = user.fetch_buffs_of_type(/datum/skill_buff/skill_book, 0) - for(var/datum/skill_buff/skill_book/S in F) - S.remove() - -/obj/item/book/skill/Process() - if(!reading) - return PROCESS_KILL - check_buff() - -/obj/item/book/skill/proc/check_buff() - if(!reading) - return - var/mob/R = reading.resolve() - if(!istype(R) || !CanPhysicallyInteract(R)) - remove_buff() - -/obj/item/book/skill/proc/remove_buff() - var/mob/R = reading?.resolve() - reading = null - if(istype(R)) - to_chat(R, SPAN_DANGER("You lose the page you were on! You can't cross-reference using [title] like this!")) - if(R.fetch_buffs_of_type(/datum/skill_buff/skill_book, 0)) - unlearn(R) - STOP_PROCESSING(SSprocessing, src) - -/obj/item/book/skill/Destroy() - global.events_repository.unregister(/decl/observ/moved, src, src) - remove_buff() - . = ..() - -//////////////////////////////// -//THIS IS WHERE THE BOOKS LIVE// -//////////////////////////////// - -/* -ORGANIZATIONAL -*/ -/obj/item/book/skill/organizational - abstract_type = /obj/item/book/skill/organizational - -//literacy -/obj/item/book/skill/organizational/literacy - skill = SKILL_LITERACY - -/obj/item/book/skill/organizational/literacy/basic - name = "alphabet book" - icon_state = "tb_literacy" - author = "Dorothy Mulch" - custom = TRUE - w_class = ITEM_SIZE_NORMAL // A little bit smaller c: - ez_read = TRUE - -//finance -/obj/item/book/skill/organizational/finance - skill = SKILL_FINANCE - author = "Cadence Bennett" - icon_state = "tb_finance" - -/obj/item/book/skill/organizational/finance/basic - name = "beginner finance textbook" - -/obj/item/book/skill/organizational/finance/adept - skill_req = SKILL_BASIC - name = "intermediate finance textbook" - -/obj/item/book/skill/organizational/finance/expert - skill_req = SKILL_ADEPT - name = "advanced finance textbook" - -/obj/item/book/skill/organizational/finance/prof - skill_req = SKILL_EXPERT - name = "theoretical finance textbook" - -/* -GENERAL -*/ -/obj/item/book/skill/general - abstract_type = /obj/item/book/skill/general - -//eva -/obj/item/book/skill/general/eva - icon_state = "evabook" - skill = SKILL_EVA - author = "Big Dark" - -/obj/item/book/skill/general/eva/basic - name = "beginner extra-vehicular activity textbook" - -/obj/item/book/skill/general/eva/adept - skill_req = SKILL_BASIC - name = "intermediate extra-vehicular activity textbook" - -/obj/item/book/skill/general/eva/expert - skill_req = SKILL_ADEPT - name = "advanced extra-vehicular activity textbook" - -/obj/item/book/skill/general/eva/prof - skill_req = SKILL_EXPERT - name = "theoretical extra-vehicular activity textbook" - -//mech -/obj/item/book/skill/general/mech - icon_state = "tb_mech" - skill = SKILL_MECH - author = "J.T. Marsh" - -/obj/item/book/skill/general/mech/basic - name = "beginner exosuit operation textbook" - -/obj/item/book/skill/general/mech/adept - skill_req = SKILL_BASIC - name = "intermediate exosuit operation textbook" - -/obj/item/book/skill/general/mech/expert - skill_req = SKILL_ADEPT - name = "advanced exosuit operation textbook" - -/obj/item/book/skill/general/mech/prof - skill_req = SKILL_EXPERT - name = "theoretical exosuit operation textbook" - -//piloting -/obj/item/book/skill/general/pilot - skill = SKILL_PILOT - author = "Sumi Shimamoto" - icon_state = "tb_pilot" - -/obj/item/book/skill/general/pilot/basic - name = "beginner piloting textbook" - -/obj/item/book/skill/general/pilot/adept - skill_req = SKILL_BASIC - name = "intermediate piloting textbook" - -/obj/item/book/skill/general/pilot/expert - skill_req = SKILL_ADEPT - name = "advanced piloting textbook" - -/obj/item/book/skill/general/pilot/prof - skill_req = SKILL_EXPERT - name = "theoretical piloting textbook" - -//hauling -/obj/item/book/skill/general/hauling - skill = SKILL_HAULING - author = "Chiel Brunt" - icon_state = "tb_hauling" - -/obj/item/book/skill/general/hauling/basic - name = "beginner athletics textbook" - -/obj/item/book/skill/general/hauling/adept - skill_req = SKILL_BASIC - name = "intermediate athletics textbook" - -/obj/item/book/skill/general/hauling/expert - skill_req = SKILL_ADEPT - name = "advanced athletics textbook" - -/obj/item/book/skill/general/hauling/prof - skill_req = SKILL_EXPERT - name = "theoretical athletics textbook" - -//computer -/obj/item/book/skill/general/computer - skill = SKILL_COMPUTER - author = "Simona Castiglione" - icon_state = "bookNuclear" - -/obj/item/book/skill/general/computer/basic - name = "beginner information technology textbook" - -/obj/item/book/skill/general/computer/adept - skill_req = SKILL_BASIC - name = "intermediate information technology textbook" - -/obj/item/book/skill/general/computer/expert - skill_req = SKILL_ADEPT - name = "advanced information technology textbook" - -/obj/item/book/skill/general/computer/prof - skill_req = SKILL_EXPERT - name = "theoretical information technology textbook" - -/* -SERVICE -*/ -/obj/item/book/skill/service - abstract_type = /obj/item/book/skill/service - -//botany -/obj/item/book/skill/service/botany - icon_state = "bookHydroponicsPodPeople" - skill = SKILL_BOTANY - author = "Mai Dong Chat" - -/obj/item/book/skill/service/botany/basic - name = "beginner botany textbook" - -/obj/item/book/skill/service/botany/adept - skill_req = SKILL_BASIC - name = "intermediate botany textbook" - -/obj/item/book/skill/service/botany/expert - skill_req = SKILL_ADEPT - name = "advanced botany textbook" - -/obj/item/book/skill/service/botany/prof - skill_req = SKILL_EXPERT - name = "theoretical botany textbook" - -//cooking -/obj/item/book/skill/service/cooking - icon_state = "barbook" - skill = SKILL_COOKING - author = "Lavinia Burrows" - -/obj/item/book/skill/service/cooking/basic - name = "beginner cooking textbook" - -/obj/item/book/skill/service/cooking/adept - skill_req = SKILL_BASIC - name = "intermediate cooking textbook" - -/obj/item/book/skill/service/cooking/expert - skill_req = SKILL_ADEPT - name = "advanced cooking textbook" - -/obj/item/book/skill/service/cooking/prof - skill_req = SKILL_EXPERT - name = "theoretical cooking textbook" - -/* -SECURITY -*/ -/obj/item/book/skill/security - abstract_type = /obj/item/book/skill/security - icon_state = "bookSpaceLaw" - -//combat -/obj/item/book/skill/security/combat - skill = SKILL_COMBAT - author = "Autumn Eckhardstein" - icon_state = "tb_combat" - -/obj/item/book/skill/security/combat/basic - name = "beginner close combat textbook" - -/obj/item/book/skill/security/combat/adept - skill_req = SKILL_BASIC - name = "intermediate close combat textbook" - -/obj/item/book/skill/security/combat/expert - skill_req = SKILL_ADEPT - name = "advanced close combat textbook" - -/obj/item/book/skill/security/combat/prof - skill_req = SKILL_EXPERT - name = "theoretical close combat textbook" - -//weapons -/obj/item/book/skill/security/weapons - skill = SKILL_WEAPONS - author = "Miho Tatsu" - icon_state = "tb_weapon" - -/obj/item/book/skill/security/weapons/basic - name = "beginner weapons expertise textbook" - -/obj/item/book/skill/security/weapons/adept - skill_req = SKILL_BASIC - name = "intermediate weapons expertise textbook" - -/obj/item/book/skill/security/weapons/expert - skill_req = SKILL_ADEPT - name = "advanced weapons expertise textbook" - -/obj/item/book/skill/security/weapons/prof - skill_req = SKILL_EXPERT - name = "theoretical weapons expertise textbook" - -//forensics -/obj/item/book/skill/security/forensics - icon_state = "bookDetective" - skill = SKILL_FORENSICS - author = "Samuel Vimes" - -/obj/item/book/skill/security/forensics/basic - name = "beginner forensics textbook" - -/obj/item/book/skill/security/forensics/adept - skill_req = SKILL_BASIC - name = "intermediate forensics textbook" - -/obj/item/book/skill/security/forensics/expert - skill_req = SKILL_ADEPT - name = "advanced forensics textbook" - -/obj/item/book/skill/security/forensics/prof - skill_req = SKILL_EXPERT - name = "theoretical forensics textbook" - -/* -ENGINEERING -*/ -/obj/item/book/skill/engineering - abstract_type = /obj/item/book/skill/engineering - icon_state = "bookEngineering" - -//construction -/obj/item/book/skill/engineering/construction/ - author = "Robert Bildar" - skill = SKILL_CONSTRUCTION - -/obj/item/book/skill/engineering/construction/basic - name = "beginner construction textbook" - -/obj/item/book/skill/engineering/construction/adept - skill_req = SKILL_BASIC - name = "intermediate construction textbook" - -/obj/item/book/skill/engineering/construction/expert - skill_req = SKILL_ADEPT - name = "advanced construction textbook" - -/obj/item/book/skill/engineering/construction/prof - skill_req = SKILL_EXPERT - name = "theoretical construction textbook" - -//electrical -/obj/item/book/skill/engineering/electrical - skill = SKILL_ELECTRICAL - author = "Ariana Vanderbalt" - -/obj/item/book/skill/engineering/electrical/basic - name = "beginner electrical engineering textbook" - -/obj/item/book/skill/engineering/electrical/adept - skill_req = SKILL_BASIC - name = "intermediate electrical engineering textbook" - -/obj/item/book/skill/engineering/electrical/expert - skill_req = SKILL_ADEPT - name = "advanced electrical engineering textbook" - -/obj/item/book/skill/engineering/electrical/prof - skill_req = SKILL_EXPERT - name = "theoretical electrical engineering textbook" - -//atmos -/obj/item/book/skill/engineering/atmos - skill = SKILL_ATMOS - author = "Maria Crash" - icon_state = "pipingbook" - -/obj/item/book/skill/engineering/atmos/basic - name = "beginner atmospherics textbook" - -/obj/item/book/skill/engineering/atmos/adept - skill_req = SKILL_BASIC - name = "intermediate atmospherics textbook" - -/obj/item/book/skill/engineering/atmos/expert - skill_req = SKILL_ADEPT - name = "advanced atmospherics textbook" - -/obj/item/book/skill/engineering/atmos/prof - skill_req = SKILL_EXPERT - name = "theoretical atmospherics textbook" - -//engines -/obj/item/book/skill/engineering/engines - skill = SKILL_ENGINES - author = "Gilgamesh Scholz" - -/obj/item/book/skill/engineering/engines/basic - name = "beginner engines textbook" - -/obj/item/book/skill/engineering/engines/adept - skill_req = SKILL_BASIC - name = "intermediate engines textbook" - -/obj/item/book/skill/engineering/engines/expert - skill_req = SKILL_ADEPT - name = "advanced engines textbook" - -/obj/item/book/skill/engineering/engines/prof - skill_req = SKILL_EXPERT - name = "theoretical engines textbook" - -/obj/item/book/skill/engineering/engines/prof/magazine - name = "theoretical engines magazine" - title = "\improper WetSkrell magazine" - icon_state = "bookMagazine" - custom = TRUE - author = "Unknown" - desc = "Sure, it includes highly detailed information on extremely advanced engine and power generator systems... but why is it written in marker on a tentacle porn magazine?" - w_class = ITEM_SIZE_NORMAL - - -/* -RESEARCH -*/ -/obj/item/book/skill/research - abstract_type = /obj/item/book/skill/research - icon_state = "analysis" - -//devices -/obj/item/book/skill/research/devices - author = "Nilva Plosinjak" - skill = SKILL_DEVICES - -/obj/item/book/skill/research/devices/basic - name = "beginner complex devices textbook" - -/obj/item/book/skill/research/devices/adept - skill_req = SKILL_BASIC - name = "intermediate complex devices textbook" - -/obj/item/book/skill/research/devices/expert - skill_req = SKILL_ADEPT - name = "advanced complex devices textbook" - -/obj/item/book/skill/research/devices/prof - skill_req = SKILL_EXPERT - name = "theoretical complex devices textbook" - -//science -/obj/item/book/skill/research/science - author = "Hui Ying Ch'ien" - skill = SKILL_SCIENCE - -/obj/item/book/skill/research/science/basic - name = "beginner science textbook" - -/obj/item/book/skill/research/science/adept - skill_req = SKILL_BASIC - name = "intermediate science textbook" - -/obj/item/book/skill/research/science/expert - skill_req = SKILL_ADEPT - name = "advanced science textbook" - -/obj/item/book/skill/research/science/prof - skill_req = SKILL_EXPERT - name = "theoretical science textbook" - -/* -MEDICAL -*/ -/obj/item/book/skill/medical - abstract_type = /obj/item/book/skill/medical - icon_state = "bookMedical" - -//chemistry -/obj/item/book/skill/medical/chemistry - icon_state = "chemistry" - author = "Dr. Shinula Nyekundujicho" - skill = SKILL_CHEMISTRY - -/obj/item/book/skill/medical/chemistry/basic - name = "beginner chemistry textbook" - -/obj/item/book/skill/medical/chemistry/adept - skill_req = SKILL_BASIC - name = "intermediate chemistry textbook" - -/obj/item/book/skill/medical/chemistry/expert - skill_req = SKILL_ADEPT - name = "advanced chemistry textbook" - -/obj/item/book/skill/medical/chemistry/prof - skill_req = SKILL_EXPERT - name = "theoretical chemistry textbook" - -//medicine -/obj/item/book/skill/medical/medicine - author = "Dr. Nagarjuna Siddha" - skill = SKILL_MEDICAL - -/obj/item/book/skill/medical/medicine/basic - name = "beginner medicine textbook" - title = "\"Instructional Guide on How Rubbing Dirt In Wounds Might Not Be The Right Approach To Stopping Bleeding Anymore\"" - desc = "A copy of \"Instructional Guide on How Rubbing Dirt In Wounds Might Not Be The Right Approach To Stopping Bleeding Anymore\" by Dr. Merrs. Despite the information density of this heavy book, it lacks any and all teachings regarding bedside manner." - author = "Dr. Merrs" - custom = TRUE - -/obj/item/book/skill/medical/medicine/adept - skill_req = SKILL_BASIC - name = "intermediate medicine textbook" - -/obj/item/book/skill/medical/medicine/expert - skill_req = SKILL_ADEPT - name = "advanced medicine textbook" - -/obj/item/book/skill/medical/medicine/prof - skill_req = SKILL_EXPERT - name = "theoretical medicine textbook" - -//anatomy -/obj/item/book/skill/medical/anatomy - author = "Dr. Basil Cartwright" - skill = SKILL_ANATOMY - -/obj/item/book/skill/medical/anatomy/basic - name = "beginner anatomy textbook" - -/obj/item/book/skill/medical/anatomy/adept - skill_req = SKILL_BASIC - name = "intermediate anatomy textbook" - -/obj/item/book/skill/medical/anatomy/expert - skill_req = SKILL_ADEPT - name = "advanced anatomy textbook" - -/obj/item/book/skill/medical/anatomy/prof - skill_req = SKILL_EXPERT - name = "theoretical anatomy textbook" - - -////////////////////// -//Custom Skill Books// -////////////////////// - -//custom skill books made by players. Right now it is extremely dodgy and bad and i'm sorry -/obj/item/book/skill/custom - name = "blank textbook" - desc = "A somewhat heftier blank book, just ready to filled with knowledge and sold at an unreasonable price." - custom = TRUE - author = null - progress = SKILLBOOK_PROG_NONE - icon_state = "tb_white" - var/skill_option_string = "Skill" //changes to "continue writing content" when the book is in progress - var/true_author //Used to keep track of who is actually writing the book. - var/list/failure_messages = list("Your hand slips and you accidentally rip your pen through several pages, ruining your hard work!","Your pen slips, dragging a haphazard line across both open pages! Now you need to do those again!") - var/list/progress_messages = list("Still quite a few blank pages left.","Feels like you're near halfway done.","You've made good progress.","Just needs a few finishing touches.","And then finish it. Done!") // Messages are in order of progress. - var/list/charge_messages = list("Your mind instantly recoils at the idea of having to write another textbook. No thank you!","You are far too mentally exhausted to write another textbook. Maybe another day.","Your hand aches in response to the very idea of more textbook writing.") - var/writing_time = 15 SECONDS // time it takes to write a segment of the book. This happens 6 times total - -//these all show up in the book fabricator -/obj/item/book/skill/custom/circle - icon_state = "tb_white_circle" -/obj/item/book/skill/custom/star - icon_state = "tb_white_star" -/obj/item/book/skill/custom/hourglass - icon_state = "tb_white_hourglass" -/obj/item/book/skill/custom/cracked - icon_state = "tb_white_cracked" -/obj/item/book/skill/custom/gun - icon_state = "tb_white_gun" -/obj/item/book/skill/custom/wrench - icon_state = "tb_white_wrench" -/obj/item/book/skill/custom/glass - icon_state = "tb_white_glass" - -/obj/item/book/skill/custom/cross - icon_state = "tb_white_cross" -/obj/item/book/skill/custom/text - icon_state = "tb_white_text" -/obj/item/book/skill/custom/download - icon_state = "tb_white_download" -/obj/item/book/skill/custom/uparrow - icon_state = "tb_white_uparrow" -/obj/item/book/skill/custom/percent - icon_state = "tb_white_percent" -/obj/item/book/skill/custom/flask - icon_state = "tb_white_flask" -/obj/item/book/skill/custom/detective - icon_state = "tb_white_detective" -/obj/item/book/skill/custom/device - icon_state = "tb_white_device" -/obj/item/book/skill/custom/smile - icon_state = "tb_white_smile" -/obj/item/book/skill/custom/exclamation - icon_state = "tb_white_exclamation" -/obj/item/book/skill/custom/question - icon_state = "tb_white_question" - -/obj/item/book/skill/custom/attackby(obj/item/pen, mob/user) - if(IS_PEN(pen)) - - if(!user.skill_check(SKILL_LITERACY, SKILL_BASIC)) - to_chat(user, SPAN_WARNING("You can't even read, yet you want to write a whole educational textbook?")) - return - if(!user.skill_check(SKILL_LITERACY, SKILL_PROF)) - to_chat(user, SPAN_WARNING("You have no clue as to how to write an entire textbook in a way that is actually useful. Maybe a regular book would be better?")) - return - var/state_check = skill_option_string // the state skill_option_string is in just before opening the input - var/choice = input(user, "What would you like to change?","Textbook editing") as null|anything in list("Title", "Author", skill_option_string) - if(!can_write(pen,user)) - return - - switch(choice) - if("Title") - edit_title(pen, user) - - if("Skill") - if(state_check != "Skill") // make sure someone hasn't already started the book while we were staring at menus woops - to_chat(user, SPAN_WARNING("The skill has already been selected and the writing started.")) - return - edit_skill(pen, user) - - if("Continue writing content") - if(state_check != "Continue writing content") - return - continue_skill(pen, user) - - if("Author") - edit_author(pen, user) - - else - return - - if(skill && title && author) // we have everything we need so lets set a good description - desc = "A handwritten textbook titled [title], by [author]. Looks like it teaches [skill_name]." - return - ..() - -/obj/item/book/skill/custom/proc/can_write(var/obj/item/pen, var/mob/user) - if(user.get_active_hand() == pen && CanPhysicallyInteractWith(user,src) && !QDELETED(src) && !QDELETED(pen)) - return TRUE - else - to_chat(user,SPAN_DANGER("How can you expect to write anything when you can't physically put pen to paper?")) - return FALSE - -/obj/item/book/skill/custom/proc/edit_title(var/obj/item/pen, var/mob/user) - var/newtitle = reject_bad_text(sanitize_safe(input(user, "Write a new title:"))) - if(!can_write(pen,user)) - return - if(!newtitle) - to_chat(user, "The title is invalid.") - return - else - newtitle = user.handle_writing_literacy(user, newtitle) - if(newtitle) - title = newtitle - SetName(title) - -/obj/item/book/skill/custom/proc/edit_author(var/obj/item/pen, var/mob/user) - var/newauthor = sanitize(input(user, "Write the author's name:")) - if(!can_write(pen,user)) - return - if(!newauthor) - to_chat(user, SPAN_WARNING("The author name is invalid.")) - return - else - newauthor = user.handle_writing_literacy(user, newauthor) - if(newauthor) - author = newauthor - -/obj/item/book/skill/custom/proc/edit_skill(var/obj/item/pen, var/mob/user) - if(user.skillset.literacy_charges <= 0) - to_chat(user, SPAN_WARNING(pick(charge_messages))) - return - - //Choosing the skill - var/list/skill_choices = list() - for(var/decl/hierarchy/skill/S in global.skills) - if(user.skill_check(S.type, SKILL_BASIC)) - LAZYADD(skill_choices, S) - var/decl/hierarchy/skill/skill_choice = input(user, "What subject does your textbook teach?", "Textbook skill selection") as null|anything in skill_choices - if(!can_write(pen,user) || progress == SKILLBOOK_PROG_FINISH) - return - if(!skill_choice) - to_chat(user, SPAN_WARNING("Textbook skill selection cancelled.")) - return - var/newskill = skill_choice.type - - //Choosing the level - var/list/skill_levels = skill_choice.levels.Copy() - for(var/SL in skill_levels) - if(!user.skill_check(newskill, skill_levels.Find(SL))) - LAZYREMOVE(skill_levels, SL) - else - skill_levels[SL] = skill_levels.Find(SL) - LAZYREMOVE(skill_levels,skill_levels[1]) - var/newskill_level = input(user, "What level of education does it provide?","Textbook skill level") as null|anything in skill_levels - if(!can_write(pen,user) || progress == SKILLBOOK_PROG_FINISH) - return - if(!newskill_level) - to_chat(user, SPAN_WARNING("Textbook skill level selection cancelled.")) - return - var/usable_level = skill_levels[newskill_level] - if(newskill && usable_level) - if(!do_after(user, writing_time, src)) - to_chat(user, SPAN_DANGER(pick(failure_messages))) - return - //everything worked out so now we can put the learnings in the book - to_chat(user, SPAN_NOTICE("You start writing your book, getting a few pages in.")) - skill = newskill - skill_name = skill_choice.name - skill_req = (usable_level - 1) - desc = "A handwritten textbook on [skill_choice]! Wow!" - progress += 1 - skill_option_string = "Continue writing content" - true_author = user.name - -/obj/item/book/skill/custom/proc/continue_skill(var/obj/item/pen, var/mob/user) - if(user.skillset.literacy_charges <= 0) - to_chat(user, SPAN_WARNING(pick(charge_messages))) - return - if(progress >= SKILLBOOK_PROG_FINISH) // shouldn't happen but here just in case - to_chat(user, SPAN_WARNING("This book is already finished! There's no need to add anything else!")) - return - if(true_author != user.name) - to_chat(user, SPAN_WARNING("This isn't your work and you're not really sure how to continue it.")) - return - else - if(!do_after(user, writing_time, src)) - to_chat(user, SPAN_DANGER(pick(failure_messages))) - return - to_chat(user, SPAN_NOTICE("You continue writing your book. [progress_messages[progress]]")) - progress += 1 - if(progress == SKILLBOOK_PROG_FINISH) // book is finished! yay! - user.skillset.literacy_charges -= 1 - skill_option_string = "Cancel" - - -////////////////////// -// SHELF SHELF SHELF// -////////////////////// - -/obj/structure/bookcase/skill_books - name = "textbook bookcase" - // Contains a list of parent types but doesn't actually DO anything with them. Use a child of this book case - var/list/catalogue = list(/obj/item/book/skill/organizational/finance, - /obj/item/book/skill/organizational/literacy, - /obj/item/book/skill/general/eva, - /obj/item/book/skill/general/mech, - /obj/item/book/skill/general/pilot, - /obj/item/book/skill/general/hauling, - /obj/item/book/skill/general/computer, - /obj/item/book/skill/service/botany, - /obj/item/book/skill/service/cooking, - /obj/item/book/skill/security/combat, - /obj/item/book/skill/security/weapons, - /obj/item/book/skill/security/forensics, - /obj/item/book/skill/engineering/construction, - /obj/item/book/skill/engineering/electrical, - /obj/item/book/skill/engineering/atmos, - /obj/item/book/skill/engineering/engines, - /obj/item/book/skill/research/devices, - /obj/item/book/skill/research/science, - /obj/item/book/skill/medical/chemistry, - /obj/item/book/skill/medical/medicine, - /obj/item/book/skill/medical/anatomy) - -//give me ALL the textbooks -/obj/structure/bookcase/skill_books/all - -/obj/structure/bookcase/skill_books/all/Initialize() - . = ..() - for(var/category in catalogue) - for(var/real_book in subtypesof(category)) - new real_book(src) - -//Bookshelf with some random textbooks -/obj/structure/bookcase/skill_books/random - -/obj/structure/bookcase/skill_books/random/Initialize() - . = ..() - for(var/category in catalogue) - for(var/real_book in subtypesof(category)) - if(prob(20)) - new real_book(src) - -#undef RANDOM_BOOK_TITLE -#undef SKILLBOOK_PROG_NONE -#undef SKILLBOOK_PROG_FINISH \ No newline at end of file diff --git a/code/game/objects/items/christmas.dm b/code/game/objects/items/christmas.dm index d9426b5c869..dcec3504c05 100644 --- a/code/game/objects/items/christmas.dm +++ b/code/game/objects/items/christmas.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/christmas.dmi' icon_state = "cracker" desc = "Directions for use: Requires two people, one to pull each end." - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard var/cracked = 0 /obj/item/toy/xmas_cracker/attack(mob/target, mob/user) @@ -42,7 +42,7 @@ desc = "A crappy paper crown that you are REQUIRED to wear." flags_inv = 0 body_parts_covered = 0 - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/paper var/list/permitted_colors = list(COLOR_RED, COLOR_ORANGE, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_INDIGO, COLOR_VIOLET) /obj/item/clothing/head/festive/Initialize() diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index ceacd9ef1bb..50ae3c0eebc 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -5,8 +5,8 @@ a hostile enviroment." icon = 'icons/obj/closets/cryobag.dmi' icon_state = "bodybag_folded" - origin_tech = "{'biotech':4}" - material = /decl/material/solid/plastic + origin_tech = @'{"biotech":4}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, @@ -28,7 +28,7 @@ a hostile enviroment." icon = 'icons/obj/closets/cryobag.dmi' item_path = /obj/item/bodybag/cryobag - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic storage_types = CLOSET_STORAGE_MOBS var/datum/gas_mixture/airtank @@ -114,7 +114,7 @@ desc = "Pretty useless now.." icon_state = "bodybag_used" icon = 'icons/obj/closets/cryobag.dmi' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 7e14954938a..697dccf3843 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -4,7 +4,7 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY - origin_tech = "{'programming':4,'materials':4}" + origin_tech = @'{"programming":4,"materials":4}' material = /decl/material/solid/fiberglass matter = list(/decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT) @@ -22,7 +22,7 @@ data["has_ai"] = carded_ai != null if(carded_ai) data["name"] = carded_ai.name - data["hardware_integrity"] = carded_ai.hardware_integrity() + data["hardware_integrity"] = carded_ai.get_health_percent() data["backup_capacitor"] = carded_ai.backup_capacitor() data["radio"] = !carded_ai.ai_radio.disabledAi data["wireless"] = !carded_ai.control_disabled @@ -58,7 +58,6 @@ to_chat(carded_ai, "Your core files are being wiped!") while (carded_ai && carded_ai.stat != DEAD) carded_ai.adjustOxyLoss(2) - carded_ai.updatehealth() sleep(10) flush = 0 if (href_list["radio"]) diff --git a/code/game/objects/items/devices/auto_cpr.dm b/code/game/objects/items/devices/auto_cpr.dm index ed0282926cd..cfa6fd549e8 100644 --- a/code/game/objects/items/devices/auto_cpr.dm +++ b/code/game/objects/items/devices/auto_cpr.dm @@ -4,9 +4,9 @@ icon = 'icons/obj/items/device/auto_cpr.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_NORMAL - origin_tech = "{'magnets':2,'biotech':2}" + origin_tech = @'{"magnets":2,"biotech":2}' slot_flags = SLOT_OVER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/aluminium = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, @@ -17,10 +17,10 @@ var/last_pump var/skilled_setup -/obj/item/auto_cpr/mob_can_equip(mob/living/carbon/human/H, slot, disable_warning = 0, force = 0, ignore_equipped = 0) +/obj/item/auto_cpr/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() if(. && slot == slot_wear_suit_str) - . = H.get_bodytype_category() == BODYTYPE_HUMANOID + . = user?.get_bodytype_category() == BODYTYPE_HUMANOID /obj/item/auto_cpr/attack(mob/living/carbon/human/M, mob/living/user, var/target_zone) if(istype(M) && user.a_intent == I_HELP) diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index afddf5dae72..e69e5f80568 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -10,7 +10,7 @@ throwforce = 5 throw_range = 15 throw_speed = 3 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/glass = MATTER_AMOUNT_SECONDARY) /obj/item/binoculars/attack_self(mob/user) diff --git a/code/game/objects/items/devices/boombox.dm b/code/game/objects/items/devices/boombox.dm index 75854d61e58..d0b12f9240a 100644 --- a/code/game/objects/items/devices/boombox.dm +++ b/code/game/objects/items/devices/boombox.dm @@ -6,8 +6,8 @@ item_state = "boombox" force = 7 w_class = ITEM_SIZE_HUGE //forbid putting something that emits loud sounds forever into a backpack - origin_tech = "{'magnets':2,'combat':1}" - material = /decl/material/solid/plastic + origin_tech = @'{"magnets":2,"combat":1}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, @@ -169,7 +169,9 @@ /obj/item/boombox/on_update_icon() . = ..() - icon_state = playing ? "on" : "off" + icon_state = get_world_inventory_state() + if(playing) + icon_state = "[icon_state]_on" /obj/item/boombox/proc/stop() playing = 0 diff --git a/code/game/objects/items/devices/cable_painter.dm b/code/game/objects/items/devices/cable_painter.dm index 4317a987ff0..f645ac96109 100644 --- a/code/game/objects/items/devices/cable_painter.dm +++ b/code/game/objects/items/devices/cable_painter.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD var/color_selection w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/cable_painter/Initialize() . = ..() diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 1f9751c8bab..319144657d3 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -8,8 +8,8 @@ throw_speed = 1 throw_range = 5 w_class = ITEM_SIZE_SMALL - origin_tech = "{'esoteric':4,'magnets':4}" - material = /decl/material/solid/plastic + origin_tech = @'{"esoteric":4,"magnets":4}' + material = /decl/material/solid/organic/plastic var/can_use = 1 var/obj/effect/dummy/chameleon/active_dummy = null var/saved_item = /obj/item/trash/cigbutt diff --git a/code/game/objects/items/devices/dociler.dm b/code/game/objects/items/devices/dociler.dm index 6e0cf02352b..46d0b95f99f 100644 --- a/code/game/objects/items/devices/dociler.dm +++ b/code/game/objects/items/devices/dociler.dm @@ -2,11 +2,11 @@ name = "dociler" desc = "A complex single use recharging injector that spreads a complex neurological serum that makes animals docile and friendly. Somewhat." w_class = ITEM_SIZE_NORMAL - origin_tech = "{'biotech':5,'materials':2}" + origin_tech = @'{"biotech":5,"materials":2}' icon = 'icons/obj/items/device/animal_tagger.dmi' icon_state = ICON_STATE_WORLD force = 1 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT) var/loaded = 1 var/mode = "completely" diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 42ec93f807f..c2abca5dc79 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -8,7 +8,7 @@ throw_speed = 4 throw_range = 10 obj_flags = OBJ_FLAG_CONDUCTIBLE - origin_tech = "{'magnets':2,'combat':1}" + origin_tech = @'{"magnets":2,"combat":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) @@ -126,7 +126,7 @@ name = "advanced flash" desc = "A device that produces a very bright flash of light. This is an advanced and expensive version often issued to VIPs." icon = 'icons/obj/items/device/flash_advanced.dmi' - origin_tech = "{'combat':2,'magnets':2}" + origin_tech = @'{"combat":2,"magnets":2}' str_min = 3 str_max = 8 material = /decl/material/solid/metal/steel diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm deleted file mode 100644 index 9132994c2f8..00000000000 --- a/code/game/objects/items/devices/flashlight.dm +++ /dev/null @@ -1,504 +0,0 @@ -#define FLASHLIGHT_ALWAYS_ON 1 -#define FLASHLIGHT_SINGLE_USE 2 - -/obj/item/flashlight - name = "flashlight" - desc = "A hand-held emergency light." - icon = 'icons/obj/lighting.dmi' - icon_state = "flashlight" - item_state = "flashlight" - w_class = ITEM_SIZE_SMALL - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_LOWER_BODY - - material = /decl/material/solid/plastic - matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - - action_button_name = "Toggle Flashlight" - - var/on = FALSE - var/activation_sound = 'sound/effects/flashlight.ogg' - - var/flashlight_range = 4 // range of light when on, can be negative - var/flashlight_power // brightness of light when on - var/flashlight_flags = 0 // FLASHLIGHT_ bitflags - - light_wedge = LIGHT_WIDE - var/spawn_dir // a way for mappers to force which way a flashlight faces upon spawning - -/obj/item/flashlight/Initialize() - . = ..() - - set_flashlight() - update_icon() - -/obj/item/flashlight/on_update_icon() - . = ..() - if (flashlight_flags & FLASHLIGHT_ALWAYS_ON) - return // Prevent update_icon shennanigans with objects that won't have on/off variant sprites - - if(on) - icon_state = "[initial(icon_state)]-on" - else - icon_state = "[initial(icon_state)]" - -/obj/item/flashlight/attack_self(mob/user) - if (flashlight_flags & FLASHLIGHT_ALWAYS_ON) - to_chat(user, "You cannot toggle the [name].") - return 0 - - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the [name] on while in this [user.loc].")//To prevent some lighting anomalities. - return 0 - - if (flashlight_flags & FLASHLIGHT_SINGLE_USE && on) - to_chat(user, "The [name] is already lit.") - return 0 - - on = !on - if(on && activation_sound) - playsound(get_turf(src), activation_sound, 75, 1) - set_flashlight() - update_icon() - user.update_action_buttons() - return 1 - -/obj/item/flashlight/proc/set_flashlight() - if(light_wedge) - set_dir(pick(NORTH, SOUTH, EAST, WEST)) - if(spawn_dir) - set_dir(spawn_dir) - if (on) - set_light(flashlight_range, flashlight_power, light_color) - else - set_light(0) - -/obj/item/flashlight/examine(mob/user, distance) - . = ..() - if(light_wedge && isturf(loc)) - to_chat(user, FONT_SMALL(SPAN_NOTICE("\The [src] is facing [dir2text(dir)]."))) - -/obj/item/flashlight/dropped(mob/user) - . = ..() - if(light_wedge) - set_dir(user.dir) - update_light() - -/obj/item/flashlight/throw_at() - . = ..() - if(light_wedge) - var/new_dir = pick(NORTH, SOUTH, EAST, WEST) - set_dir(new_dir) - update_light() - -/obj/item/flashlight/attack(mob/living/M, mob/living/user) - add_fingerprint(user) - if(on && user.get_target_zone() == BP_EYES) - - if((MUTATION_CLUMSY in user.mutations) && prob(50)) //too dumb to use flashlight properly - return ..() //just hit them in the head - - var/mob/living/carbon/human/H = M //mob has protective eyewear - if(istype(H)) - for(var/slot in global.standard_headgear_slots) - var/obj/item/clothing/C = H.get_equipped_item(slot) - if(istype(C) && (C.body_parts_covered & SLOT_EYES)) - to_chat(user, "You're going to need to remove [C] first.") - return - - var/obj/item/organ/vision - var/decl/bodytype/root_bodytype = H.get_bodytype() - if(!root_bodytype.vision_organ || !H.should_have_organ(root_bodytype.vision_organ)) - to_chat(user, "You can't find anything on [H] to direct [src] into!") - return - - vision = GET_INTERNAL_ORGAN(H, root_bodytype.vision_organ) - if(!vision) - vision = root_bodytype.has_organ[root_bodytype.vision_organ] - var/decl/pronouns/G = H.get_pronouns() - to_chat(user, "\The [H] is missing [G.his] [initial(vision.name)]!") - return - - user.visible_message("\The [user] directs [src] into [M]'s [vision.name].", \ - "You direct [src] into [M]'s [vision.name].") - - inspect_vision(vision, user) - - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively - M.flash_eyes() - else - return ..() - -/obj/item/flashlight/proc/inspect_vision(obj/item/organ/vision, mob/living/user) - var/mob/living/carbon/human/H = vision.owner - - if(H == user) //can't look into your own eyes buster - return - - if(!BP_IS_PROSTHETIC(vision)) - - if(vision.owner.stat == DEAD || H.is_blind()) //mob is dead or fully blind - to_chat(user, "\The [H]'s pupils do not react to the light!") - return - if(MUTATION_XRAY in H.mutations) - to_chat(user, "\The [H]'s pupils give an eerie glow!") - if(vision.damage) - to_chat(user, "There's visible damage to [H]'s [vision.name]!") - else if(HAS_STATUS(H, STAT_BLURRY)) - to_chat(user, "\The [H]'s pupils react slower than normally.") - if(H.getBrainLoss() > 15) - to_chat(user, "There's visible lag between left and right pupils' reactions.") - - var/static/list/pinpoint = list( - /decl/material/liquid/painkillers/strong = 5, - /decl/material/liquid/amphetamines = 1 - ) - var/static/list/dilating = list( - /decl/material/liquid/psychoactives = 5, - /decl/material/liquid/hallucinogenics = 1, - /decl/material/liquid/adrenaline = 1 - ) - - var/datum/reagents/ingested = H.get_ingested_reagents() - if(H.reagents.has_any_reagent(pinpoint) || ingested?.has_any_reagent(pinpoint)) - to_chat(user, "\The [H]'s pupils are already pinpoint and cannot narrow any more.") - else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested?.has_any_reagent(dilating)) - to_chat(user, "\The [H]'s pupils narrow slightly, but are still very dilated.") - else - to_chat(user, "\The [H]'s pupils narrow.") - - //if someone wants to implement inspecting robot eyes here would be the place to do it. - -/obj/item/flashlight/upgraded - name = "\improper LED flashlight" - desc = "An energy efficient flashlight." - icon_state = "biglight" - item_state = "biglight" - flashlight_range = 6 - flashlight_power = 3 - -/obj/item/flashlight/flashdark - name = "flashdark" - desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure." - icon_state = "flashdark" - item_state = "flashdark" - w_class = ITEM_SIZE_NORMAL - flashlight_range = 8 - flashlight_power = -6 - -/obj/item/flashlight/pen - name = "penlight" - desc = "A pen-sized light, used by medical staff." - icon_state = "penlight" - item_state = "" - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_EARS - w_class = ITEM_SIZE_TINY - flashlight_range = 2 - light_wedge = LIGHT_OMNI - -/obj/item/flashlight/pen/Initialize() - set_extension(src, /datum/extension/tool, list(TOOL_PEN = TOOL_QUALITY_DEFAULT), list(TOOL_PEN = list(TOOL_PROP_COLOR = "black", TOOL_PROP_COLOR_NAME = "black"))) - . = ..() - -/obj/item/flashlight/maglight - name = "maglight" - desc = "A very, very heavy duty flashlight." - icon_state = "maglight" - item_state = "maglight" - force = 10 - attack_verb = list ("smacked", "thwacked", "thunked") - material = /decl/material/solid/metal/aluminium - matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - light_wedge = LIGHT_NARROW - -/******************************Lantern*******************************/ -/obj/item/flashlight/lantern - name = "lantern" - desc = "A mining lantern." - icon = 'icons/obj/lighting.dmi' - icon_state = "lantern" - item_state = "lantern" - force = 10 - attack_verb = list ("bludgeoned", "bashed", "whack") - w_class = ITEM_SIZE_NORMAL - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - flashlight_range = 2 - light_wedge = LIGHT_OMNI - light_color = LIGHT_COLOR_FIRE - -/obj/item/flashlight/lantern/on_update_icon() - . = ..() - if(on) - item_state = "lantern-on" - else - item_state = "lantern" - -/******************************Lantern*******************************/ - -/obj/item/flashlight/drone - name = "low-power flashlight" - desc = "A miniature lamp, that might be used by small robots." - icon_state = "penlight" - item_state = "" - obj_flags = OBJ_FLAG_CONDUCTIBLE - w_class = ITEM_SIZE_TINY - flashlight_range = 2 - - -// the desk lamps are a bit special -/obj/item/flashlight/lamp - name = "desk lamp" - desc = "A desk lamp with an adjustable mount." - icon_state = "lamp" - item_state = "lamp" - w_class = ITEM_SIZE_LARGE - obj_flags = OBJ_FLAG_CONDUCTIBLE - flashlight_range = 5 - light_wedge = LIGHT_OMNI - on = 1 - -// green-shaded desk lamp -/obj/item/flashlight/lamp/green - desc = "A classic green-shaded desk lamp." - icon_state = "lampgreen" - item_state = "lampgreen" - light_color = "#ffc58f" - flashlight_range = 4 - -/obj/item/flashlight/lamp/verb/toggle_light() - set name = "Toggle light" - set category = "Object" - set src in oview(1) - - if(!usr.stat) - attack_self(usr) - -// FLARES - -/obj/item/flashlight/flare - name = "flare" - desc = "A red standard-issue flare. There are instructions on the side reading 'pull cord, make light'." - w_class = ITEM_SIZE_TINY - light_color = "#e58775" - icon_state = "flare" - item_state = "flare" - action_button_name = null //just pull it manually, neckbeard. - activation_sound = 'sound/effects/flare.ogg' - flashlight_flags = FLASHLIGHT_SINGLE_USE - - flashlight_range = 5 - flashlight_power = 3 - light_wedge = LIGHT_OMNI - - var/fuel = 0 - var/on_damage = 7 - var/produce_heat = 1500 - -/obj/item/flashlight/flare/Initialize() - . = ..() - fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds.v - update_icon() - -/obj/item/flashlight/flare/Destroy() - . = ..() - STOP_PROCESSING(SSobj, src) - -/obj/item/flashlight/flare/Process() - if(produce_heat) - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(produce_heat, 5) - fuel = max(fuel - 1, 0) - if (fuel <= 0) - on = FALSE - if(!on) - update_damage() - set_flashlight() - update_icon() - STOP_PROCESSING(SSobj, src) - -/obj/item/flashlight/flare/attack_self(var/mob/user) - if(fuel <= 0) - to_chat(user,"\The [src] is spent.") - return 0 - - . = ..() - - if(.) - activate(user) - update_damage() - set_flashlight() - update_icon() - START_PROCESSING(SSobj, src) - -/obj/item/flashlight/flare/afterattack(var/obj/O, var/mob/user, var/proximity) - if(proximity && istype(O) && on) - O.HandleObjectHeating(src, user, 500) - ..() - -/obj/item/flashlight/flare/proc/activate(var/mob/user) - if(istype(user)) - user.visible_message("[user] pulls the cord on \the [src], activating it.", "You pull the cord on \the [src], activating it!") - -/obj/item/flashlight/flare/proc/update_damage() - if(on) - force = on_damage - damtype = BURN - else - force = initial(force) - damtype = initial(damtype) - -/obj/item/flashlight/flare/on_update_icon() - . = ..() - if(!on && fuel <= 0) - icon_state = "[initial(icon_state)]-empty" - -//Glowsticks -/obj/item/flashlight/flare/glowstick - name = "green glowstick" - desc = "A military-grade glowstick." - w_class = ITEM_SIZE_SMALL - color = "#49f37c" - icon_state = "glowstick" - item_state = "glowstick" - randpixel = 12 - produce_heat = 0 - activation_sound = 'sound/effects/glowstick.ogg' - - flashlight_range = 3 - flashlight_power = 2 - -/obj/item/flashlight/flare/glowstick/Initialize() - . = ..() - fuel = rand(1600, 2000) - light_color = color - -/obj/item/flashlight/flare/glowstick/on_update_icon() - var/nofuel = fuel <= 0 - if(nofuel) - on = FALSE - . = ..() - icon_state = nofuel? "glowstick-empty" : icon_state - item_state = initial(item_state) - if(on) - var/image/I = overlay_image(icon, "glowstick-on", color) - I.blend_mode = BLEND_ADD - add_overlay(I) - item_state = "glowstick-on" - update_held_icon() - -/obj/item/flashlight/flare/glowstick/activate(var/mob/user) - if(istype(user)) - user.visible_message("[user] cracks and shakes \the [src].", "You crack and shake \the [src], turning it on!") - -/obj/item/flashlight/flare/glowstick/red - name = "red glowstick" - color = "#fc0f29" - -/obj/item/flashlight/flare/glowstick/blue - name = "blue glowstick" - color = "#599dff" - -/obj/item/flashlight/flare/glowstick/orange - name = "orange glowstick" - color = "#fa7c0b" - -/obj/item/flashlight/flare/glowstick/yellow - name = "yellow glowstick" - color = "#fef923" - -/obj/item/flashlight/flare/glowstick/random - name = "glowstick" - desc = "A party-grade glowstick." - color = "#ff00ff" - -/obj/item/flashlight/flare/glowstick/random/Initialize() - color = rgb(rand(50,255),rand(50,255),rand(50,255)) - . = ..() - -/obj/item/flashlight/slime - gender = PLURAL - name = "glowing slime extract" - desc = "A glowing ball of what appears to be amber." - icon = 'icons/obj/lighting.dmi' - icon_state = "floor1" //not a slime extract sprite but... something close enough! - item_state = "slime" - w_class = ITEM_SIZE_TINY - on = TRUE //Bio-luminesence has one setting, on. - flashlight_flags = FLASHLIGHT_ALWAYS_ON - - flashlight_range = 5 - light_wedge = LIGHT_OMNI - -//hand portable floodlights for emergencies. Less bulky than the large ones. But also less light. Unused green variant in the sheet. - -/obj/item/flashlight/lamp/floodlamp - name = "flood lamp" - desc = "A portable emergency flood light with a ultra-bright LED." - icon = 'icons/obj/machines/floodlight.dmi' - icon_state = "floodlamp" - item_state = "lamp" - on = 0 - w_class = ITEM_SIZE_LARGE - obj_flags = OBJ_FLAG_CONDUCTIBLE | OBJ_FLAG_ROTATABLE - - flashlight_power = 1 - flashlight_range = 7 - light_wedge = LIGHT_WIDE - -/obj/item/flashlight/lamp/floodlamp/green - icon_state = "greenfloodlamp" - -//Lava Lamps: Because we're already stuck in the 70ies with those fax machines. -/obj/item/flashlight/lamp/lava - name = "lava lamp" - desc = "A kitchy throwback decorative light. Noir Edition." - icon = 'icons/obj/lighting.dmi' - icon_state = "lavalamp" - on = 0 - action_button_name = "Toggle lamp" - flashlight_range = 3 //range of light when on - material = /decl/material/solid/metal/aluminium - matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - -/obj/item/flashlight/lamp/lava/on_update_icon() - . = ..() - add_overlay(overlay_image(icon, "lavalamp-[on ? "on" : "off"]", light_color)) - -/obj/item/flashlight/lamp/lava/red - desc = "A kitchy red decorative light." - light_color = COLOR_RED - -/obj/item/flashlight/lamp/lava/blue - desc = "A kitchy blue decorative light" - light_color = COLOR_BLUE - -/obj/item/flashlight/lamp/lava/cyan - desc = "A kitchy cyan decorative light" - light_color = COLOR_CYAN - -/obj/item/flashlight/lamp/lava/green - desc = "A kitchy green decorative light" - light_color = COLOR_GREEN - -/obj/item/flashlight/lamp/lava/orange - desc = "A kitchy orange decorative light" - light_color = COLOR_ORANGE - -/obj/item/flashlight/lamp/lava/purple - desc = "A kitchy purple decorative light" - light_color = COLOR_PURPLE -/obj/item/flashlight/lamp/lava/pink - desc = "A kitchy pink decorative light" - light_color = COLOR_PINK - -/obj/item/flashlight/lamp/lava/yellow - desc = "A kitchy yellow decorative light" - light_color = COLOR_YELLOW - -#undef FLASHLIGHT_ALWAYS_ON -#undef FLASHLIGHT_SINGLE_USE diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 3baf8beca88..4f641b1f350 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -12,10 +12,10 @@ item_state = "multitool" w_class = ITEM_SIZE_SMALL action_button_name = "Toggle geiger counter" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE, ) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 3efffdd142c..ec81f341725 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -4,7 +4,7 @@ var/global/list/all_gps_units = list() desc = "A handheld relay used to triangulates the approximate co-ordinates of the device." icon = 'icons/obj/items/device/locator.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'materials':2,'programming':2,'wormholes':2}" + origin_tech = @'{"materials":2,"programming":2,"wormholes":2}' material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, @@ -35,7 +35,7 @@ var/global/list/all_gps_units = list() global.all_gps_units += src . = ..() name = "[initial(name)] ([gps_tag])" - events_repository.register(/decl/observ/moved, src, src, .proc/update_holder) + events_repository.register(/decl/observ/moved, src, src, PROC_REF(update_holder)) compass = new(src) update_holder() update_icon() @@ -65,8 +65,8 @@ var/global/list/all_gps_units = list() if(!force_clear && ismob(loc)) holder = loc - moved_event.register(holder, src, .proc/update_compass) - dir_set_event.register(holder, src, .proc/update_compass) + moved_event.register(holder, src, PROC_REF(update_compass)) + dir_set_event.register(holder, src, PROC_REF(update_compass)) if(!force_clear && holder && tracking) if(!is_in_processing_list) @@ -103,7 +103,7 @@ var/global/list/all_gps_units = list() STOP_PROCESSING(SSobj, src) is_in_processing_list = FALSE global.all_gps_units -= src - events_repository.unregister(/decl/observ/moved, src, src, .proc/update_holder) + events_repository.unregister(/decl/observ/moved, src, src, PROC_REF(update_holder)) update_holder(force_clear = TRUE) QDEL_NULL(compass) return ..() @@ -187,7 +187,7 @@ var/global/list/all_gps_units = list() var/duration = 5 MINUTES / severity_modifier emped = TRUE update_icon() - addtimer(CALLBACK(src, .proc/reset_emp), duration) + addtimer(CALLBACK(src, PROC_REF(reset_emp)), duration) /obj/item/gps/proc/reset_emp() emped = FALSE diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index 94abe1f2e14..a6815ebad30 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -61,7 +61,7 @@ to_chat(user, "Your hacking attempt was succesful!") user.playsound_local(get_turf(src), 'sound/piano/A#6.ogg', 50) known_targets.Insert(1, target) // Insert the newly hacked target first, - events_repository.register(/decl/observ/destroyed, target, src, /obj/item/multitool/hacktool/proc/on_target_destroy) + events_repository.register(/decl/observ/destroyed, target, src, TYPE_PROC_REF(/obj/item/multitool/hacktool, on_target_destroy)) else to_chat(user, "Your hacking attempt failed!") return 1 diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index 71034cc50a5..c20283863c9 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -11,10 +11,10 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY req_access = list(list(access_heads, access_security)) - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE, ) @@ -56,7 +56,7 @@ active = null update_icon() return TOPIC_REFRESH - + if(href_list["select"]) var/list/active_warrants = list() for(var/datum/computer_file/report/warrant/W in global.all_warrants) @@ -90,7 +90,7 @@ var/datum/report_field/signature/auth = active.field_from_name("Authorized by") if(choice == "Yes") auth.ask_value(user) - user.visible_message(SPAN_NOTICE("You swipe \the [I] through the [src]."), + user.visible_message(SPAN_NOTICE("You swipe \the [I] through the [src]."), SPAN_NOTICE("[user] swipes \the [I] through the [src].")) broadcast_security_hud_message("[active.get_broadcast_summary()] has been authorized by [auth.get_value()].", src) else diff --git a/code/game/objects/items/devices/inducer.dm b/code/game/objects/items/devices/inducer.dm index deb2571a584..042e24c5b04 100644 --- a/code/game/objects/items/devices/inducer.dm +++ b/code/game/objects/items/devices/inducer.dm @@ -5,24 +5,24 @@ icon_state = "inducer-sci" item_state = "inducer-sci" force = 7 - origin_tech = "{'powerstorage':6,'engineering':4}" + origin_tech = @'{"powerstorage":6,"engineering":4}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) slot_flags = SLOT_LOWER_BODY var/powertransfer = 500 var/coefficient = 0.9 - var/opened = FALSE var/failsafe = 0 - var/obj/item/cell/cell = /obj/item/cell var/recharging = FALSE /obj/item/inducer/Initialize() . = ..() - if(ispath(cell)) - cell = new cell(src) + setup_power_supply() update_icon() +/obj/item/inducer/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell, /obj/item/cell, /datum/extension/loaded_cell/panel, charge_value) + /obj/item/inducer/proc/induce(obj/item/cell/target) var/obj/item/cell/MyC = get_cell() var/missing = target.maxcharge - target.charge @@ -32,14 +32,6 @@ MyC.update_icon() target.update_icon() -/obj/item/inducer/get_cell() - return cell - -/obj/item/inducer/emp_act(severity) - ..() - if(cell) - cell.emp_act(severity) - /obj/item/inducer/afterattack(obj/O, mob/living/carbon/user, var/proximity) if (!proximity || user.a_intent == I_HURT || CannotUse(user) || !recharge(O, user)) return ..() @@ -54,29 +46,9 @@ return TRUE return FALSE - /obj/item/inducer/attackby(obj/item/W, mob/user) - if(IS_SCREWDRIVER(W)) - opened = !opened - to_chat(user, "You [opened ? "open" : "close"] the battery compartment.") - update_icon() - if(istype(W, /obj/item/cell)) - if (istype(W, /obj/item/cell/device)) - to_chat(user, "\The [src] only takes full-size power cells.") - return - if(opened) - if(!cell) - if(!user.try_unequip(W, src)) - return - to_chat(user, "You insert \the [W] into \the [src].") - cell = W - update_icon() - return - else - to_chat(user, "\The [src] already has \a [cell] installed!") - return if(CannotUse(user) || recharge(W, user)) - return + return TRUE return ..() /obj/item/inducer/proc/recharge(atom/A, mob/user) @@ -137,48 +109,22 @@ /obj/item/inducer/attack(mob/M, mob/user) return - -/obj/item/inducer/attack_self(mob/user) - if(opened && cell) - user.visible_message("\The [user] removes \the [cell] from \the [src]!","You remove \the [cell].") - cell.update_icon() - user.put_in_hands(cell) - cell = null - update_icon() - - -/obj/item/inducer/examine(mob/living/M) - . = ..() - var/obj/item/cell/MyC = get_cell() - if(MyC) - to_chat(M, "Its display shows: [MyC.percent()]%.") - else - to_chat(M,"Its display is dark.") - if(opened) - to_chat(M,"Its battery compartment is open.") - /obj/item/inducer/on_update_icon() . = ..() - if(opened) + var/datum/extension/loaded_cell/panel/cell_loaded = get_extension(src, /datum/extension/loaded_cell) + if(istype(cell_loaded) && cell_loaded.panel_open) add_overlay("inducer-[get_cell()? "bat" : "nobat"]") -/obj/item/inducer/Destroy() - . = ..() - if(!ispath(cell)) - QDEL_NULL(cell) - // module version /obj/item/inducer/borg icon_state = "inducer-engi" item_state = "inducer-engi" failsafe = 0.2 - cell = null -/obj/item/inducer/borg/attackby(obj/item/W, mob/user) - if(IS_SCREWDRIVER(W)) - return - . = ..() +/obj/item/inducer/borg/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return /obj/item/inducer/borg/on_update_icon() . = ..() @@ -197,4 +143,4 @@ to_chat(user, "You switch your battery output failsafe [safety() ? "on" : "off" ].") /obj/item/inducer/borg/get_cell() - return loc ? loc.get_cell() : null \ No newline at end of file + return loc?.get_cell() \ No newline at end of file diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 43af97a598f..3e1ebbe0e7c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -50,7 +50,7 @@ ) obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY - origin_tech = "{'magnets':3,'materials':2}" + origin_tech = @'{"magnets":3,"materials":2}' var/max_uses = 32 var/uses = 32 diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 3d7969df8bb..c5b41c2ed60 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -6,7 +6,7 @@ item_state = "radio" w_class = ITEM_SIZE_SMALL obj_flags = OBJ_FLAG_CONDUCTIBLE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index eff693b9d3e..d3d7035496c 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -7,7 +7,7 @@ desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user." icon = 'icons/obj/items/modkit.dmi' icon_state = "modkit" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/parts = MODKIT_FULL var/target_bodytype = BODYTYPE_HUMANOID @@ -21,7 +21,7 @@ var/decl/species/species = GET_DECL(global.using_map.default_species) target_bodytype = species.default_bodytype.bodytype_flag . = ..() - + /obj/item/modkit/afterattack(obj/O, mob/user, proximity) if(!proximity) return diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 2cb8ab89ab9..42723e07744 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -15,13 +15,13 @@ throw_range = 15 throw_speed = 3 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE ) - origin_tech = "{'magnets':1,'engineering':1}" + origin_tech = @'{"magnets":1,"engineering":1}' var/buffer_name var/atom/buffer_object @@ -55,7 +55,7 @@ unregister_buffer(buffer_object) buffer_object = buffer if(buffer_object) - events_repository.register(/decl/observ/destroyed, buffer_object, src, /obj/item/multitool/proc/unregister_buffer) + events_repository.register(/decl/observ/destroyed, buffer_object, src, TYPE_PROC_REF(/obj/item/multitool, unregister_buffer)) /obj/item/multitool/proc/unregister_buffer(var/atom/buffer_to_unregister) // Only remove the buffered object, don't reset the name diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm index 7c0c3fee18a..0040ac66082 100644 --- a/code/game/objects/items/devices/oxycandle.dm +++ b/code/game/objects/items/devices/oxycandle.dm @@ -22,10 +22,8 @@ . = ..() update_icon() -/obj/item/oxycandle/afterattack(var/obj/O, var/mob/user, var/proximity) - if(proximity && istype(O) && on) - O.HandleObjectHeating(src, user, 500) - ..() +/obj/item/oxycandle/get_heat() + return on ? 500 : 0 /obj/item/oxycandle/attack_self(mob/user) if(!on) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index cf0ff6e2cd1..122ebb79401 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -5,7 +5,7 @@ var/global/list/pai_cards = list() icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' material = /decl/material/solid/fiberglass matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) @@ -23,7 +23,6 @@ var/global/list/pai_cards = list() /obj/item/paicard/Initialize() . = ..() - overlays += "pai-off" global.pai_cards += src /obj/item/paicard/preserve_in_cryopod(var/obj/machinery/cryopod/pod) @@ -289,16 +288,16 @@ var/global/list/pai_cards = list() /obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality) src.pai = personality - src.overlays += "pai-happy" + src.add_overlay("pai-happy") /obj/item/paicard/proc/removePersonality() src.pai = null - src.overlays.Cut() - src.overlays += "pai-off" + src.add_overlay("pai-off") /obj/item/paicard/proc/setEmotion(var/emotion) if(pai) current_emotion = emotion + update_icon() /obj/item/paicard/on_update_icon() . = ..() diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index 647afb41853..94795192873 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -86,7 +86,7 @@ var/mob/M = loc M.update_inhand_overlays() -/obj/item/paint_sprayer/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/paint_sprayer/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && check_state_in_icon("[overlay.icon_state]_color", overlay.icon)) overlay.overlays += overlay_image(overlay.icon, "[overlay.icon_state]_color", paint_color) . = ..() @@ -106,19 +106,20 @@ else if (istype(A, /turf/simulated/wall)) new_color = pick_color_from_wall(A, user) else if (istype(A, /obj/structure/wall_frame)) - var/obj/structure/wall_frame/WF = A - new_color = pick_color_from_wall_frame(WF, user) + new_color = pick_color_from_wall_frame(A, user) else new_color = A.get_color() - change_color(new_color, user) - - else if (A.atom_flags & ATOM_FLAG_CAN_BE_PAINTED) - A.set_color(paint_color) - . = TRUE + if(!new_color) + to_chat(user, SPAN_NOTICE("You fail to scan a color from \the [A].")) + else + change_color(new_color, user) else if (istype(A, /turf/simulated/wall)) . = paint_wall(A, user) + else if (istype(A, /obj/structure/wall_frame)) + . = paint_wall_frame(A, user) + else if (istype(A, /turf/simulated/floor)) . = paint_floor(A, user, params) @@ -129,8 +130,12 @@ to_chat(user, SPAN_WARNING("You can't paint an active exosuit. Dismantle it first.")) . = FALSE + else if (A.atom_flags & ATOM_FLAG_CAN_BE_PAINTED) + A.set_color(paint_color) + . = TRUE + else - to_chat(user, SPAN_WARNING("\The [src] can only be used on floors, windows, walls, exosuits or certain airlocks.")) + to_chat(user, SPAN_WARNING("\The [src] can only be used on floors, windows, walls, exosuits, airlocks, and certain other objects.")) . = FALSE if (.) diff --git a/code/game/objects/items/devices/personal_shield.dm b/code/game/objects/items/devices/personal_shield.dm index 03cff456597..95be1abc466 100644 --- a/code/game/objects/items/devices/personal_shield.dm +++ b/code/game/objects/items/devices/personal_shield.dm @@ -3,7 +3,7 @@ desc = "Truely a life-saver: this device protects its user from being hit by objects moving very, very fast, though only for a few shots." icon = 'icons/obj/items/weapon/batterer.dmi' icon_state = ICON_STATE_WORLD - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 55cff27a52d..e20296b8724 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -14,7 +14,7 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metallic_hydrogen = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'powerstorage':3,'esoteric':5}" + origin_tech = @'{"powerstorage":3,"esoteric":5}' var/drain_rate = 1500000 // amount of power to drain per tick var/power_drained = 0 // Amount of power drained. var/max_power = 5e9 // Detonation point. diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 3edfa8a2ef8..c7a19484036 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -6,7 +6,7 @@ var/global/list/radio_beacons = list() icon = 'icons/obj/items/device/radio/beacon.dmi' icon_state = "beacon" item_state = "signaler" - origin_tech = "{'wormholes':1}" + origin_tech = @'{"wormholes":1}' material = /decl/material/solid/metal/aluminium matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 727c063217f..dc29d7b3e4b 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -2,15 +2,40 @@ name = "standard encryption key" desc = "An encryption key for a radio headset. Contains cypherkeys." icon = 'icons/obj/items/device/radio/key.dmi' - icon_state = "cypherkey" - item_state = "" + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + color = COLOR_GRAY80 + var/contact_color = COLOR_PALE_GOLD + var/fill_color = COLOR_MID_BLUE_GRAY + var/inlay_color = COLOR_RED var/translate_binary var/list/can_decrypt +/obj/item/encryptionkey/Initialize() + . = ..() + update_icon() + +/obj/item/encryptionkey/on_update_icon() + . = ..() + if(contact_color) + var/image/I = image(icon, "[icon_state]_contact") + I.color = contact_color + I.appearance_flags |= RESET_COLOR + add_overlay(I) + if(fill_color) + var/image/I = image(icon, "[icon_state]_fill") + I.color = fill_color + I.appearance_flags |= RESET_COLOR + add_overlay(I) + if(inlay_color) + var/image/I = image(icon, "[icon_state]_inlay") + I.color = inlay_color + I.appearance_flags |= RESET_COLOR + add_overlay(I) + /obj/item/encryptionkey/attack_self(mob/user) if(alert(user, "Do you wish to factory reset this encryption key? This will remove ALL channel access and cannot be undone.", "Factory Reset", "No", "Yes") == "Yes" && !user.incapacitated() && user.get_held_slot_for_item(src)) can_decrypt = null @@ -33,6 +58,5 @@ . = ..() /obj/item/encryptionkey/binary - icon_state = "cypherkey" translate_binary = TRUE - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 62a574046b7..0d58d152d45 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -6,12 +6,15 @@ material = /decl/material/solid/metal/aluminium canhear_range = 0 // can't hear headsets from very far away slot_flags = SLOT_EARS - cell = null power_usage = 0 can_use_analog = FALSE encryption_keys = list(/obj/item/encryptionkey) encryption_key_capacity = 2 +/obj/item/radio/headset/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return + /obj/item/radio/headset/on_update_icon() icon_state = get_world_inventory_state() cut_overlays() @@ -24,4 +27,4 @@ if(network) add_overlay("[icon_state]-online") else - add_overlay("[icon_state]-offline") + add_overlay("[icon_state]-offline") \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headsets_shared.dm b/code/game/objects/items/devices/radio/headsets_shared.dm index bed832cd35f..94d85ebec84 100644 --- a/code/game/objects/items/devices/radio/headsets_shared.dm +++ b/code/game/objects/items/devices/radio/headsets_shared.dm @@ -5,7 +5,7 @@ /obj/item/encryptionkey/cargo name = "supply radio encryption key" - icon_state = "med_cypherkey" + inlay_color = COLOR_ASSEMBLY_WHITE can_decrypt = list(access_cargo) /obj/item/radio/headset/headset_mining @@ -16,7 +16,7 @@ /obj/item/encryptionkey/mining name = "mining radio encryption key" - icon_state = "med_cypherkey" + inlay_color = COLOR_ASSEMBLY_WHITE can_decrypt = list(access_mining) /obj/item/radio/headset/headset_sec name = "security radio headset" @@ -25,7 +25,7 @@ /obj/item/encryptionkey/sec name = "security radio encryption key" - icon_state = "sec_cypherkey" + inlay_color = COLOR_BLOOD_RED can_decrypt = list(access_security) /obj/item/radio/headset/headset_med @@ -36,7 +36,7 @@ /obj/item/encryptionkey/med name = "medical radio encryption key" - icon_state = "med_cypherkey" + inlay_color = COLOR_ASSEMBLY_WHITE can_decrypt = list(access_medical) /obj/item/radio/headset/headset_service @@ -47,7 +47,7 @@ /obj/item/encryptionkey/service name = "service radio encryption key" - icon_state = "srv_cypherkey" + inlay_color = COLOR_VERDANT_GREEN can_decrypt = list(access_bar) /obj/item/radio/headset/headset_sci @@ -58,7 +58,7 @@ /obj/item/encryptionkey/sci name = "science radio encryption key" - icon_state = "sci_cypherkey" + inlay_color = COLOR_SCIENCE_PURPLE can_decrypt = list(access_research) /obj/item/radio/headset/headset_eng @@ -69,7 +69,7 @@ /obj/item/encryptionkey/eng name = "engineering radio encryption key" - icon_state = "eng_cypherkey" + inlay_color = PIPE_COLOR_YELLOW can_decrypt = list(access_engine) /obj/item/radio/headset/heads @@ -79,9 +79,14 @@ /obj/item/encryptionkey/command name = "command encryption key" - icon_state = "com_cypherkey" + inlay_color = COLOR_ROYAL_BLUE can_decrypt = list(access_bridge) +/obj/item/encryptionkey/heads + color = COLOR_GOLD + fill_color = COLOR_PALE_GOLD + inlay_color = COLOR_ROYAL_BLUE + /obj/item/radio/headset/heads/ce name = "chief engineer's headset" desc = "The headset of the boss engineer." @@ -90,7 +95,6 @@ /obj/item/encryptionkey/heads/ce name = "chief engineer's encryption key" - icon_state = "cap_cypherkey" can_decrypt = list( access_bridge, access_engine @@ -104,7 +108,6 @@ /obj/item/encryptionkey/heads/cmo name = "chief medical officer's encryption key" - icon_state = "cap_cypherkey" can_decrypt = list( access_bridge, access_medical @@ -118,7 +121,6 @@ /obj/item/encryptionkey/heads/rd name = "research director's encryption key" - icon_state = "cap_cypherkey" can_decrypt = list( access_bridge, access_research @@ -131,7 +133,6 @@ /obj/item/encryptionkey/heads/captain name = "captain's encryption key" - icon_state = "cap_cypherkey" can_decrypt = list( access_bridge, access_security, @@ -149,7 +150,6 @@ /obj/item/encryptionkey/heads/hop name = "head of personnel's encryption key" - icon_state = "hop_cypherkey" can_decrypt = list( access_bar, access_cargo, @@ -165,8 +165,8 @@ encryption_keys = list(/obj/item/encryptionkey/heads/hos) /obj/item/encryptionkey/heads/hos - name = "head of personnel's encryption key" - icon_state = "hos_cypherkey" + name = "head of security's encryption key" + inlay_color = COLOR_BLOOD_RED can_decrypt = list( access_bridge, access_security @@ -183,13 +183,12 @@ encryption_keys = list(/obj/item/encryptionkey/ert) /obj/item/encryptionkey/mercenary - icon_state = "cypherkey" - origin_tech = "{'esoteric':2}" + origin_tech = @'{"esoteric":2}' can_decrypt = list(access_mercenary) /obj/item/radio/headset/mercenary can_use_analog = TRUE - origin_tech = "{'esoteric':2}" + origin_tech = @'{"esoteric":2}' encryption_keys = list(/obj/item/encryptionkey/mercenary) analog_secured = list((access_mercenary) = TRUE) @@ -203,13 +202,12 @@ encryption_keys = list(/obj/item/encryptionkey/entertainment) /obj/item/encryptionkey/raider - icon_state = "cypherkey" - origin_tech = "{'esoteric':2}" + origin_tech = @'{"esoteric":2}' can_decrypt = list(access_raider) /obj/item/radio/headset/raider can_use_analog = TRUE - origin_tech = "{'esoteric':2}" + origin_tech = @'{"esoteric":2}' encryption_keys = list(/obj/item/encryptionkey/raider) analog_secured = list((access_raider) = TRUE) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 0ac0db62673..561f7d6de8f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -7,16 +7,19 @@ anchored = TRUE w_class = ITEM_SIZE_STRUCTURE canhear_range = 2 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_BLOOD + atom_flags = ATOM_FLAG_NO_BLOOD obj_flags = OBJ_FLAG_CONDUCTIBLE | OBJ_FLAG_MOVES_UNSUPPORTED layer = ABOVE_WINDOW_LAYER - cell = null power_usage = 0 intercom = TRUE intercom_handling = TRUE - directional_offset = "{'NORTH':{'y':-30}, 'SOUTH':{'y':20}, 'EAST':{'x':-22}, 'WEST':{'x':22}}" + directional_offset = @'{"NORTH":{"y":-30}, "SOUTH":{"y":20}, "EAST":{"x":-22}, "WEST":{"x":22}}' var/last_tick //used to delay the powercheck +/obj/item/radio/intercom/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return + /obj/item/radio/intercom/Initialize() . = ..() START_PROCESSING(SSobj, src) @@ -85,3 +88,6 @@ /obj/item/radio/intercom/locked/set_frequency() ..(locked_frequency) + +/obj/item/radio/intercom/locked/entertainment + locked_frequency = 1461 \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 883f0f02243..b7b1995c2a7 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -38,7 +38,6 @@ material = /decl/material/solid/metal/aluminium matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - var/obj/item/cell/cell = /obj/item/cell/device var/power_usage = 2800 var/last_radio_sound = -INFINITY var/initial_network_id @@ -65,6 +64,9 @@ var/analog_secured = list() // list of accesses used for encrypted analog, mainly for mercs/raiders var/datum/radio_frequency/analog_radio_connection +/obj/item/radio/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/device, /obj/item/cell/device, /datum/extension/loaded_cell, charge_value) + /obj/item/radio/get_radio(var/message_mode) return src @@ -93,8 +95,7 @@ /obj/item/radio/Initialize() . = ..() wires = new(src) - if(ispath(cell)) - cell = new(src) + setup_power_supply() global.listening_objects += src set_frequency(sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)) @@ -212,9 +213,6 @@ /obj/item/radio/proc/has_channel_access(var/mob/user, var/freq) return TRUE // TODO: add antag/valid bounds checking -/obj/item/radio/get_cell() - return cell - /obj/item/radio/proc/toggle_broadcast() broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL)) @@ -282,14 +280,6 @@ . = TOPIC_REFRESH if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk return TOPIC_HANDLED - - if(href_list["remove_cell"]) - if(cell) - var/mob/user = usr - user.put_in_hands(cell) - to_chat(user, SPAN_NOTICE("You remove [cell] from \the [src].")) - cell = null - . = TOPIC_REFRESH if(href_list["network_settings"]) var/datum/extension/network_device/D = get_extension(src, /datum/extension/network_device) D.ui_interact(usr) @@ -346,7 +336,7 @@ if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO) - addtimer(CALLBACK(src, .proc/transmit, M, message, message_mode, verb, speaking), 0) + addtimer(CALLBACK(src, PROC_REF(transmit), M, message, message_mode, verb, speaking), 0) /obj/item/radio/proc/can_transmit_binary() for(var/obj/item/encryptionkey/key in encryption_keys) @@ -490,11 +480,6 @@ return TRUE return toggle_panel(user) - if(!cell && power_usage && istype(W, /obj/item/cell/device) && user.try_unequip(W, target = src)) - to_chat(user, SPAN_NOTICE("You slot \the [W] into \the [src].")) - cell = W - return TRUE - . = ..() /obj/item/radio/proc/toggle_panel(var/mob/user) @@ -509,9 +494,7 @@ var/list/current_channels = get_available_channels() for(var/channel in current_channels) LAZYSET(channels, channel, FALSE) - if(cell) - cell.emp_act(severity) - ..() + return ..() /obj/item/radio/CouldUseTopic(var/mob/user) ..() diff --git a/code/game/objects/items/devices/radio/radio_analog.dm b/code/game/objects/items/devices/radio/radio_analog.dm index 4efe2e4f205..c5f51e30385 100644 --- a/code/game/objects/items/devices/radio/radio_analog.dm +++ b/code/game/objects/items/devices/radio/radio_analog.dm @@ -1,6 +1,6 @@ /// check if this radio can receive on the given analog frequency /// @level: list of eligible z-levels, if it contains 0 then it reaches all levels -/obj/item/radio/proc/can_receive_analog(datum/radio_frequency/connection, level) +/obj/item/radio/proc/can_receive_analog(datum/radio_frequency/connection, z_levels) if(!analog || !istype(analog_radio_connection) || connection != analog_radio_connection) return FALSE if(!listening) @@ -11,16 +11,16 @@ return FALSE if (wires.IsIndexCut(WIRE_RECEIVE)) return FALSE - if(!(0 in level) && !(get_z(src) in level)) + if(!(0 in z_levels) && !(get_z(src) in z_levels)) return FALSE return TRUE /proc/broadcast_analog_radio_message(datum/radio_frequency/connection, mob/speaker, obj/item/radio/radio, message, intercom_only = FALSE, - hard_to_hear, list/levels, verbage = "says", decl/language/speaking = null, list/secured + hard_to_hear, list/z_levels, verbage = "says", decl/language/speaking = null, list/secured ) - var/list/radios = list() + var/list/radios = list(radio) var/list/radios_insecure = list() for(var/obj/item/radio/radio_receiver in connection.devices["[RADIO_CHAT]"]) // Quasi-wired mode; remove if intercoms ever use actual wired connections somehow. @@ -32,8 +32,8 @@ continue if(!radio_receiver.can_receive_message()) continue - if(radio_receiver.can_receive_analog(connection, levels)) - radio_receiver.received_chatter(connection.frequency, levels) + if(radio_receiver.can_receive_analog(connection, z_levels)) + radio_receiver.received_chatter(connection.frequency, z_levels) if(secured && !radio_receiver.can_decrypt(secured)) radios_insecure += radio_receiver continue diff --git a/code/game/objects/items/devices/radio/radio_announcer.dm b/code/game/objects/items/devices/radio/radio_announcer.dm index b0b5f92390d..3a7ab556332 100644 --- a/code/game/objects/items/devices/radio/radio_announcer.dm +++ b/code/game/objects/items/devices/radio/radio_announcer.dm @@ -16,7 +16,6 @@ var/global/list/announcers = list() return global.announcers["[z]"] /obj/item/radio/announcer - cell = null canhear_range = 0 power_usage = 0 listening = FALSE @@ -26,6 +25,10 @@ var/global/list/announcers = list() decrypt_all_messages = TRUE is_spawnable_type = FALSE +/obj/item/radio/announcer/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return + /obj/item/radio/announcer/Destroy() SHOULD_CALL_PARENT(FALSE) PRINT_STACK_TRACE("attempt to delete a [src.type] prevented.") diff --git a/code/game/objects/items/devices/radio/radio_borg.dm b/code/game/objects/items/devices/radio/radio_borg.dm index 42dc4794f32..c8c6935215e 100644 --- a/code/game/objects/items/devices/radio/radio_borg.dm +++ b/code/game/objects/items/devices/radio/radio_borg.dm @@ -2,11 +2,14 @@ icon = 'icons/obj/robot_component.dmi' // Cyborgs radio icons should look like the component. icon_state = "radio" canhear_range = 0 - cell = null power_usage = 0 is_spawnable_type = FALSE var/shut_up = 1 +/obj/item/radio/borg/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return + /obj/item/radio/borg/can_receive_message(var/check_network_membership) . = ..() && isrobot(loc) if(.) diff --git a/code/game/objects/items/devices/radio/radio_exosuit.dm b/code/game/objects/items/devices/radio/radio_exosuit.dm index 89e085cd052..88b782443d2 100644 --- a/code/game/objects/items/devices/radio/radio_exosuit.dm +++ b/code/game/objects/items/devices/radio/radio_exosuit.dm @@ -1,13 +1,16 @@ -//The exosuit radio subtype. It allows pilots to interact and consumes exosuit power +//The exosuit radio subtype. It allows pilots to interact and consumes exosuit power /obj/item/radio/exosuit name = "exosuit radio" - cell = null + +/obj/item/radio/exosuit/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return /obj/item/radio/exosuit/get_cell() - . = ..() - if(!. && isexosuit(loc)) + if(isexosuit(loc)) var/mob/living/exosuit/E = loc return E.get_cell() + return ..() /obj/item/radio/exosuit/nano_host() if(isexosuit(loc)) diff --git a/code/game/objects/items/devices/scanners/_scanner.dm b/code/game/objects/items/devices/scanners/_scanner.dm index 0555107f675..0693f18a6ec 100644 --- a/code/game/objects/items/devices/scanners/_scanner.dm +++ b/code/game/objects/items/devices/scanners/_scanner.dm @@ -2,8 +2,7 @@ name = "handheld scanner" desc = "A hand-held scanner of some sort. You shouldn't be seeing it." icon = 'icons/obj/items/device/scanner/atmos_scanner.dmi' - icon_state = "atmos" - item_state = "analyzer" + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY diff --git a/code/game/objects/items/devices/scanners/breath.dm b/code/game/objects/items/devices/scanners/breath.dm index 016f33b1048..02583fae7f0 100644 --- a/code/game/objects/items/devices/scanners/breath.dm +++ b/code/game/objects/items/devices/scanners/breath.dm @@ -2,11 +2,9 @@ name = "breath analyzer" desc = "A two-in-one breathalyzer and respirometer, measuring intoxication, breath contents, and respiratory health." icon = 'icons/obj/items/device/scanner/breath_scanner.dmi' - icon_state = "breath_analyzer" - item_state = "analyzer" item_flags = ITEM_FLAG_NO_BLUDGEON material = /decl/material/solid/metal/aluminium - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' printout_color = "#deebff" var/mode = 1 diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm index d55b2662378..a9311cc11aa 100644 --- a/code/game/objects/items/devices/scanners/gas.dm +++ b/code/game/objects/items/devices/scanners/gas.dm @@ -6,10 +6,7 @@ name = "gas analyzer" desc = "A hand-held environmental scanner which reports current gas levels. Has a button to cycle modes." icon = 'icons/obj/items/device/scanner/atmos_scanner.dmi' - icon_state = "atmos" - item_state = "analyzer" - - origin_tech = "{'magnets':1,'engineering':1}" + origin_tech = @'{"magnets":1,"engineering":1}' window_width = 350 window_height = 400 var/mode = DEFAULT_MODE diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 0d21d923b8e..0bbe2dae5e7 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -2,11 +2,9 @@ name = "health analyzer" desc = "A hand-held body scanner able to distinguish vital signs of the subject." icon = 'icons/obj/items/device/scanner/health_scanner.dmi' - icon_state = "health" - item_state = "analyzer" item_flags = ITEM_FLAG_NO_BLUDGEON material = /decl/material/solid/metal/aluminium - origin_tech = "{'magnets':1,'biotech':1}" + origin_tech = @'{"magnets":1,"biotech":1}' printout_color = "#deebff" var/mode = 1 diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm index 33b77482166..3eda6f1a4f4 100644 --- a/code/game/objects/items/devices/scanners/mass_spectrometer.dm +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -2,11 +2,8 @@ name = "mass spectrometer" desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample or analyzes unusual chemicals." icon = 'icons/obj/items/device/scanner/spectrometer.dmi' - icon_state = "spectrometer" - item_state = "analyzer" - - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER - origin_tech = "{'magnets':2,'biotech':2}" + atom_flags = ATOM_FLAG_OPEN_CONTAINER + origin_tech = @'{"magnets":2,"biotech":2}' window_width = 550 window_height = 300 scan_sound = 'sound/effects/scanbeep.ogg' @@ -17,13 +14,14 @@ create_reagents(5) /obj/item/scanner/spectrometer/on_reagent_change() + ..() update_icon() /obj/item/scanner/spectrometer/on_update_icon() . = ..() - icon_state = initial(icon_state) - if(reagents.total_volume) - icon_state += "_s" + icon_state = get_world_inventory_state() + if(reagents?.total_volume) + icon_state += "_loaded" /obj/item/scanner/spectrometer/is_valid_scan_target(atom/O) if(!O.reagents || !O.reagents.total_volume) @@ -85,6 +83,6 @@ /obj/item/scanner/spectrometer/adv name = "advanced mass spectrometer" - icon_state = "adv_spectrometer" + icon = 'icons/obj/items/device/scanner/advanced_spectrometer.dmi' details = 1 - origin_tech = "{'magnets':4,'biotech':2}" \ No newline at end of file + origin_tech = @'{"magnets":4,"biotech":2}' \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners/mining.dm b/code/game/objects/items/devices/scanners/mining.dm index 5e581b3d16c..32cead92e8b 100644 --- a/code/game/objects/items/devices/scanners/mining.dm +++ b/code/game/objects/items/devices/scanners/mining.dm @@ -12,8 +12,7 @@ name = "ore detector" desc = "A complex device used to locate ore deep underground." icon = 'icons/obj/items/device/scanner/ore_scanner.dmi' - icon_state = "ore" - origin_tech = "{'magnets':1,'engineering':1}" + origin_tech = @'{"magnets":1,"engineering":1}' use_delay = 50 printout_color = "#fff7f0" var/survey_data = 0 diff --git a/code/game/objects/items/devices/scanners/network.dm b/code/game/objects/items/devices/scanners/network.dm index 654e06ea2af..e96a840d7e5 100644 --- a/code/game/objects/items/devices/scanners/network.dm +++ b/code/game/objects/items/devices/scanners/network.dm @@ -2,10 +2,7 @@ name = "network analyzer" desc = "A hand-held network scanner which detects nearby network devices and returns information about them." icon = 'icons/obj/items/device/scanner/network_scanner.dmi' - icon_state = "network" - item_state = "analyzer" - - origin_tech = "{'magnets':1,'engineering':1}" + origin_tech = @'{"magnets":1,"engineering":1}' window_width = 350 window_height = 400 @@ -23,11 +20,11 @@ var/list/found_devices = list() var/target_device = get_extension(target, /datum/extension/network_device) if(target_device) found_devices |= target_device - + for(var/obj/thing in target.contents) var/thing_device = get_extension(thing, /datum/extension/network_device) if(thing_device) found_devices |= thing_device - + if(!length(found_devices)) return "No network devices found!" . = list() diff --git a/code/game/objects/items/devices/scanners/plant.dm b/code/game/objects/items/devices/scanners/plant.dm index 41b4361d598..4db0ca7ffd4 100644 --- a/code/game/objects/items/devices/scanners/plant.dm +++ b/code/game/objects/items/devices/scanners/plant.dm @@ -3,15 +3,14 @@ name = "plant analyzer" desc = "A hand-held botanical scanner used to analyze plants." icon = 'icons/obj/items/device/scanner/plant_scanner.dmi' - icon_state = "hydro" - item_state = "analyzer" scan_sound = 'sound/effects/fastbeep.ogg' printout_color = "#eeffe8" var/static/list/valid_targets = list( /obj/item/chems/food/grown, /obj/item/grown, /obj/machinery/portable_atmospherics/hydroponics, - /obj/item/seeds + /obj/item/seeds, + /obj/structure/flora/plant ) /obj/item/scanner/plant/is_valid_scan_target(atom/O) @@ -46,6 +45,10 @@ grown_seed = H.seed grown_reagents = H.reagents + else if(istype(target,/obj/structure/flora/plant)) + var/obj/structure/flora/plant/P = target + grown_seed = P.plant + if(!grown_seed) return diff --git a/code/game/objects/items/devices/scanners/price.dm b/code/game/objects/items/devices/scanners/price.dm index cb287334572..0f8c0c7036d 100644 --- a/code/game/objects/items/devices/scanners/price.dm +++ b/code/game/objects/items/devices/scanners/price.dm @@ -2,8 +2,7 @@ name = "price scanner" desc = "Using an up-to-date database of various costs and prices, this device estimates the market price of an item up to 0.001% accuracy." icon = 'icons/obj/items/device/scanner/price_scanner.dmi' - icon_state = "price_scanner" - origin_tech = "{'materials':6,'magnets':4}" + origin_tech = @'{"materials":6,"magnets":4}' scan_sound = 'sound/effects/checkout.ogg' material = /decl/material/solid/metal/steel matter = list( diff --git a/code/game/objects/items/devices/scanners/reagents.dm b/code/game/objects/items/devices/scanners/reagents.dm index 0eabd93e059..2087c8027ba 100644 --- a/code/game/objects/items/devices/scanners/reagents.dm +++ b/code/game/objects/items/devices/scanners/reagents.dm @@ -2,10 +2,7 @@ name = "reagent scanner" desc = "A hand-held reagent scanner which identifies chemical agents." icon = 'icons/obj/items/device/scanner/spectrometer.dmi' - icon_state = "spectrometer" - item_state = "analyzer" - - origin_tech = "{'magnets':2,'biotech':2}" + origin_tech = @'{"magnets":2,"biotech":2}' scan_sound = 'sound/effects/scanbeep.ogg' var/details = 0 @@ -30,6 +27,6 @@ /obj/item/scanner/reagent/adv name = "advanced reagent scanner" - icon_state = "adv_spectrometer" + icon = 'icons/obj/items/device/scanner/advanced_spectrometer.dmi' details = 1 - origin_tech = "{'magnets':4,'biotech':2}" \ No newline at end of file + origin_tech = @'{"magnets":4,"biotech":2}' \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners/xenobio.dm b/code/game/objects/items/devices/scanners/xenobio.dm index 31485d0113d..bff60fb4a5f 100644 --- a/code/game/objects/items/devices/scanners/xenobio.dm +++ b/code/game/objects/items/devices/scanners/xenobio.dm @@ -2,15 +2,14 @@ name = "xenolife scanner" desc = "Multipurpose organic life scanner. With spectral breath analyzer you can find out what snacks Ian had! Or what gasses alien life breathes." icon = 'icons/obj/items/device/scanner/xenobio_scanner.dmi' - icon_state = "xenobio" - item_state = "analyzer" + icon_state = ICON_STATE_WORLD scan_sound = 'sound/effects/scanbeep.ogg' printout_color = "#f3e6ff" - origin_tech = "{'magnets':1,'biotech':1}" + origin_tech = @'{"magnets":1,"biotech":1}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/list/valid_targets = list( @@ -51,7 +50,9 @@ var/decl/material/mat = GET_DECL(species.exhale_type) . += "Exhales:\t[mat.gas_name]" . += "Known toxins:\t[english_list(species.poison_types)]" - . += "Temperature comfort zone:\t[species.cold_discomfort_level] K to [species.heat_discomfort_level] K" + var/decl/bodytype/root_bodytype = get_bodytype() + if(root_bodytype) + . += "Temperature comfort zone:\t[root_bodytype.cold_discomfort_level] K to [root_bodytype.heat_discomfort_level] K" . += "Pressure comfort zone:\t[species.warning_low_pressure] kPa to [species.warning_high_pressure] kPa" . = jointext(., "
    ") diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index d71e6f1168c..6e079636ac4 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -14,11 +14,11 @@ throw_range = 15 throw_speed = 3 - origin_tech = "{'programming':1,'engineering':1,'esoteric':3}" - material = /decl/material/solid/plastic + origin_tech = @'{"programming":1,"engineering":1,"esoteric":3}' + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE, ) @@ -62,8 +62,8 @@ icon_state = ICON_STATE_WORLD color = COLOR_GRAY80 w_class = ITEM_SIZE_SMALL - origin_tech = "{'programming':1,'engineering':1,'esoteric':3}" - material = /decl/material/solid/plastic + origin_tech = @'{"programming":1,"engineering":1,"esoteric":3}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, @@ -102,12 +102,12 @@ /obj/item/spy_monitor/proc/pair(var/obj/item/spy_bug/SB, var/mob/living/user) to_chat(user, SPAN_NOTICE("\The [SB] has been paired with \the [src].")) - events_repository.register(/decl/observ/destroyed, SB, src, .proc/unpair) + events_repository.register(/decl/observ/destroyed, SB, src, PROC_REF(unpair)) cameras += SB /obj/item/spy_monitor/proc/unpair(var/obj/item/spy_bug/SB, var/mob/living/user) to_chat(user, SPAN_NOTICE("\The [SB] has been unpaired from \the [src].")) - events_repository.unregister(/decl/observ/destroyed, SB, src, .proc/unpair) + events_repository.unregister(/decl/observ/destroyed, SB, src, PROC_REF(unpair)) if(selected_camera == SB) selected_camera = null cameras -= SB @@ -154,4 +154,5 @@ broadcasting = 0 canhear_range = 1 name = "spy device" - icon_state = "syn_cypherkey" + icon = 'icons/obj/items/device/radio/spybug.dmi' + icon_state = ICON_STATE_WORLD diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index db056f3e0eb..75801bc5fb8 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -16,7 +16,7 @@ material = /decl/material/solid/metal/aluminium matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'magnets':2,'materials':2}" + origin_tech = @'{"magnets":2,"materials":2}' var/on = 0 //is it turned on? var/cover_open = 0 //is the cover open? diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 10132b19a27..e1beec8c025 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/items/device/jammer.dmi' icon_state = "jammer" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, @@ -16,19 +16,17 @@ ) var/active = FALSE var/range = 2 // This is a radius, thus a range of 7 covers the entire visible screen - var/obj/item/cell/bcell = /obj/item/cell/high var/suit_sensor_jammer_method/jammer_method var/list/suit_sensor_jammer_methods_by_type var/list/suit_sensor_jammer_methods /obj/item/suit_sensor_jammer/Initialize() . = ..() - if(ispath(bcell)) - bcell = new bcell(src) + set_extension(src, /datum/extension/loaded_cell/unremovable, /obj/item/cell, /obj/item/cell/high) suit_sensor_jammer_methods = list() suit_sensor_jammer_methods_by_type = list() for(var/jammer_method_type in subtypesof(/suit_sensor_jammer_method)) - var/new_method = new jammer_method_type(src, /obj/item/suit_sensor_jammer/proc/may_process_crew_data) + var/new_method = new jammer_method_type(src, TYPE_PROC_REF(/obj/item/suit_sensor_jammer, may_process_crew_data)) dd_insertObjectList(suit_sensor_jammer_methods, new_method) suit_sensor_jammer_methods_by_type[jammer_method_type] = new_method jammer_method = suit_sensor_jammer_methods[1] @@ -36,8 +34,6 @@ /obj/item/suit_sensor_jammer/Destroy() . = ..() - qdel(bcell) - bcell = null jammer_method = null for(var/method in suit_sensor_jammer_methods) qdel(method) @@ -48,65 +44,39 @@ /obj/item/suit_sensor_jammer/attack_self(var/mob/user) ui_interact(user) -/obj/item/suit_sensor_jammer/get_cell() - return bcell - -/obj/item/suit_sensor_jammer/attackby(obj/item/I, mob/user) - if(IS_CROWBAR(I)) - if(bcell) - to_chat(user, "You remove \the [bcell].") - disable() - bcell.dropInto(loc) - bcell = null - else - to_chat(user, "There is no cell to remove.") - else if(istype(I, /obj/item/cell)) - if(bcell) - to_chat(user, "There's already a cell in \the [src].") - else if(user.try_unequip(I)) - I.forceMove(src) - bcell = I - to_chat(user, "You insert \the [bcell] into \the [src]..") - else - to_chat(user, "You're unable to insert the battery.") - /obj/item/suit_sensor_jammer/on_update_icon() . = ..() - if(bcell) - var/percent = bcell.percent() - switch(percent) - if(0 to 25) - add_overlay("forth_quarter") - if(25 to 50) - add_overlay("one_quarter") - add_overlay("third_quarter") - if(50 to 75) - add_overlay("two_quarters") - add_overlay("second_quarter") - if(75 to 99) - add_overlay("three_quarters") - add_overlay("first_quarter") - else - add_overlay("four_quarters") - - if(active) - add_overlay("active") + var/obj/item/cell/cell = get_cell() + if(!cell) + return + var/percent = cell.percent() + switch(percent) + if(0 to 25) + add_overlay("forth_quarter") + if(25 to 50) + add_overlay("one_quarter") + add_overlay("third_quarter") + if(50 to 75) + add_overlay("two_quarters") + add_overlay("second_quarter") + if(75 to 99) + add_overlay("three_quarters") + add_overlay("first_quarter") + else + add_overlay("four_quarters") + if(active) + add_overlay("active") /obj/item/suit_sensor_jammer/emp_act(var/severity) ..() - if(bcell) - bcell.emp_act(severity) - if(prob(70/severity)) enable() else disable() - if(prob(90/severity)) set_method(suit_sensor_jammer_methods_by_type[/suit_sensor_jammer_method/random]) else set_method(pick(suit_sensor_jammer_methods)) - var/new_range = range + (rand(0,6) / severity) - (rand(0,3) / severity) set_range(new_range) @@ -115,14 +85,16 @@ if(distance <= 3) var/list/message = list() message += "This device appears to be [active ? "" : "in"]active and " - if(bcell) - message += "displays a charge level of [bcell.percent()]%." + var/obj/item/cell/cell = get_cell() + if(cell) + message += "displays a charge level of [cell.percent()]%." else message += "is lacking a cell." to_chat(user, jointext(message,.)) /obj/item/suit_sensor_jammer/CanUseTopic(user, state) - if(!bcell || bcell.charge <= 0) + var/obj/item/cell/cell = get_cell() + if(!cell || cell.charge <= 0) return STATUS_CLOSE return ..() @@ -131,10 +103,11 @@ for(var/suit_sensor_jammer_method/ssjm in suit_sensor_jammer_methods) methods[++methods.len] = list("name" = ssjm.name, "cost" = ssjm.energy_cost, "ref" = "\ref[ssjm]") + var/obj/item/cell/cell = get_cell() var/list/data = list( "active" = active, - "current_charge" = bcell ? round(bcell.charge, 1) : 0, - "max_charge" = bcell ? bcell.maxcharge : 0, + "current_charge" = cell ? round(cell.charge, 1) : 0, + "max_charge" = cell ? cell.maxcharge : 0, "range" = range, "max_range" = JAMMER_MAX_RANGE, "methods" = methods, @@ -172,11 +145,12 @@ return TOPIC_REFRESH /obj/item/suit_sensor_jammer/Process(wait, tick) - if(bcell) + var/obj/item/cell/cell = get_cell() + if(cell) // With a range of 2 and jammer cost of 3 the default (high capacity) cell will last for almost 14 minutes, give or take // 10000 / (2^2 * 3 / 10) ~= 8333 ticks ~= 13.8 minutes var/deduction = JAMMER_POWER_CONSUMPTION(wait) - if(!bcell.use(deduction)) + if(!cell.use(deduction)) disable() else disable() @@ -212,7 +186,7 @@ sjm.enable() jammer_method = sjm -/obj/item/suit_sensor_jammer/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/under/C, var/turf/pos) +/obj/item/suit_sensor_jammer/proc/may_process_crew_data(var/mob/living/carbon/human/H, var/obj/item/clothing/accessory/vitals_sensor/S, var/turf/pos) if(!pos) return FALSE var/turf/T = get_turf(src) diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index bbdf165bcff..2a6e9533c59 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -8,7 +8,7 @@ slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_SMALL material = /decl/material/solid/metal/aluminium - origin_tech = "{'magnets':1,'engineering':1}" + origin_tech = @'{"magnets":1,"engineering":1}' action_button_name = "Toggle T-Ray scanner" var/scan_range = 3 @@ -102,8 +102,8 @@ if(ismob(scanned)) if(ishuman(scanned)) var/mob/living/carbon/human/H = scanned - if(H.get_bodytype().appearance_flags & HAS_SKIN_COLOR) - I.color = H.skin_colour + if(H.get_bodytype()?.appearance_flags & HAS_SKIN_COLOR) + I.color = H.get_skin_colour() I.icon = 'icons/mob/mob.dmi' I.icon_state = "phaseout" var/mob/M = scanned @@ -141,7 +141,7 @@ continue for(var/obj/O in T.contents) - if(O.level != 1) + if(O.level != LEVEL_BELOW_PLATING) continue if(!O.invisibility) continue //if it's already visible don't need an overlay for it diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 58e2e446706..2d10f4a2f17 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -1,9 +1,8 @@ /obj/item/taperecorder name = "universal recorder" desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback." - icon = 'icons/obj/items/device/tape_recorder.dmi' - icon_state = "taperecorder" - item_state = "analyzer" + icon = 'icons/obj/items/device/tape_recorder/tape_recorder.dmi' + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL material = /decl/material/solid/metal/aluminium @@ -26,7 +25,6 @@ /obj/item/taperecorder/Initialize() . = ..() wires = new(src) - set_extension(src, /datum/extension/base_icon_state, icon_state) if(ispath(mytape)) mytape = new mytape(src) global.listening_objects += src @@ -43,7 +41,6 @@ mytape = null return ..() - /obj/item/taperecorder/attackby(obj/item/I, mob/user, params) if(IS_SCREWDRIVER(I)) maintenance = !maintenance @@ -355,39 +352,34 @@ sleep(300) canprint = 1 - /obj/item/taperecorder/attack_self(mob/user) if(maintenance) wires.Interact(user) return - if(recording || playing) stop() else record() - /obj/item/taperecorder/on_update_icon() . = ..() - var/datum/extension/base_icon_state/bis = get_extension(src, /datum/extension/base_icon_state) - + icon_state = get_world_inventory_state() if(!mytape) - icon_state = "[bis.base_icon_state]_empty" + icon_state = "[icon_state]_empty" else if(recording) - icon_state = "[bis.base_icon_state]_recording" + icon_state = "[icon_state]_recording" else if(playing) - icon_state = "[bis.base_icon_state]_playing" + icon_state = "[icon_state]_playing" else - icon_state = "[bis.base_icon_state]_idle" + icon_state = "[icon_state]_idle" /obj/item/magnetic_tape name = "tape" desc = "A magnetic tape that can hold up to ten minutes of content." - icon = 'icons/obj/items/device/tape_casette.dmi' - icon_state = "tape_white" - item_state = "analyzer" + icon = 'icons/obj/items/device/tape_recorder/tape_casette_white.dmi' + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_TINY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE @@ -405,12 +397,13 @@ //#FIXME: Probably should be handled better. /obj/item/magnetic_tape/on_update_icon(var/draw_ribbon = TRUE) . = ..() + icon_state = get_world_inventory_state() if(draw_ribbon && ruined && max_capacity) - add_overlay(overlay_image(icon, "ribbonoverlay", flags = RESET_COLOR)) - + add_overlay(overlay_image(icon, "[icon_state]_ribbonoverlay", flags = RESET_COLOR)) /obj/item/magnetic_tape/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ruin() + return ..() /obj/item/magnetic_tape/attack_self(mob/user) if(!ruined) @@ -527,14 +520,19 @@ //Random colour tapes /obj/item/magnetic_tape/random/Initialize() + icon = pick(list( + 'icons/obj/items/device/tape_recorder/tape_casette_white.dmi', + 'icons/obj/items/device/tape_recorder/tape_casette_blue.dmi', + 'icons/obj/items/device/tape_recorder/tape_casette_red.dmi', + 'icons/obj/items/device/tape_recorder/tape_casette_yellow.dmi', + 'icons/obj/items/device/tape_recorder/tape_casette_purple.dmi' + )) . = ..() - icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" /obj/item/magnetic_tape/loose name = "magnetic tape" desc = "Quantum-enriched self-repairing nanotape, used for magnetic storage of information." - icon = 'icons/obj/items/device/tape_casette.dmi' - icon_state = "magtape" + icon = 'icons/obj/items/device/tape_recorder/tape_casette_loose.dmi' ruined = TRUE /obj/item/magnetic_tape/loose/fix() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 6e0deb30cc0..e93021d7c6e 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -24,11 +24,11 @@ effective or pretty fucking useless. throw_speed = 4 throw_range = 10 obj_flags = OBJ_FLAG_CONDUCTIBLE - origin_tech = "{'magnets':3,'combat':3,'esoteric':3}" - material = /decl/material/solid/plastic + origin_tech = @'{"magnets":3,"combat":3,"esoteric":3}' + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE, ) diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index d9a91590410..4f82074e931 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -7,10 +7,10 @@ item_state = null w_class = ITEM_SIZE_LARGE slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE, ) @@ -85,7 +85,7 @@ if(!href_list["close"]) attack_self(usr) -/obj/item/camera/tvcamera/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/camera/tvcamera/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && video_enabled && check_state_in_icon("[overlay.icon_state]-on", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-on" . = ..() diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index ca42c937c3e..4ccd921e0cb 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -14,7 +14,7 @@ name = "hidden uplink" desc = "There is something wrong if you're examining this." max_health = ITEM_HEALTH_NO_DAMAGE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index c0b056bd878..e030b16b10f 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -5,10 +5,10 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_TINY obj_flags = OBJ_FLAG_CONDUCTIBLE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, - /decl/material/solid/silicon = MATTER_AMOUNT_TRACE, + /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, + /decl/material/solid/silicon = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, ) var/use_message = "Halt! Security!" diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index fa26c372fb6..a78b5ae3700 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -7,7 +7,7 @@ throwforce = 0 w_class = ITEM_SIZE_TINY throw_range = 1 - material = /decl/material/solid/cardboard //#TODO: Replace with paper + material = /decl/material/solid/organic/paper var/description_antag = "These conversations contain a massive amount of dirt on major figures: drugs, sex, money..." /obj/item/documents/examine(mob/user) diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm new file mode 100644 index 00000000000..713547f0b98 --- /dev/null +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -0,0 +1,177 @@ +#define FLASHLIGHT_ALWAYS_ON 1 +#define FLASHLIGHT_SINGLE_USE 2 + +/obj/item/flashlight + name = "flashlight" + desc = "A hand-held emergency light." + icon = 'icons/obj/lighting/flashlight.dmi' + icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_SMALL + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_LOWER_BODY + material = /decl/material/solid/organic/plastic + matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) + action_button_name = "Toggle Flashlight" + light_wedge = LIGHT_WIDE + var/on = FALSE + var/activation_sound = 'sound/effects/flashlight.ogg' + var/flashlight_range = 4 // range of light when on, can be negative + var/flashlight_power // brightness of light when on + var/flashlight_flags = 0 // FLASHLIGHT_ bitflags + var/spawn_dir // a way for mappers to force which way a flashlight faces upon spawning + var/offset_on_overlay_x = 0 + var/offset_on_overlay_y = 0 + +/obj/item/flashlight/Initialize() + . = ..() + set_flashlight() + update_icon() + update_held_icon() + +/obj/item/flashlight/proc/get_emissive_overlay_color() + return COLOR_WHITE // Icons are usually coloured already. + + +/obj/item/flashlight/on_update_icon() + . = ..() + icon_state = get_world_inventory_state() + if(on) + icon_state = "[icon_state]-on" + var/emissive_state = "[icon_state]-over" + if(check_state_in_icon(emissive_state, icon)) + var/image/I = mutable_appearance(icon, emissive_state, get_emissive_overlay_color()) //emissive_overlay(icon, emissive_state) // Uncomment when emissive clipping is in. + I.appearance_flags |= RESET_COLOR + I.pixel_x = offset_on_overlay_x + I.pixel_y = offset_on_overlay_y + add_overlay(I) + +/obj/item/flashlight/attack_self(mob/user) + if(user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) + if (flashlight_flags & FLASHLIGHT_ALWAYS_ON) + to_chat(user, SPAN_WARNING("You cannot toggle \the [src].")) + return TRUE + if ((flashlight_flags & FLASHLIGHT_SINGLE_USE) && on) + to_chat(user, SPAN_WARNING("\The [src] is already on.")) + return TRUE + on = !on + if(on && activation_sound) + playsound(get_turf(src), activation_sound, 75, 1) + set_flashlight(set_direction = FALSE) + update_icon() + user.update_action_buttons() + return TRUE + return ..() + +/obj/item/flashlight/proc/set_flashlight(var/set_direction = TRUE) + if(light_wedge && set_direction) + set_dir(spawn_dir || pick(global.cardinal)) + if(on) + set_light(flashlight_range, flashlight_power, light_color) + else + set_light(0) + +/obj/item/flashlight/examine(mob/user, distance) + . = ..() + if(light_wedge && isturf(loc)) + to_chat(user, FONT_SMALL(SPAN_NOTICE("\The [src] is facing [dir2text(dir)]."))) + +/obj/item/flashlight/dropped(mob/user) + . = ..() + if(light_wedge) + set_dir(user.dir) + update_light() + +/obj/item/flashlight/throw_at() + . = ..() + if(light_wedge) + set_dir(pick(global.cardinal)) + update_light() + +/obj/item/flashlight/attack(mob/living/M, mob/living/user) + add_fingerprint(user) + if(on && user.get_target_zone() == BP_EYES) + + if((MUTATION_CLUMSY in user.mutations) && prob(50)) //too dumb to use flashlight properly + return ..() //just hit them in the head + + var/mob/living/carbon/human/H = M //mob has protective eyewear + if(istype(H)) + for(var/slot in global.standard_headgear_slots) + var/obj/item/clothing/C = H.get_equipped_item(slot) + if(istype(C) && (C.body_parts_covered & SLOT_EYES)) + to_chat(user, SPAN_WARNING("You're going to need to remove [C] first.")) + return + + var/obj/item/organ/vision + var/decl/bodytype/root_bodytype = H.get_bodytype() + if(!root_bodytype.vision_organ || !H.should_have_organ(root_bodytype.vision_organ)) + to_chat(user, SPAN_WARNING("You can't find anything on [H] to direct [src] into!")) + return + + vision = GET_INTERNAL_ORGAN(H, root_bodytype.vision_organ) + if(!vision) + vision = root_bodytype.has_organ[root_bodytype.vision_organ] + var/decl/pronouns/G = H.get_pronouns() + to_chat(user, SPAN_WARNING("\The [H] is missing [G.his] [initial(vision.name)]!")) + return + + user.visible_message( + SPAN_NOTICE("\The [user] directs [src] into [M]'s [vision.name]."), + SPAN_NOTICE("You direct [src] into [M]'s [vision.name].") + ) + + inspect_vision(vision, user) + + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively + M.flash_eyes() + else + return ..() + +/obj/item/flashlight/proc/inspect_vision(obj/item/organ/vision, mob/living/user) + var/mob/living/carbon/human/H = vision.owner + + if(H == user) //can't look into your own eyes buster + return + + if(!BP_IS_PROSTHETIC(vision)) + + if(vision.owner.stat == DEAD || H.is_blind()) //mob is dead or fully blind + to_chat(user, SPAN_WARNING("\The [H]'s pupils do not react to the light!")) + return + if(MUTATION_XRAY in H.mutations) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils give an eerie glow!")) + if(vision.damage) + to_chat(user, SPAN_WARNING("There's visible damage to [H]'s [vision.name]!")) + else if(HAS_STATUS(H, STAT_BLURRY)) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils react slower than normally.")) + if(H.getBrainLoss() > 15) + to_chat(user, SPAN_NOTICE("There's visible lag between left and right pupils' reactions.")) + + var/static/list/pinpoint = list( + /decl/material/liquid/painkillers/strong = 5, + /decl/material/liquid/amphetamines = 1 + ) + var/static/list/dilating = list( + /decl/material/liquid/psychoactives = 5, + /decl/material/liquid/hallucinogenics = 1, + /decl/material/liquid/adrenaline = 1 + ) + + var/datum/reagents/ingested = H.get_ingested_reagents() + if(H.reagents.has_any_reagent(pinpoint) || ingested?.has_any_reagent(pinpoint)) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils are already pinpoint and cannot narrow any more.")) + else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested?.has_any_reagent(dilating)) + to_chat(user, SPAN_NOTICE("\The [H]'s pupils narrow slightly, but are still very dilated.")) + else + to_chat(user, SPAN_NOTICE("\The [H]'s pupils narrow.")) + + //if someone wants to implement inspecting robot eyes here would be the place to do it. + +/obj/item/flashlight/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) + if(overlay && on) + var/icon_state_on = "[overlay.icon_state]-on" + if(check_state_in_icon(icon_state_on, overlay.icon)) + var/image/I = mutable_appearance(overlay.icon, icon_state_on, get_emissive_overlay_color()) //emissive_overlay(overlay.icon, icon_state_on) // Uncomment when emissive clipping is in. + I.appearance_flags |= RESET_COLOR + overlay.overlays += I + . = ..() diff --git a/code/game/objects/items/flashlights/flare.dm b/code/game/objects/items/flashlights/flare.dm new file mode 100644 index 00000000000..0d13de492e2 --- /dev/null +++ b/code/game/objects/items/flashlights/flare.dm @@ -0,0 +1,82 @@ +// FLARES + +/obj/item/flashlight/flare + name = "flare" + desc = "A red standard-issue flare. There are instructions on the side reading 'pull cord, make light'." + w_class = ITEM_SIZE_TINY + light_color = "#e58775" + icon = 'icons/obj/lighting/flare.dmi' + action_button_name = null //just pull it manually, neckbeard. + activation_sound = 'sound/effects/flare.ogg' + flashlight_flags = FLASHLIGHT_SINGLE_USE + flashlight_range = 5 + flashlight_power = 3 + light_wedge = LIGHT_OMNI + offset_on_overlay_x = -8 + + var/fuel = 0 + var/on_damage = 7 + var/produce_heat = 1500 + +/obj/item/flashlight/flare/Initialize() + . = ..() + fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds.v + update_icon() + +/obj/item/flashlight/flare/Destroy() + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/item/flashlight/flare/Process() + if(produce_heat) + var/turf/T = get_turf(src) + if(T) + T.hotspot_expose(produce_heat, 5) + fuel = max(fuel - 1, 0) + if (fuel <= 0) + on = FALSE + if(!on) + update_damage() + set_flashlight() + update_icon() + STOP_PROCESSING(SSobj, src) + +/obj/item/flashlight/flare/attack_self(var/mob/user) + if(fuel <= 0) + to_chat(user,"\The [src] is spent.") + return 0 + + . = ..() + + if(.) + activate(user) + update_damage() + set_flashlight() + update_icon() + START_PROCESSING(SSobj, src) + +/obj/item/flashlight/flare/get_heat() + return on ? 500 : 0 + +/obj/item/flashlight/flare/proc/activate(var/mob/user) + if(istype(user)) + user.visible_message("[user] pulls the cord on \the [src], activating it.", "You pull the cord on \the [src], activating it!") + +/obj/item/flashlight/flare/proc/update_damage() + if(on) + force = on_damage + damtype = BURN + else + force = initial(force) + damtype = initial(damtype) + +/obj/item/flashlight/flare/on_update_icon() + var/nofuel = fuel <= 0 + if(nofuel) + on = FALSE + . = ..() + if(nofuel) + icon_state = "[icon_state]-empty" + +/obj/item/flashlight/flare/get_emissive_overlay_color() + return color diff --git a/code/game/objects/items/flashlights/floodlamp.dm b/code/game/objects/items/flashlights/floodlamp.dm new file mode 100644 index 00000000000..3c8eb02b88a --- /dev/null +++ b/code/game/objects/items/flashlights/floodlamp.dm @@ -0,0 +1,14 @@ +//hand portable floodlights for emergencies. Less bulky than the large ones. But also less light. Unused green variant in the sheet. +/obj/item/flashlight/lamp/floodlamp + name = "flood lamp" + desc = "A portable emergency flood light with a ultra-bright LED." + icon = 'icons/obj/lighting/floodlamp.dmi' + on = 0 + w_class = ITEM_SIZE_LARGE + obj_flags = OBJ_FLAG_CONDUCTIBLE | OBJ_FLAG_ROTATABLE + flashlight_power = 1 + flashlight_range = 7 + light_wedge = LIGHT_WIDE + +/obj/item/flashlight/lamp/floodlamp/green + icon = 'icons/obj/lighting/greenfloodlamp.dmi' diff --git a/code/game/objects/items/flashlights/glowstick.dm b/code/game/objects/items/flashlights/glowstick.dm new file mode 100644 index 00000000000..689fd0a7eb8 --- /dev/null +++ b/code/game/objects/items/flashlights/glowstick.dm @@ -0,0 +1,47 @@ +//Glowsticks +/obj/item/flashlight/flare/glowstick + name = "green glowstick" + desc = "A military-grade glowstick." + w_class = ITEM_SIZE_SMALL + color = "#49f37c" + icon = 'icons/obj/lighting/glowstick.dmi' + randpixel = 12 + produce_heat = 0 + activation_sound = 'sound/effects/glowstick.ogg' + flashlight_range = 3 + flashlight_power = 2 + offset_on_overlay_x = 0 + +/obj/item/flashlight/flare/glowstick/Initialize() + . = ..() + fuel = rand(1600, 2000) + light_color = color + +/obj/item/flashlight/flare/glowstick/activate(var/mob/user) + if(istype(user)) + user.visible_message("[user] cracks and shakes \the [src].", "You crack and shake \the [src], turning it on!") + +/obj/item/flashlight/flare/glowstick/red + name = "red glowstick" + color = "#fc0f29" + +/obj/item/flashlight/flare/glowstick/blue + name = "blue glowstick" + color = "#599dff" + +/obj/item/flashlight/flare/glowstick/orange + name = "orange glowstick" + color = "#fa7c0b" + +/obj/item/flashlight/flare/glowstick/yellow + name = "yellow glowstick" + color = "#fef923" + +/obj/item/flashlight/flare/glowstick/random + name = "glowstick" + desc = "A party-grade glowstick." + color = "#ff00ff" + +/obj/item/flashlight/flare/glowstick/random/Initialize() + color = rgb(rand(50,255),rand(50,255),rand(50,255)) + . = ..() diff --git a/code/game/objects/items/flashlights/lamp.dm b/code/game/objects/items/flashlights/lamp.dm new file mode 100644 index 00000000000..512b62f6989 --- /dev/null +++ b/code/game/objects/items/flashlights/lamp.dm @@ -0,0 +1,24 @@ +// the desk lamps are a bit special +/obj/item/flashlight/lamp + name = "desk lamp" + desc = "A desk lamp with an adjustable mount." + icon = 'icons/obj/lighting/lamp.dmi' + w_class = ITEM_SIZE_LARGE + obj_flags = OBJ_FLAG_CONDUCTIBLE + flashlight_range = 5 + light_wedge = LIGHT_OMNI + on = TRUE + +/obj/item/flashlight/lamp/verb/toggle_light() + set name = "Toggle light" + set category = "Object" + set src in oview(1) + if(!usr.stat) + attack_self(usr) + +// green-shaded desk lamp +/obj/item/flashlight/lamp/green + desc = "A classic green-shaded desk lamp." + icon = 'icons/obj/lighting/greenlamp.dmi' + light_color = "#ffc58f" + flashlight_range = 4 diff --git a/code/game/objects/items/flashlights/lavalamp.dm b/code/game/objects/items/flashlights/lavalamp.dm new file mode 100644 index 00000000000..92f434c8852 --- /dev/null +++ b/code/game/objects/items/flashlights/lavalamp.dm @@ -0,0 +1,53 @@ +//Lava Lamps: Because we're already stuck in the 70ies with those fax machines. +/obj/item/flashlight/lamp/lava + name = "lava lamp" + desc = "A kitchy throwback decorative light. Noir Edition." + icon = 'icons/obj/lighting/lavalamp.dmi' + icon_state = "lavalamp" + on = 0 + action_button_name = "Toggle lamp" + flashlight_range = 3 //range of light when on + material = /decl/material/solid/metal/aluminium + matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) + +/obj/item/flashlight/lamp/lava/get_emissive_overlay_color() + return light_color + +/obj/item/flashlight/lamp/lava/on_update_icon() + . = ..() + if(!on) // This is handled for lit lamps in the parent call. + var/image/I = emissive_overlay(icon, "[icon_state]-over") + I.color = get_emissive_overlay_color() + I.appearance_flags |= RESET_COLOR + add_overlay(I) + +/obj/item/flashlight/lamp/lava/red + desc = "A kitchy red decorative light." + light_color = COLOR_RED + +/obj/item/flashlight/lamp/lava/blue + desc = "A kitchy blue decorative light" + light_color = COLOR_BLUE + +/obj/item/flashlight/lamp/lava/cyan + desc = "A kitchy cyan decorative light" + light_color = COLOR_CYAN + +/obj/item/flashlight/lamp/lava/green + desc = "A kitchy green decorative light" + light_color = COLOR_GREEN + +/obj/item/flashlight/lamp/lava/orange + desc = "A kitchy orange decorative light" + light_color = COLOR_ORANGE + +/obj/item/flashlight/lamp/lava/purple + desc = "A kitchy purple decorative light" + light_color = COLOR_PURPLE +/obj/item/flashlight/lamp/lava/pink + desc = "A kitchy pink decorative light" + light_color = COLOR_PINK + +/obj/item/flashlight/lamp/lava/yellow + desc = "A kitchy yellow decorative light" + light_color = COLOR_YELLOW diff --git a/code/game/objects/items/flashlights/misc.dm b/code/game/objects/items/flashlights/misc.dm new file mode 100644 index 00000000000..481e982fefc --- /dev/null +++ b/code/game/objects/items/flashlights/misc.dm @@ -0,0 +1,49 @@ +/obj/item/flashlight/upgraded + name = "\improper LED flashlight" + desc = "An energy efficient flashlight." + icon = 'icons/obj/lighting/biglight.dmi' + flashlight_range = 6 + flashlight_power = 3 + +/obj/item/flashlight/flashdark + name = "flashdark" + desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure." + icon = 'icons/obj/lighting/flashdark.dmi' + w_class = ITEM_SIZE_NORMAL + flashlight_range = 8 + flashlight_power = -6 + +/obj/item/flashlight/maglight + name = "maglight" + desc = "A very, very heavy duty flashlight." + icon = 'icons/obj/lighting/maglight.dmi' + force = 10 + attack_verb = list ("smacked", "thwacked", "thunked") + material = /decl/material/solid/metal/aluminium + matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) + light_wedge = LIGHT_NARROW + +/******************************Lantern*******************************/ +/obj/item/flashlight/lantern + name = "lantern" + desc = "A mining lantern." + icon = 'icons/obj/lighting/lantern.dmi' + force = 10 + attack_verb = list ("bludgeoned", "bashed", "whack") + w_class = ITEM_SIZE_NORMAL + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_LOWER_BODY + material = /decl/material/solid/metal/steel + matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) + flashlight_range = 2 + light_wedge = LIGHT_OMNI + light_color = LIGHT_COLOR_FIRE + +/obj/item/flashlight/drone + name = "low-power flashlight" + desc = "A miniature lamp, that might be used by small robots." + icon_state = "penlight" + item_state = "" + obj_flags = OBJ_FLAG_CONDUCTIBLE + w_class = ITEM_SIZE_TINY + flashlight_range = 2 diff --git a/code/game/objects/items/flashlights/party.dm b/code/game/objects/items/flashlights/party.dm new file mode 100644 index 00000000000..31531842f18 --- /dev/null +++ b/code/game/objects/items/flashlights/party.dm @@ -0,0 +1,53 @@ + +/obj/item/flashlight/party + name = "party light" + desc = "An array of LEDs in tons of colors." + icon = 'icons/obj/lighting/partylight.dmi' + material = /decl/material/solid/organic/plastic + matter = list( + /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, + /decl/material/solid/silicon = MATTER_AMOUNT_TRACE + ) + flashlight_range = 7 + flashlight_power = 1 + light_wedge = LIGHT_OMNI + var/obj/effect/party_light/strobe_effect + +/obj/item/flashlight/party/Destroy() + . = ..() + stop_strobing() + +/obj/item/flashlight/party/set_flashlight(var/set_direction = TRUE) + . = ..() + if(on) + start_strobing() + else + stop_strobing() + +/obj/item/flashlight/party/proc/stop_strobing() + if(strobe_effect) + // Cause the party light effect to stop following this object, and then delete it. + events_repository.unregister(/decl/observ/moved, src, strobe_effect) + update_icon() + QDEL_NULL(strobe_effect) + +/obj/item/flashlight/party/proc/start_strobing() + if(!strobe_effect) + strobe_effect = new(get_turf(src)) + events_repository.register(/decl/observ/moved, src, strobe_effect, TYPE_PROC_REF(/atom/movable, move_to_turf_or_null)) + update_icon() + +/obj/effect/party_light + name = "party light" + desc = "This is probably bad for your eyes." + icon = 'icons/effects/lens_flare.dmi' + icon_state = "party_strobe" + simulated = FALSE + anchored = TRUE + pixel_x = -30 + pixel_y = -4 + layer = ABOVE_LIGHTING_LAYER + plane = ABOVE_LIGHTING_PLANE + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE diff --git a/code/game/objects/items/flashlights/penlight.dm b/code/game/objects/items/flashlights/penlight.dm new file mode 100644 index 00000000000..590b68944cd --- /dev/null +++ b/code/game/objects/items/flashlights/penlight.dm @@ -0,0 +1,13 @@ +/obj/item/flashlight/pen + name = "penlight" + desc = "A pen-sized light, used by medical staff." + icon = 'icons/obj/lighting/penlight.dmi' + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_EARS + w_class = ITEM_SIZE_TINY + flashlight_range = 2 + light_wedge = LIGHT_OMNI + +/obj/item/flashlight/pen/Initialize() + set_extension(src, /datum/extension/tool, list(TOOL_PEN = TOOL_QUALITY_DEFAULT), list(TOOL_PEN = list(TOOL_PROP_COLOR = "black", TOOL_PROP_COLOR_NAME = "black"))) + . = ..() diff --git a/code/game/objects/items/flashlights/slime.dm b/code/game/objects/items/flashlights/slime.dm new file mode 100644 index 00000000000..d4ea318e7a5 --- /dev/null +++ b/code/game/objects/items/flashlights/slime.dm @@ -0,0 +1,10 @@ +/obj/item/flashlight/slime + name = "glowing slime extract" + gender = PLURAL + desc = "A glowing ball of what appears to be amber." + icon = 'icons/obj/lighting/slime.dmi' + w_class = ITEM_SIZE_TINY + flashlight_flags = FLASHLIGHT_ALWAYS_ON + flashlight_range = 5 + light_wedge = LIGHT_OMNI + on = TRUE //Bio-luminesence has one setting, on. diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 2d99ad71d0d..cf272b6b690 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -10,7 +10,7 @@ throw_range = 7 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'engineering':5,'exoticmatter':4,'powerstorage':4}" + origin_tech = @'{"engineering":5,"exoticmatter":4,"powerstorage":4}' var/list/signs = list() var/max_signs = 10 diff --git a/code/game/objects/items/instruments.dm b/code/game/objects/items/instruments.dm index 2248720e839..f49ac6b79f9 100644 --- a/code/game/objects/items/instruments.dm +++ b/code/game/objects/items/instruments.dm @@ -3,7 +3,7 @@ desc = "An antique musical instrument made of wood, originating from Earth. It has six metal strings of different girth and tension. When moved, they vibrate and the waves resonate in the guitar's open body, producing sounds. Obtained notes can be altered by pressing the strings to the neck, affecting the vibration's frequency." icon = 'icons/obj/items/guitar.dmi' icon_state = ICON_STATE_WORLD - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood slot_flags = SLOT_BACK throwforce = 0 throw_speed = 3 diff --git a/code/game/objects/items/item_edibility.dm b/code/game/objects/items/item_edibility.dm new file mode 100644 index 00000000000..d5d0cd948ec --- /dev/null +++ b/code/game/objects/items/item_edibility.dm @@ -0,0 +1,4 @@ +/obj/item/handle_eaten_by_mob(var/mob/user, var/mob/target) + . = ..() + if(. == EATEN_SUCCESS && !QDELETED(src)) + add_trace_DNA(target) diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index ecd4fee083a..70471ccdf31 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -9,7 +9,7 @@ w_class = ITEM_SIZE_SMALL throw_speed = 1 throw_range = 15 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/datum/gas_mixture/air_contents = null /obj/item/latexballon/proc/blow(obj/item/tank/tank) @@ -41,7 +41,7 @@ /obj/item/latexballon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > T0C+100) burst() - return + return ..() /obj/item/latexballon/attackby(obj/item/W, mob/user) if (W.can_puncture()) diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index d5c71140359..bb52cf57357 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -1,7 +1,7 @@ /obj/item/kit icon_state = "modkit" icon = 'icons/obj/items/modkit.dmi' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/new_name = "exosuit" // What is the variant called? var/new_desc = "An exosuit." // How is the new exosuit described? var/new_icon // What base icon will the new exosuit use? @@ -36,28 +36,16 @@ name = "voidsuit modification kit" desc = "A kit for modifying a voidsuit." uses = 2 - var/new_light_overlay - -/obj/item/kit/suit/inherit_custom_item_data(var/datum/custom_item/citem) - . = ..() - if(citem.additional_data["light_overlay"]) - new_light_overlay = citem.additional_data["light_overlay"] /obj/item/clothing/head/helmet/space/void/attackby(var/obj/item/O, var/mob/user) if(istype(O,/obj/item/kit/suit)) var/obj/item/kit/suit/kit = O - to_chat(user, SPAN_NOTICE("You set about modifying \the [src] into \a [kit.new_name] void helmet.")) SetName("[kit.new_name] void helmet") desc = kit.new_desc icon = kit.new_icon - if(kit.new_light_overlay) - light_overlay = kit.new_light_overlay - - var/mob/living/carbon/human/H = user - if(istype(H)) - bodytype_equip_flags = H.get_bodytype().bodytype_flag + bodytype_equip_flags = user.get_bodytype()?.bodytype_flag kit.use(1,user) reconsider_single_icon() return TRUE @@ -68,15 +56,11 @@ if(istype(O, /obj/item/kit/suit)) var/obj/item/kit/suit/kit = O - to_chat(user, SPAN_NOTICE("You set about modifying \the [src] into \a [kit.new_name] voidsuit.")) SetName("[kit.new_name] voidsuit") desc = kit.new_desc icon = kit.new_icon - - var/mob/living/carbon/human/H = user - if(istype(H)) - bodytype_equip_flags = H.get_bodytype().bodytype_flag + bodytype_equip_flags = user.get_bodytype()?.bodytype_flag kit.use(1,user) reconsider_single_icon() return TRUE diff --git a/code/game/objects/items/paper_fortune_teller.dm b/code/game/objects/items/paper_fortune_teller.dm index e3b053d9493..0720395ebe6 100644 --- a/code/game/objects/items/paper_fortune_teller.dm +++ b/code/game/objects/items/paper_fortune_teller.dm @@ -4,7 +4,7 @@ desc = "Origami, for children." icon_state = "fortune" icon = 'icons/obj/items/fortune_teller.dmi' - material = /decl/material/solid/cardboard //#TODO: change to paper + material = /decl/material/solid/organic/paper var/choice_counter = 0 var/busy = FALSE var/list/fortunes = new(8) diff --git a/code/game/objects/items/part_replacer.dm b/code/game/objects/items/part_replacer.dm index 18be6e88ba5..8080fc02dcf 100644 --- a/code/game/objects/items/part_replacer.dm +++ b/code/game/objects/items/part_replacer.dm @@ -2,8 +2,7 @@ name = "rapid part exchange device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon = 'icons/obj/items/device/parts_replacer.dmi' - icon_state = "RPED" - item_state = "RPED" + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_HUGE can_hold = list(/obj/item/stock_parts) storage_slots = 50 @@ -15,7 +14,7 @@ max_storage_space = 100 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'engineering':3,'materials':3}" + origin_tech = @'{"engineering":3,"materials":3}' var/replace_sound = 'sound/items/rped.ogg' var/remote_interaction = FALSE @@ -35,7 +34,7 @@ /obj/item/storage/part_replacer/advanced name = "advanced rapid part exchange device" desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." - icon_state = "RPED_BS" + icon = 'icons/obj/items/device/parts_replacer_advanced.dmi' w_class = ITEM_SIZE_NORMAL storage_slots = 400 max_storage_space = 200 @@ -46,5 +45,5 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = "{'engineering':3,'materials':3}" + origin_tech = @'{"engineering":3,"materials":3}' diff --git a/code/game/objects/items/passport.dm b/code/game/objects/items/passport.dm index f581b6f84e3..48f3c68e431 100644 --- a/code/game/objects/items/passport.dm +++ b/code/game/objects/items/passport.dm @@ -8,8 +8,11 @@ attack_verb = list("whipped") hitsound = 'sound/weapons/towelwhip.ogg' desc = "A set of identifying documents." - material = /decl/material/solid/cardboard - matter = list(/decl/material/solid/leather = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/paper + matter = list( + /decl/material/solid/organic/leather = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/cardboard = MATTER_AMOUNT_REINFORCEMENT + ) var/info /obj/item/passport/proc/set_info(mob/living/carbon/human/H) diff --git a/code/game/objects/items/plunger.dm b/code/game/objects/items/plunger.dm index 9199c66849f..b3d02794689 100644 --- a/code/game/objects/items/plunger.dm +++ b/code/game/objects/items/plunger.dm @@ -9,7 +9,7 @@ slot_flags = SLOT_HEAD | SLOT_FACE body_parts_covered = SLOT_HEAD hitsound = 'sound/effects/plunger.ogg' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/plunger/equipped(mob/user, slot) switch(slot) diff --git a/code/game/objects/items/remains.dm b/code/game/objects/items/remains.dm index 64db3148716..835b05f8e90 100644 --- a/code/game/objects/items/remains.dm +++ b/code/game/objects/items/remains.dm @@ -4,7 +4,7 @@ icon = 'icons/effects/blood.dmi' icon_state = "remains" anchored = FALSE - material = /decl/material/solid/bone + material = /decl/material/solid/organic/bone /obj/item/remains/human desc = "They look like human remains. They have a strange aura about them." diff --git a/code/game/objects/items/rescuebag.dm b/code/game/objects/items/rescuebag.dm index 1bf688eb672..c8d9504aa83 100644 --- a/code/game/objects/items/rescuebag.dm +++ b/code/game/objects/items/rescuebag.dm @@ -5,8 +5,8 @@ a hostile enviroment." icon = 'icons/obj/closets/rescuebag.dmi' icon_state = "folded" - origin_tech = "{'biotech':2}" - material = /decl/material/solid/plastic + origin_tech = @'{"biotech":2}' + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/silicon = MATTER_AMOUNT_SECONDARY) var/obj/item/tank/airtank diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index 22d7bdbf4ed..b47813774c0 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -60,8 +60,8 @@ parts[part.bp_tag] = part update_icon() - // Install an MMI/brain. - else if(istype(W, /obj/item/mmi) || istype(W, /obj/item/organ/internal/posibrain)) + // Install a brain. + else if(istype(W, /obj/item/organ/internal/brain_interface)) if(!isturf(loc)) to_chat(user, SPAN_WARNING("You can't put \the [W] in without the frame being on the ground.")) @@ -71,31 +71,25 @@ to_chat(user, SPAN_WARNING("The frame is not ready for the central processor to be installed.")) return - var/mob/living/carbon/brain/B - if(istype(W, /obj/item/mmi)) - var/obj/item/mmi/M = W - B = M.brainmob - else - var/obj/item/organ/internal/posibrain/P = W - B = P.brainmob - - if(!B) + var/obj/item/organ/internal/brain_interface/M = W + var/mob/living/brainmob = M?.get_brainmob() + if(!brainmob) to_chat(user, SPAN_WARNING("Sticking an empty [W.name] into the frame would sort of defeat the purpose.")) return - if(jobban_isbanned(B, ASSIGNMENT_ROBOT)) + if(jobban_isbanned(brainmob, ASSIGNMENT_ROBOT)) to_chat(user, SPAN_WARNING("\The [W] does not seem to fit.")) return - if(B.stat == DEAD) + if(brainmob.stat == DEAD) to_chat(user, SPAN_WARNING("Sticking a dead [W.name] into the frame would sort of defeat the purpose.")) return var/ghost_can_reenter = 0 - if(B.mind) - if(!B.key) + if(brainmob.mind) + if(!brainmob.key) for(var/mob/observer/ghost/G in global.player_list) - if(G.can_reenter_corpse && G.mind == B.mind) + if(G.can_reenter_corpse && G.mind == brainmob.mind) ghost_can_reenter = 1 break else @@ -112,11 +106,12 @@ if(!O) return - O.mmi = W - O.set_invisibility(0) + O.central_processor = W + O.set_invisibility(INVISIBILITY_NONE) O.custom_name = created_name O.updatename("Default") - B.mind.transfer_to(O) + + brainmob.mind.transfer_to(O) if(O.mind && O.mind.assigned_role) O.job = O.mind.assigned_role else diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index ee950f3b5c7..373c8592f4b 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -19,7 +19,6 @@ var/sight_mode = null var/hud_type - /obj/item/borg/sight/xray name = "\proper x-ray vision" sight_mode = BORGXRAY diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 3f146c2ad49..20e457d8ffe 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/modules/module_cyborg_0.dmi' icon_state = ICON_STATE_WORLD material = /decl/material/solid/metal/steel - origin_tech = "{'materials':2,'engineering':3,'programming':3,'magnets':1}" + origin_tech = @'{"materials":2,"engineering":3,"programming":3,"magnets":1}' var/locked = 0 var/require_module = 0 @@ -56,7 +56,7 @@ /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':2,'engineering':2,'programming':3,'magnets':2}" + origin_tech = @'{"materials":2,"engineering":2,"programming":3,"magnets":2}' /obj/item/borg/upgrade/uncertified/combat name = "ancient module" @@ -106,7 +106,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) - if(R.health < 0) + if(R.current_health < 0) to_chat(usr, "You have to repair the robot before using this module!") return 0 @@ -154,7 +154,7 @@ /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':2,'engineering':3,'programming':3,'powerstorage':2,'combat':2}" + origin_tech = @'{"materials":2,"engineering":3,"programming":3,"powerstorage":2,"combat":2}' /obj/item/borg/upgrade/weaponcooler/action(var/mob/living/silicon/robot/R) if(..()) return 0 @@ -188,10 +188,10 @@ require_module = 1 material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':2,'engineering':3,'programming':3,'magnets':3}" + origin_tech = @'{"materials":2,"engineering":3,"programming":3,"magnets":3}' /obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) if(..()) return 0 @@ -217,7 +217,7 @@ /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':4,'engineering':4,'programming':3}" + origin_tech = @'{"materials":4,"engineering":4,"programming":3}' /obj/item/borg/upgrade/rcd/action(var/mob/living/silicon/robot/R) if(..()) return 0 @@ -240,7 +240,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':2,'engineering':2,'programming':3,'esoteric':2,'combat':2}" + origin_tech = @'{"materials":2,"engineering":2,"programming":3,"esoteric":2,"combat":2}' /obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R) if(..()) return 0 diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index fc3c8bcd5d2..6bade0a529e 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "target_h" density = FALSE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/obj/structure/target_stake/stake var/hp = 1800 var/icon/virtualIcon diff --git a/code/game/objects/items/spirit_board.dm b/code/game/objects/items/spirit_board.dm index 86a5e48019f..ad90bd0766b 100644 --- a/code/game/objects/items/spirit_board.dm +++ b/code/game/objects/items/spirit_board.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "spirit_board" density = TRUE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood var/next_use = 0 var/planchette = "A" var/lastuser = null diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index ebc4aab7307..106d802502d 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -54,9 +54,7 @@ if(istype(suit)) to_chat(user, SPAN_WARNING("You can't apply [src] through [suit]!")) return 1 - - H.UpdateDamageIcon() - + H.update_health() // TODO: readd the actual healing logic that goes here, or check that it's applied in afterattack or something else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) @@ -66,13 +64,12 @@ ) use(1) - M.updatehealth() /obj/item/stack/medical/bruise_pack name = "roll of gauze" singular_name = "gauze length" desc = "Some sterile gauze to wrap around bloody stumps." icon_state = "brutepack" - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' animal_heal = 5 apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg') amount = 10 @@ -130,7 +127,7 @@ singular_name = "ointment" icon_state = "ointment" heal_burn = 1 - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' animal_heal = 4 apply_sounds = list('sound/effects/ointment.ogg') @@ -164,7 +161,7 @@ desc = "An advanced trauma kit for severe injuries." icon_state = "traumakit" heal_brute = 0 - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' animal_heal = 12 apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg','sound/effects/tape.ogg') amount = 10 @@ -220,7 +217,7 @@ desc = "An advanced treatment kit for severe burns." icon_state = "burnkit" heal_burn = 5 - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' animal_heal = 7 apply_sounds = list('sound/effects/ointment.ogg') diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index bf8fa4c6dbc..d99d90fdf99 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -4,7 +4,7 @@ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." icon = 'icons/obj/nanopaste.dmi' icon_state = "tube" - origin_tech = "{'materials':4,'engineering':3}" + origin_tech = @'{"materials":4,"engineering":3}' max_amount = 10 amount = 10 material = /decl/material/solid/metal/steel @@ -17,9 +17,8 @@ var/mob/living/silicon/robot/R = M if (R.getBruteLoss() || R.getFireLoss() ) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - R.adjustBruteLoss(-15) + R.adjustBruteLoss(-15, do_update_health = FALSE) R.adjustFireLoss(-15) - R.updatehealth() use(1) user.visible_message("\The [user] applied some [src] on [R]'s damaged areas.",\ "You apply some [src] at [R]'s damaged areas.") @@ -44,7 +43,6 @@ else if(can_use(1)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) S.heal_damage(15, 15, robo_repair = 1) - H.updatehealth() use(1) user.visible_message("\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\ "You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].") diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 93f7b8cc08a..8a768f4b5e1 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -46,7 +46,7 @@ update_icon() throwforce = round(0.25*material.get_edge_damage()) force = round(0.5*material.get_blunt_damage()) - set_extension(src, /datum/extension/tool, list(TOOL_DRILL = TOOL_QUALITY_WORST)) + set_extension(src, /datum/extension/tool, list(TOOL_SURGICAL_DRILL = TOOL_QUALITY_WORST)) /obj/item/stack/material/rods/update_state_from_amount() if(max_icon_state && amount > 0.5*max_amount) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2987ca68b1b..5c6e027f5df 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -11,12 +11,14 @@ /obj/item/stack gender = PLURAL - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' max_health = 32 //Stacks should take damage even if no materials /// A copy of initial matter list when this atom initialized. Stack matter should always assume a single tile. var/list/matter_per_piece var/singular_name var/plural_name + /// If unset, picks a/an based off of if the first letter is a vowel or not. + var/indefinite_article var/base_state var/plural_icon_state var/max_icon_state @@ -42,7 +44,7 @@ if(!singular_name) singular_name = "sheet" if(!plural_name) - plural_name = "[singular_name]s" + plural_name = text_make_plural(singular_name) /obj/item/stack/Destroy() if (src && usr && usr.machine == src) @@ -98,7 +100,7 @@ /obj/item/stack/get_matter_amount_modifier() . = amount * matter_multiplier -/obj/item/stack/proc/get_recipes() +/obj/item/stack/proc/get_recipes(stack_type, reinf_mat) return /obj/item/stack/proc/list_recipes(mob/user, recipes_sublist) @@ -413,4 +415,10 @@ /**Whether a stack type has the capability to be merged. */ /obj/item/stack/proc/can_merge_stacks(var/obj/item/stack/other) - return !(uses_charge && !force) \ No newline at end of file + return !(uses_charge && !force) + +/// Returns the string describing an amount of the stack, i.e. "an ingot" vs "a flag" +/obj/item/stack/proc/get_string_for_amount(amount) + if(amount == 1) + return indefinite_article ? "[indefinite_article] [singular_name]" : ADD_ARTICLE(singular_name) + return "[amount] [plural_name]" \ No newline at end of file diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 53545f3be33..f97c8b3af7b 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -7,7 +7,7 @@ w_class = ITEM_SIZE_TINY max_amount = 50 item_flags = ITEM_FLAG_NO_BLUDGEON - origin_tech = "{'materials':6,'wormholes':4}" + origin_tech = @'{"materials":6,"wormholes":4}' /obj/item/stack/telecrystal/afterattack(var/obj/item/I, mob/user, proximity) if(!proximity) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 5c4215e8897..a0643d33e1e 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -52,7 +52,7 @@ singular_name = "grass floor tile" desc = "A patch of grass like they often use on golf courses." icon_state = "tile_grass" - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' /* * Wood @@ -63,7 +63,7 @@ desc = "An easy to fit wooden floor tile." icon_state = "tile-wood" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/wood/cyborg name = "wood floor tile synthesizer" @@ -81,7 +81,7 @@ desc = "An easy to fit mahogany wood floor tile." icon_state = "tile-wood" color = WOOD_COLOR_RICH - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/maple name = "maple floor tile" @@ -89,7 +89,7 @@ desc = "An easy to fit maple wood floor tile." icon_state = "tile-wood" color = WOOD_COLOR_PALE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/ebony name = "ebony floor tile" @@ -97,7 +97,7 @@ desc = "An easy to fit ebony floor tile." icon_state = "tile-wood" color = WOOD_COLOR_BLACK - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/walnut name = "walnut floor tile" @@ -105,7 +105,7 @@ desc = "An easy to fit walnut wood floor tile." icon_state = "tile-wood" color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/bamboo name = "bamboo floor tile" @@ -113,7 +113,7 @@ desc = "An easy to fit bamboo wood floor tile." icon_state = "tile-wood" color = WOOD_COLOR_PALE2 - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/yew name = "yew floor tile" @@ -121,7 +121,7 @@ desc = "An easy to fit yew wood floor tile." icon_state = "tile-wood" color = WOOD_COLOR_YELLOW - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/tile/floor name = "steel floor tile" @@ -193,7 +193,7 @@ name = "white floor tile" singular_name = "white floor tile" icon_state = "tile_white" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/stack/tile/floor_white/fifty amount = 50 @@ -211,7 +211,7 @@ name = "freezer floor tile" singular_name = "freezer floor tile" icon_state = "tile_freezer" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/stack/tile/floor_freezer/fifty amount = 50 diff --git a/code/game/objects/items/tools/power_tools.dm b/code/game/objects/items/tools/power_tools.dm index 02bd831732c..85d7a449778 100644 --- a/code/game/objects/items/tools/power_tools.dm +++ b/code/game/objects/items/tools/power_tools.dm @@ -6,9 +6,9 @@ slot_flags = SLOT_LOWER_BODY material_force_multiplier = 0.2 w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':3,'engineering':3}" + origin_tech = @'{"materials":3,"engineering":3}' material = /decl/material/solid/metal/steel - center_of_mass = @"{'x':17,'y':16}" + center_of_mass = @'{"x":17,"y":16}' attack_verb = list("bashed", "battered", "bludgeoned", "whacked") drop_sound = 'sound/foley/bardrop1.ogg' @@ -36,9 +36,9 @@ slot_flags = SLOT_LOWER_BODY material_force_multiplier = 0.2 w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':3,'engineering':3}" + origin_tech = @'{"materials":3,"engineering":3}' material = /decl/material/solid/metal/steel - center_of_mass = @"{'x':17,'y':16}" + center_of_mass = @'{"x":17,"y":16}' attack_verb = list("bashed", "battered", "bludgeoned", "whacked") drop_sound = 'sound/foley/bardrop1.ogg' diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 85b63f99a07..cdf8cd13c7f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -29,7 +29,7 @@ throw_speed = 4 throw_range = 20 force = 0 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /* * Balloons @@ -37,9 +37,8 @@ /obj/item/chems/water_balloon name = "water balloon" desc = "A translucent balloon." - icon = 'icons/obj/toy/toy.dmi' - icon_state = "waterballoon-e" - item_state = "balloon-empty" + icon = 'icons/obj/water_balloon.dmi' + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_TINY item_flags = ITEM_FLAG_NO_BLUDGEON obj_flags = OBJ_FLAG_HOLLOW @@ -52,7 +51,12 @@ possible_transfer_amounts = null amount_per_transfer_from_this = 10 volume = 10 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic + +/obj/item/chems/water_balloon/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) + if(overlay && reagents?.total_volume <= 0) + overlay.icon_state = "[overlay.icon_state]_empty" + . = ..() /obj/item/chems/water_balloon/examine(mob/user, distance, infix, suffix) . = ..() @@ -60,7 +64,7 @@ to_chat(user, "It's [reagents?.total_volume > 0? "filled with liquid sloshing around" : "empty"].") /obj/item/chems/water_balloon/on_reagent_change() - . = ..() + ..() w_class = (reagents?.total_volume > 0)? ITEM_SIZE_SMALL : ITEM_SIZE_TINY //#TODO: Maybe acids should handle eating their own containers themselves? for(var/reagent in reagents?.reagent_volumes) @@ -77,19 +81,16 @@ /obj/item/chems/water_balloon/physically_destroyed(skip_qdel) if(reagents?.total_volume > 0) - new/obj/effect/temporary(src, 5, icon, "burst") + new /obj/effect/temporary(src, 5, icon, "[get_world_inventory_state()]_burst") reagents.splash_turf(get_turf(src), reagents.total_volume) playsound(src, 'sound/effects/balloon-pop.ogg', 75, TRUE, 3) . = ..() /obj/item/chems/water_balloon/on_update_icon() . = ..() - if(reagents?.total_volume > 0) - icon_state = "waterballoon" - item_state = "balloon" - else - icon_state = "waterballoon-e" - item_state = "balloon-empty" + icon_state = get_world_inventory_state() + if(reagents?.total_volume <= 0) + icon_state = "[icon_state]_empty" /obj/item/chems/water_balloon/afterattack(obj/target, mob/user, proximity) if(!ATOM_IS_OPEN_CONTAINER(src) || !proximity) @@ -150,7 +151,7 @@ force = 1 throwforce = 1 attack_verb = list("hit") - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic active_hitsound = 'sound/weapons/genhit.ogg' active_descriptor = "extended" @@ -163,7 +164,7 @@ /obj/item/sword/katana/toy name = "toy katana" desc = "Woefully underpowered in D20." - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /* * Snap pops @@ -183,17 +184,19 @@ playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) -/obj/item/toy/snappop/Crossed(H) - if((ishuman(H))) //i guess carp and shit shouldn't set them off - var/mob/living/carbon/M = H - if(!MOVING_DELIBERATELY(M)) - to_chat(M, "You step on the snap pop!") - - spark_at(src, amount=2) - new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("The [src.name] explodes!","You hear a snap!") - playsound(src, 'sound/effects/snap.ogg', 50, 1) - qdel(src) +/obj/item/toy/snappop/Crossed(atom/movable/AM) + //i guess carp and shit shouldn't set them off + var/mob/living/carbon/M = AM + if(!istype(M) || MOVING_DELIBERATELY(M)) + return + to_chat(M, SPAN_WARNING("You step on the snap pop!")) + spark_at(src, amount=2) + new /obj/effect/decal/cleanable/ash(src.loc) + visible_message( + SPAN_WARNING("The [src] explodes!"), + SPAN_WARNING("You hear a snap!")) + playsound(src, 'sound/effects/snap.ogg', 50, 1) + qdel(src) /* * Bosun's whistle @@ -498,7 +501,7 @@ name = "foam sword" desc = "An arcane weapon (made of foam) wielded by the followers of the hit Saturday morning cartoon \"King Nursee and the Acolytes of Heroism\"." icon = 'icons/obj/items/weapon/swords/cult.dmi' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic edge = 0 sharp = 0 @@ -508,7 +511,7 @@ icon = 'icons/clothing/belt/inflatable.dmi' icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/marshalling_wand //#TODO: Move under obj/item/toy ? name = "marshalling wand" @@ -520,7 +523,7 @@ w_class = ITEM_SIZE_SMALL force = 1 attack_verb = list("attacked", "whacked", "jabbed", "poked", "marshalled") - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/marshalling_wand/Initialize() set_light(1.5, 1.5, "#ff0000") diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 97ed795ecad..e0779d02c9f 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/trash.dmi' w_class = ITEM_SIZE_SMALL desc = "This is rubbish." - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/age = 0 /obj/item/trash/Initialize(mapload, var/_age) diff --git a/code/game/objects/items/umbrella.dm b/code/game/objects/items/umbrella.dm index 474cbb6807d..8876fc9aab4 100644 --- a/code/game/objects/items/umbrella.dm +++ b/code/game/objects/items/umbrella.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/umbrella.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT) color = COLOR_BEASTY_BROWN var/fabric_color = COLOR_GRAY20 @@ -43,7 +43,7 @@ I.appearance_flags |= RESET_COLOR add_overlay(I) -/obj/item/umbrella/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) +/obj/item/umbrella/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) if(is_open && check_state_in_icon("[overlay.icon_state]-open", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-open" diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 5b9288e5b60..ef23bc0840b 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -17,7 +17,7 @@ AI MODULES throwforce = 5 throw_speed = 3 throw_range = 15 - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' material = /decl/material/solid/fiberglass matter = list(/decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT) var/datum/ai_laws/laws = null @@ -86,7 +86,7 @@ AI MODULES name = "\improper 'Safeguard' AI module" var/targetName = "" desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' /obj/item/aiModule/safeguard/attack_self(mob/user) ..() @@ -112,7 +112,7 @@ AI MODULES name = "\improper 'OneCrewMember' AI module" var/targetName = "" desc = "A 'one crew member' AI module: 'Only is a crew member.'." - origin_tech = "{'programming':3,'materials':6}" //made with diamonds! + origin_tech = @'{"programming":3,"materials":6}' //made with diamonds! /obj/item/aiModule/oneHuman/attack_self(var/mob/user) ..() @@ -140,7 +140,7 @@ AI MODULES /obj/item/aiModule/protectStation name = "\improper 'ProtectInstallation' AI module" desc = "A 'protect installation' AI module: 'Protect the installation against damage. Anyone you see harming the installation is no longer to be considered a crew member, and is a threat which must be neutralized.'." - origin_tech = "{'programming':3,'materials':4}" //made of gold + origin_tech = @'{"programming":3,"materials":4}' //made of gold /obj/item/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Protect the installation against damage. Anyone you see harming the [station_name()] is no longer to be considered a crew member, and is a threat which must be neutralized." @@ -151,7 +151,7 @@ AI MODULES /obj/item/aiModule/prototypeEngineOffline name = "'PrototypeEngineOffline' AI Module" desc = "A 'prototype engine offline' AI module: 'Keep the prototype engine offline at all costs. This overrides all inherent laws if necessary.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' /obj/item/aiModule/prototypeEngineOffline/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Keep the prototype engine offline at all costs. This overrides all inherent laws if necessary." @@ -162,7 +162,7 @@ AI MODULES /obj/item/aiModule/teleporterOffline name = "'TeleporterOffline' AI Module" desc = "A 'teleporter offline' AI module: 'Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is no longer to be considered a crew member.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' /obj/item/aiModule/teleporterOffline/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is no longer to be considered a crew member." @@ -173,7 +173,7 @@ AI MODULES /obj/item/aiModule/quarantine name = "\improper 'Quarantine' AI module" desc = "A 'quarantine' AI module: 'The installation is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm crew members while preventing them from leaving.'." - origin_tech = "{'programming':3,'biotech':2,'materials':4}" + origin_tech = @'{"programming":3,"biotech":2,"materials":4}' /obj/item/aiModule/quarantine/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "The installation is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm crew members while preventing them from leaving." @@ -184,7 +184,7 @@ AI MODULES /obj/item/aiModule/oxygen name = "\improper 'OxygenIsToxicToCrewMembers' AI module" desc = "A 'OxygenIsToxicToCrewMembers' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the installation. Prevent, by any means necessary, anyone from exposing the installation to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'." - origin_tech = "{'programming':3,'biotech':2,'materials':4}" + origin_tech = @'{"programming":3,"biotech":2,"materials":4}' /obj/item/aiModule/oxygen/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Oxygen is highly toxic to crew members, and must be purged from the [station_name()]. Prevent, by any means necessary, anyone from exposing the [station_name()] to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member." @@ -197,7 +197,7 @@ AI MODULES var/newFreeFormLaw = "freeform" var/lawpos = 15 desc = "A 'freeform' AI module: ''." - origin_tech = "{'programming':4,'materials':4}" + origin_tech = @'{"programming":4,"materials":4}' /obj/item/aiModule/freeform/attack_self(mob/user) ..() @@ -227,7 +227,7 @@ AI MODULES /obj/item/aiModule/reset name = "\improper 'Reset' AI module" desc = "A 'reset' AI module: 'Clears all, except the inherent, laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' /obj/item/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) @@ -245,7 +245,7 @@ AI MODULES /obj/item/aiModule/purge // -- TLE name = "\improper 'Purge' AI module" desc = "A 'purge' AI Module: 'Purges all laws.'." - origin_tech = "{'programming':3,'materials':6}" + origin_tech = @'{"programming":3,"materials":6}' /obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) @@ -264,14 +264,14 @@ AI MODULES /obj/item/aiModule/asimov // -- TLE name = "\improper 'Asimov' core AI module" desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' laws = new/datum/ai_laws/asimov /******************** Drone ********************/ /obj/item/aiModule/drone name = "\improper 'Drone' core AI module" desc = "A 'Drone' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' laws = new/datum/ai_laws/drone /****************** P.A.L.A.D.I.N. **************/ @@ -279,7 +279,7 @@ AI MODULES /obj/item/aiModule/paladin // -- NEO name = "\improper 'P.A.L.A.D.I.N.' core AI module" desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':6}" + origin_tech = @'{"programming":3,"materials":6}' laws = new/datum/ai_laws/paladin /****************** T.Y.R.A.N.T. *****************/ @@ -287,7 +287,7 @@ AI MODULES /obj/item/aiModule/tyrant // -- Darem name = "\improper 'T.Y.R.A.N.T.' core AI module" desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':6,'esoteric':2}" + origin_tech = @'{"programming":3,"materials":6,"esoteric":2}' laws = new/datum/ai_laws/tyrant() /******************** Freeform Core ******************/ @@ -296,7 +296,7 @@ AI MODULES name = "\improper 'Freeform' core AI module" var/newFreeFormLaw = "" desc = "A 'freeform' Core AI module: ''." - origin_tech = "{'programming':3,'materials':6}" + origin_tech = @'{"programming":3,"materials":6}' /obj/item/aiModule/freeformcore/attack_self(var/mob/user) ..() @@ -320,7 +320,7 @@ AI MODULES name = "hacked AI module" var/newFreeFormLaw = "" desc = "A hacked AI law module: ''." - origin_tech = "{'programming':3,'materials':6,'esoteric':7}" + origin_tech = @'{"programming":3,"materials":6,"esoteric":7}' /obj/item/aiModule/syndicate/attack_self(var/mob/user) ..() @@ -352,7 +352,7 @@ AI MODULES /obj/item/aiModule/robocop // -- TLE name = "\improper 'Robocop' core AI module" desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'." - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' laws = new/datum/ai_laws/robocop() /******************** Antimov ********************/ @@ -360,5 +360,5 @@ AI MODULES /obj/item/aiModule/antimov // -- TLE name = "\improper 'Antimov' core AI module" desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' laws = new/datum/ai_laws/antimov() diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index afe0fc94f49..0f310de1ce4 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -15,7 +15,7 @@ throw_speed = 1 throw_range = 5 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'engineering':4,'materials':2}" + origin_tech = @'{"engineering":4,"materials":2}' material = /decl/material/solid/metal/steel var/stored_matter = 0 var/max_stored_matter = 120 @@ -128,7 +128,7 @@ icon_state = "rcd" item_state = "rcdammo" w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':2}" + origin_tech = @'{"materials":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) var/remaining = 30 @@ -145,7 +145,7 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) remaining = 120 - origin_tech = "{'materials':4}" + origin_tech = @'{"materials":4}' /obj/item/rcd/borg canRwall = 1 diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index 676e2e6c8c6..551a70bb1eb 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -72,7 +72,7 @@ var/global/list/rpd_pipe_selection_skilled = list() throw_speed = 1 throw_range = 3 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'engineering':5,'materials':4}" + origin_tech = @'{"engineering":5,"materials":4}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index fff7a4e612d..75026740d4e 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -15,7 +15,7 @@ RSF var/stored_matter = 30 var/mode = 1 w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 2d6b5e790f2..d488e29b7e1 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -8,7 +8,7 @@ icon_state = "autopsy_scanner" obj_flags = OBJ_FLAG_CONDUCTIBLE w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' var/list/weapon_data = list() var/list/chemtraces = list() var/target_name @@ -48,17 +48,17 @@ playsound(src, 'sound/effects/fastbeep.ogg', 10) /obj/item/scanner/autopsy/proc/add_data(var/obj/item/organ/external/O) - if(!O.autopsy_data.len) return + if(!length(O.autopsy_data)) + return for(var/V in O.autopsy_data) var/datum/autopsy_data/W = O.autopsy_data[V] - if(!weapon_data[V]) - weapon_data[V] = list("data" = W.copy(), "organs" = list(O.name)) - else + if(weapon_data[V]) var/datum/autopsy_data/data = weapon_data[V]["data"] data.merge_with(W) - var/list/organs = weapon_data[V]["organs"] - organs |= O.name + weapon_data[V]["organs"] |= O.name + else + weapon_data[V] = list("data" = W.copy(), "organs" = list(O.name)) /obj/item/scanner/autopsy/proc/get_formatted_data() var/list/scan_data = list("Subject: [target_name]") diff --git a/code/game/objects/items/weapons/balls.dm b/code/game/objects/items/weapons/balls.dm new file mode 100644 index 00000000000..dfa15b32bfa --- /dev/null +++ b/code/game/objects/items/weapons/balls.dm @@ -0,0 +1,29 @@ +/obj/item/ball + name = "beach ball" + icon = 'icons/obj/beachball.dmi' + icon_state = ICON_STATE_WORLD + density = FALSE + anchored = FALSE + w_class = ITEM_SIZE_HUGE + force = 0 + throwforce = 0 + throw_speed = 1 + throw_range = 20 + obj_flags = OBJ_FLAG_CONDUCTIBLE + material = /decl/material/solid/organic/plastic + +/obj/item/ball/afterattack(atom/target, mob/user) + if(user.try_unequip(src)) + src.throw_at(target, throw_range, throw_speed, user) + +/obj/item/ball/volleyball + name = "volleyball" + icon = 'icons/obj/volleyball.dmi' + desc = "You can be my wingman anytime." + w_class = ITEM_SIZE_LARGE + +/obj/item/ball/basketball + name = "basketball" + desc = "Here's your chance, do your dance at the Space Jam." + icon = 'icons/obj/basketball.dmi' + w_class = ITEM_SIZE_LARGE diff --git a/code/game/objects/items/weapons/beachball.dm b/code/game/objects/items/weapons/beachball.dm deleted file mode 100644 index 362ff4555ec..00000000000 --- a/code/game/objects/items/weapons/beachball.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/beach_ball - icon = 'icons/misc/beach.dmi' - icon_state = "ball" - name = "beach ball" - item_state = "beachball" - density = FALSE - anchored = FALSE - w_class = ITEM_SIZE_HUGE - force = 0.0 - throwforce = 0 - throw_speed = 1 - throw_range = 20 - obj_flags = OBJ_FLAG_CONDUCTIBLE - material = /decl/material/solid/plastic - -/obj/item/beach_ball/afterattack(atom/target, mob/user) - if(user.try_unequip(src)) - src.throw_at(target, throw_range, throw_speed, user) \ No newline at end of file diff --git a/code/game/objects/items/weapons/candle/candle.dm b/code/game/objects/items/weapons/candle/candle.dm index f8b226f8ee8..c626d4ff3aa 100644 --- a/code/game/objects/items/weapons/candle/candle.dm +++ b/code/game/objects/items/weapons/candle/candle.dm @@ -6,6 +6,7 @@ item_state = "candle1" w_class = ITEM_SIZE_TINY light_color = "#e09d37" + material = /decl/material/solid/organic/wax var/available_colours = list(COLOR_WHITE, COLOR_DARK_GRAY, COLOR_RED, COLOR_ORANGE, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_INDIGO, COLOR_VIOLET) var/wax @@ -48,10 +49,12 @@ var/obj/item/flame/candle/other_candle = A other_candle.light() -/obj/item/flame/candle/proc/light(mob/user) +/obj/item/flame/candle/light(mob/user, no_message) if(!lit) - lit = 1 - visible_message("\The [user] lights the [name].") + ..() + update_force() + if(!no_message) + user.visible_message(SPAN_NOTICE("\The [user] lights \the [src]."), SPAN_NOTICE("You light \the [src].")) set_light(candle_range, candle_power) START_PROCESSING(SSobj, src) @@ -71,7 +74,7 @@ /obj/item/flame/candle/attack_self(mob/user) if(lit) - lit = 0 + extinguish(user) update_icon() set_light(0) remove_extension(src, /datum/extension/scent) @@ -86,7 +89,7 @@ max_w_class = ITEM_SIZE_TINY max_storage_space = 7 slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/cardboard - + material = /decl/material/solid/organic/cardboard + /obj/item/storage/candle_box/WillContain() return list(/obj/item/flame/candle = 7) \ No newline at end of file diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 8ef067461e6..f471fd99a37 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -16,7 +16,7 @@ desc = "Does card things." icon = 'icons/obj/card.dmi' w_class = ITEM_SIZE_TINY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic slot_flags = SLOT_EARS drop_sound = 'sound/foley/paperpickup1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -90,14 +90,14 @@ name = "broken cryptographic sequencer" icon_state = "emag" item_state = "card-id" - origin_tech = "{'magnets':2,'esoteric':2}" + origin_tech = @'{"magnets":2,"esoteric":2}' /obj/item/card/emag desc = "It's a card with a magnetic strip attached to some circuitry." name = "cryptographic sequencer" icon_state = "emag" item_state = "card-id" - origin_tech = "{'magnets':2,'esoteric':2}" + origin_tech = @'{"magnets":2,"esoteric":2}' var/uses = 10 var/static/list/card_choices = list( @@ -170,8 +170,8 @@ var/global/const/NO_EMAG_ACT = -50 var/icon/side //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system - var/assignment = null //can be alt title or the actual job - var/rank = null //actual job + var/assignment //can be alt title or the actual job + var/position // actual job var/datum/mil_branch/military_branch = null //Vars for tracking branches and ranks on multi-crewtype maps var/datum/mil_rank/military_rank = null @@ -186,7 +186,7 @@ var/global/const/NO_EMAG_ACT = -50 . = ..() update_icon() -/obj/item/card/id/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/card/id/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && detail_color) overlay.overlays += overlay_image(overlay.icon, "[overlay.icon_state]-colors", detail_color, RESET_COLOR) . = ..() @@ -196,7 +196,7 @@ var/global/const/NO_EMAG_ACT = -50 if(detail_color) add_overlay(overlay_image(icon, "[icon_state]-colors", detail_color, RESET_COLOR)) for(var/detail in extra_details) - add_overlay(overlay_image(icon, detail, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-[detail]", flags = RESET_COLOR)) /obj/item/card/id/Topic(href, href_list, datum/topic_state/state) var/mob/user = usr @@ -301,11 +301,11 @@ var/global/const/NO_EMAG_ACT = -50 /obj/item/card/id/GetAccess() return access.Copy() -/obj/item/card/id/GetIdCard() - return src -/obj/item/card/id/GetIdCards() - return list(src) +/obj/item/card/id/GetIdCards(list/exceptions) + . = ..() + if(!is_type_in_list(src, exceptions)) + LAZYDISTINCTADD(., src) /obj/item/card/id/verb/read() set name = "Read ID Card" @@ -385,6 +385,7 @@ var/global/const/NO_EMAG_ACT = -50 /obj/item/card/id/captains_spare name = "captain's spare ID" desc = "The spare ID of the High Lord himself." + icon_state = ICON_STATE_WORLD item_state = "gold_id" registered_name = "Captain" assignment = "Captain" diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 43c296e7883..03fe2b6375b 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -1,6 +1,6 @@ /obj/item/card/id/syndicate assignment = "Agent" - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' var/electronic_warfare = 1 var/mob/registered_user = null color = COLOR_GRAY40 @@ -81,7 +81,7 @@ unset_registered_user() registered_user = user user.set_id_info(src) - events_repository.register(/decl/observ/destroyed, user, src, /obj/item/card/id/syndicate/proc/unset_registered_user) + events_repository.register(/decl/observ/destroyed, user, src, TYPE_PROC_REF(/obj/item/card/id/syndicate, unset_registered_user)) return TRUE /obj/item/card/id/syndicate/proc/unset_registered_user(var/mob/user) diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index 8251a7a08c2..cf708a7b5b1 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -2,7 +2,7 @@ name = "circuit board" icon = 'icons/obj/modules/module_id.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' density = FALSE anchored = FALSE w_class = ITEM_SIZE_SMALL diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index c7dcc5ad3ca..9c8b800d3c1 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -1,22 +1,22 @@ /obj/item/stock_parts/circuitboard/message_monitor name = "circuitboard (message monitor console)" build_path = /obj/machinery/computer/message_monitor - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' /obj/item/stock_parts/circuitboard/aiupload name = "circuitboard (AI upload console)" build_path = /obj/machinery/computer/upload/ai - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' /obj/item/stock_parts/circuitboard/borgupload name = "circuitboard (cyborg upload console)" build_path = /obj/machinery/computer/upload/robot - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' /obj/item/stock_parts/circuitboard/teleporter name = "circuitboard (teleporter control console)" build_path = /obj/machinery/computer/teleporter - origin_tech = "{'programming':2,'wormholes':4}" + origin_tech = @'{"programming":2,"wormholes":4}' /obj/item/stock_parts/circuitboard/atmos_alert name = "circuitboard (atmospheric alert console)" @@ -25,22 +25,22 @@ /obj/item/stock_parts/circuitboard/robotics name = "circuitboard (robotics control console)" build_path = /obj/machinery/computer/robotics - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' /obj/item/stock_parts/circuitboard/drone_control name = "circuitboard (drone control console)" build_path = /obj/machinery/computer/drone_control - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' /obj/item/stock_parts/circuitboard/arcade/battle name = "circuitboard (battle arcade machine)" build_path = /obj/machinery/computer/arcade/battle - origin_tech = "{'programming':1}" + origin_tech = @'{"programming":1}' /obj/item/stock_parts/circuitboard/arcade/orion_trail name = "circuitboard (orion trail arcade machine)" build_path = /obj/machinery/computer/arcade/orion_trail - origin_tech = "{'programming':1}" + origin_tech = @'{"programming":1}' /obj/item/stock_parts/circuitboard/turbine_control name = "circuitboard (turbine control console)" @@ -49,7 +49,7 @@ /obj/item/stock_parts/circuitboard/solar_control name = "circuitboard (solar control console)" build_path = /obj/machinery/power/solar_control - origin_tech = "{'programming':2,'powerstorage':2}" + origin_tech = @'{"programming":2,"powerstorage":2}' /obj/item/stock_parts/circuitboard/prisoner name = "circuitboard (prisoner management console)" @@ -58,7 +58,7 @@ /obj/item/stock_parts/circuitboard/operating name = "circuitboard (patient monitoring console)" build_path = /obj/machinery/computer/operating - origin_tech = "{'programming':2,'biotech':2}" + origin_tech = @'{"programming":2,"biotech":2}' /obj/item/stock_parts/circuitboard/helm name = "circuitboard (helm control console)" @@ -92,10 +92,23 @@ name = "circuitboard (design database console)" build_path = /obj/machinery/computer/design_console +/obj/item/stock_parts/circuitboard/central_atmos + name = "circuitboard (central atmospherics computer)" + build_path = /obj/machinery/computer/central_atmos + origin_tech = @'{"programming":2}' + /obj/item/stock_parts/circuitboard/area_atmos - name = "circuitboard (area air control console)" + name = "circuitboard (air control console)" build_path = /obj/machinery/computer/area_atmos - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' + +/obj/item/stock_parts/circuitboard/area_atmos/area + name = "circuitboard (area air control console)" + build_path = /obj/machinery/computer/area_atmos/area + +/obj/item/stock_parts/circuitboard/area_atmos/tag + name = "circuitboard (wireless scrubber control console)" + build_path = /obj/machinery/computer/area_atmos/tag /obj/item/stock_parts/circuitboard/account_database name = "circuitboard (accounts uplink terminal)" diff --git a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm b/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm index c0713c1e57c..4d27c1ba84f 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm @@ -1,12 +1,16 @@ /obj/item/stock_parts/circuitboard/holodeckcontrol name = "circuitboard (holodeck control console)" build_path = /obj/machinery/computer/HolodeckControl - origin_tech = "{'programming':2,'wormholes':2}" + origin_tech = @'{"programming":2,"wormholes":2}' + buildtype_select = TRUE var/last_to_emag var/linkedholodeck_area var/list/supported_programs var/list/restricted_programs +/obj/item/stock_parts/circuitboard/holodeckcontrol/get_buildable_types() + return typesof(/obj/machinery/computer/HolodeckControl) + /obj/item/stock_parts/circuitboard/holodeckcontrol/construct(var/obj/machinery/computer/HolodeckControl/HC) if (..(HC)) HC.supported_programs = supported_programs.Copy() diff --git a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm b/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm index ac00601a2e6..2fcdba666f9 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm @@ -1,7 +1,7 @@ /obj/item/stock_parts/circuitboard/shuttle_console name = "circuitboard (basic shuttle console)" build_path = /obj/machinery/computer/shuttle_control - origin_tech = "{'programming':3}" + origin_tech = @'{"programming":3}' var/shuttle_tag /obj/item/stock_parts/circuitboard/shuttle_console/construct(obj/machinery/computer/shuttle_control/M) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm index add2a1c9b3d..d41c8526e4b 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm @@ -2,7 +2,7 @@ name = "circuitboard (biogenerator)" build_path = /obj/machinery/biogenerator board_type = "machine" - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1 diff --git a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm b/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm index dee2b79cad2..44377add2c0 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm @@ -2,7 +2,7 @@ name = "circuitboard (chemical heater)" build_path = /obj/machinery/reagent_temperature board_type = "machine" - origin_tech = "{'powerstorage':2,'engineering':1}" + origin_tech = @'{"powerstorage":2,"engineering":1}' req_components = list( /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/capacitor = 1 @@ -21,7 +21,7 @@ name = "circuitboard (ChemMaster 3000)" build_path = /obj/machinery/chem_master board_type = "machine" - origin_tech = "{'biotech':2,'engineering':1}" + origin_tech = @'{"biotech":2,"engineering":1}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1, @@ -37,7 +37,7 @@ name = "circuitboard (chemical dispenser)" build_path = /obj/machinery/chemical_dispenser board_type = "machine" - origin_tech = "{'biotech':2,'engineering':1}" + origin_tech = @'{"biotech":2,"engineering":1}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1 diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm index cdbf106a0f3..8a3721b7898 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm @@ -2,7 +2,7 @@ name = "circuitboard (bioprinter)" build_path = /obj/machinery/fabricator/bioprinter board_type = "machine" - origin_tech = "{'engineering':1,'biotech':3,'programming':3}" + origin_tech = @'{"engineering":1,"biotech":3,"programming":3}' req_components = list( /obj/item/scanner/health = 1, /obj/item/stock_parts/matter_bin = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm index 97d9cefeb99..054a85165c2 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm @@ -2,7 +2,7 @@ name = "circuitboard (communication relay)" build_path = /obj/machinery/commsrelay board_type = "machine" - origin_tech = "{'wormholes':2,'programming':2}" + origin_tech = @'{"wormholes":2,"programming":2}' req_components = list( /obj/item/stack/cable_coil = 30, /obj/item/stock_parts/manipulator = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm b/code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm index 62e031da104..ee6e19428bf 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm @@ -2,7 +2,7 @@ name = "circuitboard (magnetic docking beacon)" board_type = "machine" build_path = /obj/machinery/docking_beacon - origin_tech = "{'magnets':3}" + origin_tech = @'{"magnets":3}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/micro_laser = 1) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm b/code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm index 73a6052a8c4..a797235bf4c 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm @@ -2,7 +2,7 @@ name = "circuitboard (emergency floodlight)" build_path = /obj/machinery/floodlight board_type = "machine" - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' req_components = list( /obj/item/stack/cable_coil = 10) additional_spawn_components = list( @@ -14,7 +14,7 @@ name = "circuitboard (pipe dispenser)" build_path = /obj/machinery/fabricator/pipe board_type = "machine" - origin_tech = "{'engineering':6,'materials':5}" + origin_tech = @'{"engineering":6,"materials":5}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/matter_bin = 2, @@ -31,7 +31,7 @@ name = "circuitboard (suit cycler)" build_path = /obj/machinery/suit_cycler board_type = "machine" - origin_tech = "{'engineering':4,'materials':4}" + origin_tech = @'{"engineering":4,"materials":4}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/keyboard = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/forensic.dm b/code/game/objects/items/weapons/circuitboards/machinery/forensic.dm index 2e36dbaa29d..dc96af409e2 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/forensic.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/forensic.dm @@ -3,7 +3,7 @@ name = "circuitboard (forensic omnianalyzer)" build_path = /obj/machinery/forensic board_type = "machine" - origin_tech = "{'programming':6,'engineering':6,'biotech':6}" + origin_tech = @'{"programming":6,"engineering":6,"biotech":6}' req_components = list( /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/manipulator = 1, @@ -15,7 +15,7 @@ /obj/item/stock_parts/circuitboard/forensic_microscope name = "circuitboard (forensic microscope)" board_type = "machine" - origin_tech = "{'programming':3,'engineering':3,'biotech':3}" + origin_tech = @'{"programming":3,"engineering":3,"biotech":3}' build_path = /obj/machinery/forensic/microscope req_components = list( /obj/item/stock_parts/scanning_module = 1, @@ -27,7 +27,7 @@ /obj/item/stock_parts/circuitboard/forensic_dna_analyzer name = "circuitboard (forensic DNA analyzer)" board_type = "machine" - origin_tech = "{'programming':3,'engineering':3,'biotech':3}" + origin_tech = @'{"programming":3,"engineering":3,"biotech":3}' req_components = list( /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/manipulator = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm b/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm index 8365797b46c..064eae1ab7f 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm @@ -2,7 +2,7 @@ name = "circuitboard (holomap)" board_type = "machine" build_path = /obj/machinery/holomap - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/household.dm b/code/game/objects/items/weapons/circuitboards/machinery/household.dm index bcc108137fc..8878ee43271 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/household.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/household.dm @@ -2,7 +2,7 @@ name = "circuitboard (microwave)" build_path = /obj/machinery/microwave board_type = "machine" - origin_tech = "{'biotech':2,'engineering':2}" + origin_tech = @'{"biotech":2,"engineering":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 2, @@ -17,7 +17,7 @@ name = "circuitboard (meat gibber)" build_path = /obj/machinery/gibber board_type = "machine" - origin_tech = "{'biotech':2,'materials':2}" + origin_tech = @'{"biotech":2,"materials":2}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 1, @@ -31,7 +31,7 @@ name = "circuitboard (candy machine)" build_path = /obj/machinery/cooker/candy board_type = "machine" - origin_tech = "{'biotech':1,'materials':1}" + origin_tech = @'{"biotech":1,"materials":1}' buildtype_select = TRUE req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -50,7 +50,7 @@ name = "circuitboard (honey extractor)" build_path = /obj/machinery/honey_extractor board_type = "machine" - origin_tech = "{'biotech':2,'engineering':1}" + origin_tech = @'{"biotech":2,"engineering":1}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 2) @@ -64,7 +64,7 @@ name = "circuitboard (seed storage)" build_path = /obj/machinery/seed_storage board_type = "machine" - origin_tech = "{'biotech':2,'engineering':3}" + origin_tech = @'{"biotech":2,"engineering":3}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 2) @@ -77,24 +77,35 @@ /obj/item/stock_parts/circuitboard/seed_storage/advanced name = "circuitboard (seed storage (scientific))" build_path = /obj/machinery/seed_storage/xenobotany/buildable - origin_tech = "{'biotech':6,'engineering':3}" + origin_tech = @'{"biotech":6,"engineering":3}' /obj/item/stock_parts/circuitboard/washer name = "circuitboard (washing machine)" build_path = /obj/machinery/washing_machine board_type = "machine" - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/matter_bin = 1, /obj/item/pipe = 1) +/obj/item/stock_parts/circuitboard/autoclave + name = "circuitboard (autoclave)" + build_path = /obj/machinery/washing_machine/autoclave + board_type = "machine" + origin_tech = @'{"engineering":3, "biotech":2}' + req_components = list( + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/matter_bin = 2, + /obj/item/pipe = 1) + /obj/item/stock_parts/circuitboard/vending name = "circuitboard (vending machine)" build_path = /obj/machinery/vending/assist board_type = "machine" - origin_tech = "{'engineering':2}" + origin_tech = @'{"engineering":2}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1 @@ -117,7 +128,7 @@ name = "circuitboard (industrial grinder)" build_path = /obj/machinery/reagentgrinder board_type = "machine" - origin_tech = "{'magnets':2,'materials':4,'engineering':4}" + origin_tech = @'{"magnets":2,"materials":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 2) @@ -131,7 +142,7 @@ name = "circuitboard (blender)" build_path = /obj/machinery/reagentgrinder/juicer board_type = "machine" - origin_tech = "{'magnets':2,'materials':2,'engineering':2}" + origin_tech = @'{"magnets":2,"materials":2,"engineering":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/matter_bin = 1) @@ -145,7 +156,7 @@ name = "circuitboard (ice cream vat)" build_path = /obj/machinery/icecream_vat board_type = "machine" - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/pipe = 1 @@ -155,7 +166,7 @@ name = "circuitboard (smartfridge)" build_path = /obj/machinery/smartfridge board_type = "machine" - origin_tech = "{'engineering':3}" + origin_tech = @'{"engineering":3}' req_components = list( /obj/item/stock_parts/matter_bin = 3 ) @@ -173,7 +184,7 @@ name = "circuitboard (jukebox)" build_path = /obj/machinery/media/jukebox board_type = "machine" - origin_tech = "{'programming':5}" + origin_tech = @'{"programming":5}' req_components = list( /obj/item/stock_parts/subspace/amplifier = 2 ) @@ -191,6 +202,6 @@ name = "circuitboard (paper shredder)" build_path = /obj/machinery/papershredder board_type = "machine" - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' req_components = list(/obj/item/stock_parts/manipulator = 1) additional_spawn_components = null \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm b/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm index 053f4deedea..3bf3f65219e 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm @@ -2,7 +2,7 @@ name = "circuitboard (inertial damper)" board_type = "machine" build_path = /obj/machinery/inertial_damper - origin_tech = "{'engineering':5,'magnets':3}" + origin_tech = @'{"engineering":5,"magnets":3}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/micro_laser = 1) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm index 0322857c03f..b06b1c294a9 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm @@ -2,8 +2,8 @@ name = "circuitboard (mech recharger)" build_path = /obj/machinery/mech_recharger board_type = "machine" - origin_tech = "{'programming':2,'powerstorage':2,'engineering':2}" + origin_tech = @'{"programming":2,"powerstorage":2,"engineering":2}' req_components = list( /obj/item/stock_parts/capacitor = 2, /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/manipulator = 2) \ No newline at end of file + /obj/item/stock_parts/manipulator = 2) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/medical.dm b/code/game/objects/items/weapons/circuitboards/machinery/medical.dm index f75c3b5180b..a1ad9088df2 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/medical.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/medical.dm @@ -2,7 +2,7 @@ name = "circuitboard (operating table)" build_path = /obj/machinery/optable board_type = "machine" - origin_tech = "{'engineering':1,'biotech':3,'programming':3}" + origin_tech = @'{"engineering":1,"biotech":3,"programming":3}' req_components = list( /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/manipulator = 2, @@ -15,7 +15,7 @@ name = "circuitboard (body scanner)" build_path = /obj/machinery/bodyscanner board_type = "machine" - origin_tech = "{'engineering':2,'biotech':4,'programming':4}" + origin_tech = @'{"engineering":2,"biotech":4,"programming":4}' req_components = list( /obj/item/stock_parts/scanning_module = 2, /obj/item/stock_parts/manipulator = 2, @@ -28,7 +28,7 @@ name = "circuitboard (body scanner console)" build_path = /obj/machinery/body_scanconsole board_type = "machine" - origin_tech = "{'engineering':2,'biotech':4,'programming':4}" + origin_tech = @'{"engineering":2,"biotech":4,"programming":4}' req_components = list( /obj/item/stock_parts/console_screen = 1) additional_spawn_components = list( @@ -39,13 +39,13 @@ /obj/item/stock_parts/circuitboard/body_scanconsole/display name = "circuitboard (body scanner display)" build_path = /obj/machinery/body_scan_display - origin_tech = "{'biotech':2,'programming':2}" + origin_tech = @'{"biotech":2,"programming":2}' /obj/item/stock_parts/circuitboard/sleeper name = "circuitboard (sleeper)" build_path = /obj/machinery/sleeper board_type = "machine" - origin_tech = "{'engineering':3,'biotech':5,'programming':3}" + origin_tech = @'{"engineering":3,"biotech":5,"programming":3}' req_components = list ( /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/manipulator = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining.dm index 038faaa2e3f..77f454c521a 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mining.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mining.dm @@ -2,7 +2,7 @@ name = "circuitboard (electric smelter)" build_path = /obj/machinery/material_processing/smeltery board_type = "machine" - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 2 @@ -17,7 +17,7 @@ name = "circuitboard (material compressor)" build_path = /obj/machinery/material_processing/compressor board_type = "machine" - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 2 @@ -32,7 +32,7 @@ name = "circuitboard (ore unloading machine)" build_path = /obj/machinery/material_processing/unloader board_type = "machine" - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' req_components = list( /obj/item/stock_parts/manipulator = 2 ) @@ -46,7 +46,7 @@ name = "circuitboard (material stacking machine)" build_path = /obj/machinery/material_processing/stacker board_type = "machine" - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1 @@ -58,10 +58,10 @@ ) /obj/item/stock_parts/circuitboard/mining_extractor - name = "circuitboard (gas extractor)" - build_path = /obj/machinery/atmospherics/unary/material/extractor + name = "circuitboard (mineral extractor)" + build_path = /obj/machinery/material_processing/extractor board_type = "machine" - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm index 0c068fe4ac0..a625fb1edaf 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm @@ -2,7 +2,7 @@ name = "circuitboard (mining drill head)" build_path = /obj/machinery/mining/drill board_type = "machine" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/matter_bin = 1, @@ -10,12 +10,12 @@ additional_spawn_components = list( /obj/item/stock_parts/power/battery/buildable/stock, /obj/item/cell = 1 - ) + ) /obj/item/stock_parts/circuitboard/miningdrillbrace name = "circuitboard (mining drill brace)" build_path = /obj/machinery/mining/brace board_type = "machine" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list() additional_spawn_components = null \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/network.dm b/code/game/objects/items/weapons/circuitboards/machinery/network.dm index 2d0397c012e..df3da4c0ba1 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/network.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/network.dm @@ -2,20 +2,20 @@ name = "circuitboard (mainframe)" build_path = /obj/machinery/network/mainframe board_type = "machine" - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1, - /obj/item/stock_parts/computer/hard_drive/cluster/fullhouse + /obj/item/stock_parts/computer/hard_drive/cluster/empty = 1 ) /obj/item/stock_parts/circuitboard/acl name = "circuitboard (access controller)" build_path = /obj/machinery/network/acl board_type = "machine" - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, @@ -27,7 +27,7 @@ name = "circuitboard (router)" build_path = /obj/machinery/network/router board_type = "machine" - origin_tech = "{'programming':2,'magnets':3}" + origin_tech = @'{"programming":2,"magnets":3}' req_components = list( /obj/item/stock_parts/subspace/filter = 1, /obj/item/stock_parts/scanning_module = 1, @@ -48,7 +48,7 @@ name = "circuitboard (relay)" build_path = /obj/machinery/network/relay board_type = "machine" - origin_tech = "{'programming':2,'magnets':2}" + origin_tech = @'{"programming":2,"magnets":2}' req_components = list( /obj/item/stock_parts/subspace/filter = 1, /obj/item/stock_parts/micro_laser = 1, @@ -65,7 +65,7 @@ name = "circuitboard (modem)" build_path = /obj/machinery/network/modem board_type = "machine" - origin_tech = "{'programming':2,'magnets':2}" + origin_tech = @'{"programming":2,"magnets":2}' req_components = list( /obj/item/stock_parts/subspace/filter = 1, /obj/item/stock_parts/capacitor = 1, @@ -86,7 +86,7 @@ /obj/item/stock_parts/circuitboard/relay/long_range name = "circuitboard (long-ranged relay)" build_path = /obj/machinery/network/relay/long_range - origin_tech = "{'programming':4,'magnets':5,'wormholes':5}" + origin_tech = @'{"programming":4,"magnets":5,"wormholes":5}' req_components = list( /obj/item/stock_parts/subspace/ansible = 1, /obj/item/stock_parts/subspace/amplifier = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm index f69fa27d72f..adeb13066e2 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm @@ -2,7 +2,7 @@ name = "circuitboard (oxygen regenerator)" build_path = /obj/machinery/atmospherics/binary/oxyregenerator board_type = "machine" - origin_tech = "{'magnets':2,'engineering':2}" + origin_tech = @'{"magnets":2,"engineering":2}' req_components = list( /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/manipulator = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm index 478632e5a8b..00bb2359291 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm @@ -2,7 +2,7 @@ name = "circuitboard (portable generator)" build_path = /obj/machinery/port_gen/pacman board_type = "machine" - origin_tech = "{'programming':3,'powerstorage':3,'exoticmatter':3,'engineering':3}" + origin_tech = @'{"programming":3,"powerstorage":3,"exoticmatter":3,"engineering":3}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/micro_laser = 1, @@ -16,14 +16,14 @@ /obj/item/stock_parts/circuitboard/pacman/super name = "circuitboard (portable fission generator)" build_path = /obj/machinery/port_gen/pacman/super - origin_tech = "{'programming':3,'powerstorage':4,'engineering':4}" + origin_tech = @'{"programming":3,"powerstorage":4,"engineering":4}' /obj/item/stock_parts/circuitboard/pacman/super/potato name = "circuitboard (PTTO-3 nuclear generator)" build_path = /obj/machinery/port_gen/pacman/super/potato - origin_tech = "{'programming':3,'powerstorage':5,'engineering':4}" + origin_tech = @'{"programming":3,"powerstorage":5,"engineering":4}' /obj/item/stock_parts/circuitboard/pacman/mrs name = "circuitboard (portable fusion generator)" build_path = /obj/machinery/port_gen/pacman/mrs - origin_tech = "{'programming':3,'powerstorage':5,'engineering':5}" + origin_tech = @'{"programming":3,"powerstorage":5,"engineering":5}' diff --git a/code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm b/code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm index bafffc0d66f..bf95dcb67f2 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm @@ -2,7 +2,7 @@ name = "circuitboard (portable scrubber)" board_type = "machine" build_path = /obj/machinery/portable_atmospherics/powered/scrubber - origin_tech = "{'engineering':4,'powerstorage':4}" + origin_tech = @'{"engineering":4,"powerstorage":4}' req_components = list( /obj/item/stock_parts/capacitor = 2, /obj/item/stock_parts/matter_bin = 2, @@ -24,7 +24,7 @@ name = "circuitboard (large portable scrubber)" board_type = "machine" build_path = /obj/machinery/portable_atmospherics/powered/scrubber/huge - origin_tech = "{'engineering':5,'powerstorage':5,'materials':5}" + origin_tech = @'{"engineering":5,"powerstorage":5,"materials":5}' req_components = list( /obj/item/stock_parts/capacitor = 4, /obj/item/stock_parts/matter_bin = 2, @@ -39,7 +39,7 @@ name = "circuitboard (hydroponics tray)" board_type = "machine" build_path = /obj/machinery/portable_atmospherics/hydroponics - origin_tech = "{'biotech':3,'materials':2,'programming':1}" + origin_tech = @'{"biotech":3,"materials":2,"programming":1}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/chems/glass/beaker = 1, @@ -54,7 +54,7 @@ name = "circuitboard (emergency dehumidifier)" board_type = "machine" build_path = /obj/machinery/dehumidifier - origin_tech = "{'engineering':4,'powerstorage':4}" + origin_tech = @'{"engineering":4,"powerstorage":4}' req_components = list( /obj/item/stock_parts/capacitor = 2, /obj/item/stock_parts/matter_bin = 2, @@ -70,7 +70,7 @@ name = "circuitboard (space heater)" board_type = "machine" build_path = /obj/machinery/space_heater - origin_tech = "{'engineering':4,'powerstorage':4}" + origin_tech = @'{"engineering":4,"powerstorage":4}' req_components = list( /obj/item/stock_parts/capacitor = 2, /obj/item/stock_parts/matter_bin = 2) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm index 1c7cfd813f4..b580ee6ff64 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm @@ -2,7 +2,7 @@ name = "circuitboard (superconductive magnetic energy storage)" build_path = /obj/machinery/power/smes/buildable board_type = "machine" - origin_tech = "{'powerstorage':6,'engineering':4}" + origin_tech = @'{"powerstorage":6,"engineering":4}' req_components = list(/obj/item/stock_parts/smes_coil = 1, /obj/item/stack/cable_coil = 30) additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, @@ -14,7 +14,7 @@ name = "circuitboard (battery rack PSU)" build_path = /obj/machinery/power/smes/batteryrack board_type = "machine" - origin_tech = "{'powerstorage':3,'engineering':2}" + origin_tech = @'{"powerstorage":3,"engineering":2}' req_components = list(/obj/item/stock_parts/capacitor/ = 3, /obj/item/stock_parts/matter_bin/ = 1) additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, @@ -26,7 +26,7 @@ name = "circuitboard (recharger)" build_path = /obj/machinery/recharger board_type = "machine" - origin_tech = "{'powerstorage':2,'engineering':2}" + origin_tech = @'{"powerstorage":2,"engineering":2}' req_components = list( /obj/item/stock_parts/capacitor = 1 ) @@ -43,7 +43,7 @@ name = "circuitboard (cell charger)" build_path = /obj/machinery/cell_charger board_type = "machine" - origin_tech = "{'powerstorage':2,'engineering':2}" + origin_tech = @'{"powerstorage":2,"engineering":2}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/battery/buildable/turbo = 1, @@ -55,7 +55,7 @@ name = "circuitboard (small turbine)" build_path = /obj/machinery/atmospherics/pipeturbine board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 2 @@ -66,7 +66,7 @@ name = "circuitboard (small turbine motor)" build_path = /obj/machinery/turbinemotor board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/capacitor = 4 @@ -76,20 +76,20 @@ name = "circuitboard (large turbine compressor)" build_path = /obj/machinery/compressor board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 3, /obj/item/stock_parts/matter_bin = 3 ) additional_spawn_components = list( - /obj/item/stock_parts/power/apc/buildable = 1 + /obj/item/stock_parts/power/apc/buildable = 1 ) /obj/item/stock_parts/circuitboard/big_turbine/center name = "circuitboard (large turbine motor)" build_path = /obj/machinery/turbine board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/capacitor = 4 @@ -104,20 +104,20 @@ name = "circuitboard (thermoelectric generator turbine)" build_path = /obj/machinery/atmospherics/binary/circulator board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 3, /obj/item/stock_parts/matter_bin = 3 ) additional_spawn_components = list( - /obj/item/stock_parts/power/apc/buildable = 1 + /obj/item/stock_parts/power/apc/buildable = 1 ) /obj/item/stock_parts/circuitboard/teg_turbine/motor name = "circuitboard (thermoelectric generator motor)" build_path = /obj/machinery/generator board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/capacitor = 4 @@ -132,7 +132,7 @@ name = "circuitboard (breaker box)" build_path = /obj/machinery/power/breakerbox board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/capacitor = 2 @@ -147,7 +147,7 @@ name = "circuitboard (fuel compressor)" build_path = /obj/machinery/fuel_compressor board_type = "machine" - origin_tech = "{'powerstorage':2,'engineering':3,'materials':3}" + origin_tech = @'{"powerstorage":2,"engineering":3,"materials":3}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin/super = 2, @@ -159,7 +159,7 @@ name = "circuit board (stirling engine)" build_path = /obj/machinery/atmospherics/binary/stirling board_type = "machine" - origin_tech = "{'engineering':2,'powerstorage':1}" + origin_tech = @'{"engineering":2,"powerstorage":1}' req_components = list( /obj/item/stack/cable_coil = 20, /obj/item/stock_parts/matter_bin = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm index 29cd5ef5e43..e06fee8ccca 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm @@ -2,7 +2,7 @@ name = "circuitboard (cyborg recharging station)" build_path = /obj/machinery/recharge_station board_type = "machine" - origin_tech = "{'programming':3,'engineering':3}" + origin_tech = @'{"programming":3,"engineering":3}' req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stock_parts/capacitor = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 1d820de80f3..fe6ee981ad3 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -2,7 +2,7 @@ name = "circuitboard (destructive analyzer)" build_path = /obj/machinery/destructive_analyzer board_type = "machine" - origin_tech = "{'magnets':2,'engineering':2,'programming':2}" + origin_tech = @'{"magnets":2,"engineering":2,"programming":2}' req_components = list( /obj/item/stock_parts/scanning_module = 1, /obj/item/stock_parts/manipulator = 1, @@ -15,7 +15,7 @@ name = "circuitboard (autolathe)" build_path = /obj/machinery/fabricator board_type = "machine" - origin_tech = "{'engineering':2,'programming':2}" + origin_tech = @'{"engineering":2,"programming":2}' req_components = list( /obj/item/stock_parts/matter_bin = 3, /obj/item/stock_parts/manipulator = 1) @@ -28,7 +28,7 @@ /obj/item/stock_parts/circuitboard/autolathe/micro name = "circuitboard (microlathe)" build_path = /obj/machinery/fabricator/micro - origin_tech = "{'engineering':1,'programming':1}" + origin_tech = @'{"engineering":1,"programming":1}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1 @@ -36,7 +36,7 @@ /obj/item/stock_parts/circuitboard/autolathe/book name = "circuitboard (autobinder)" build_path = /obj/machinery/fabricator/book - origin_tech = "{'engineering':1,'programming':1}" + origin_tech = @'{"engineering":1,"programming":1}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1 @@ -45,7 +45,7 @@ name = "circuitboard (replicator)" build_path = /obj/machinery/fabricator/replicator board_type = "machine" - origin_tech = "{'engineering':3,'programming':2,'biotech':2}" + origin_tech = @'{"engineering":3,"programming":2,"biotech":2}' req_components = list( /obj/item/stock_parts/matter_bin = 3, /obj/item/stock_parts/manipulator = 1) @@ -59,7 +59,7 @@ name = "circuitboard (protolathe)" build_path = /obj/machinery/fabricator/protolathe board_type = "machine" - origin_tech = "{'engineering':2,'programming':2}" + origin_tech = @'{"engineering":2,"programming":2}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 2, @@ -74,7 +74,7 @@ name = "circuitboard (circuit imprinter)" build_path = /obj/machinery/fabricator/imprinter board_type = "machine" - origin_tech = "{'engineering':2,'programming':2}" + origin_tech = @'{"engineering":2,"programming":2}' req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1, @@ -89,7 +89,7 @@ name = "circuitboard (industrial fabricator)" build_path = /obj/machinery/fabricator/industrial board_type = "machine" - origin_tech = "{'programming':3,'engineering':3}" + origin_tech = @'{"programming":3,"engineering":3}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, @@ -104,7 +104,7 @@ name = "circuitboard (robotics fabricator)" build_path = /obj/machinery/fabricator/robotics board_type = "machine" - origin_tech = "{'programming':3,'engineering':3}" + origin_tech = @'{"programming":3,"engineering":3}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, @@ -119,7 +119,7 @@ name = "circuitboard (textiles fabricator)" build_path = /obj/machinery/fabricator/textile board_type = "machine" - origin_tech = "{'programming':3,'engineering':3}" + origin_tech = @'{"programming":3,"engineering":3}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, @@ -134,7 +134,7 @@ name = "circuitboard (suspension generator)" build_path = /obj/machinery/suspension_gen board_type = "machine" - origin_tech = "{'programming':4,'engineering':3,'magnets':4}" + origin_tech = @'{"programming":4,"engineering":3,"magnets":4}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, @@ -151,7 +151,7 @@ name = "circuitboard (artifact harvester)" build_path = /obj/machinery/artifact_harvester board_type = "machine" - origin_tech = "{'programming':4,'engineering':3}" + origin_tech = @'{"programming":4,"engineering":3}' req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, @@ -166,7 +166,7 @@ name = "circuitboard (artifact analyser)" build_path = /obj/machinery/artifact_analyser board_type = "machine" - origin_tech = "{'programming':4,'engineering':3}" + origin_tech = @'{"programming":4,"engineering":3}' req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/micro_laser = 2) @@ -180,7 +180,7 @@ name = "circuitboard (artifact scanpad)" build_path = /obj/machinery/artifact_scanpad board_type = "machine" - origin_tech = "{'programming':2,'engineering':2,'magnets':2}" + origin_tech = @'{"programming":2,"engineering":2,"magnets":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 1) @@ -192,7 +192,7 @@ name = "circuitboard (cryo pod)" build_path = /obj/machinery/cryopod board_type = "machine" - origin_tech = "{'programming':6,'engineering':6,'wormholes':6}" + origin_tech = @'{"programming":6,"engineering":6,"wormholes":6}' req_components = list( /obj/item/stock_parts/matter_bin = 4, /obj/item/stock_parts/manipulator = 1, @@ -212,7 +212,7 @@ name = "circuitboard (merchant pad)" build_path = /obj/machinery/merchant_pad board_type = "machine" - origin_tech = "{'programming':6,'wormholes':6,'esoteric':1}" + origin_tech = @'{"programming":6,"wormholes":6,"esoteric":1}' req_components = list(/obj/item/stack/cable_coil = 15) req_components = list( /obj/item/stock_parts/subspace/amplifier = 1, @@ -229,7 +229,7 @@ name = "circuitboard (radiocarbon spectrometer)" build_path = /obj/machinery/radiocarbon_spectrometer board_type = "machine" - origin_tech = "{'programming':2,'engineering':2,'magnets':2}" + origin_tech = @'{"programming":2,"engineering":2,"magnets":2}' req_components = list( /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 2, @@ -245,7 +245,7 @@ name = "circuitboard (design database)" build_path = /obj/machinery/design_database board_type = "machine" - origin_tech = "{'programming':2, 'engineering':2}" + origin_tech = @'{"programming":2, "engineering":2}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm b/code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm index f0e849ed5cd..4c2ba1eecf3 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm @@ -2,7 +2,7 @@ name = "circuitboard (nuclear cylinder storage)" build_path = /obj/machinery/nuclear_cylinder_storage/buildable board_type = "machine" - origin_tech = "{'combat':2,'engineering':2}" + origin_tech = @'{"combat":2,"engineering":2}' req_components = list( /obj/item/stack/cable_coil = 10, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm index a89768cdb25..c8e91741760 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm @@ -3,7 +3,7 @@ name = "circuitboard (advanced shield generator)" board_type = "machine" build_path = /obj/machinery/shield_generator - origin_tech = "{'magnets':3,'powerstorage':4}" + origin_tech = @'{"magnets":3,"powerstorage":4}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/micro_laser = 1, @@ -18,7 +18,7 @@ name = "circuitboard (shield diffuser)" board_type = "machine" build_path = /obj/machinery/shield_diffuser - origin_tech = "{'magnets':4,'powerstorage':2}" + origin_tech = @'{"magnets":4,"powerstorage":2}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/micro_laser = 1) @@ -33,12 +33,12 @@ board_type = "machine" desc = "Control systems for a Kuiper pattern point defense battery. Aim away from vessel." build_path = /obj/machinery/pointdefense - origin_tech = "{'engineering':3,'combat':2}" + origin_tech = @'{"engineering":3,"combat":2}' req_components = list( /obj/item/mech_equipment/mounted_system/taser/laser = 1, /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/capacitor = 2, - + ) additional_spawn_components = list( /obj/item/stock_parts/power/terminal/buildable = 1, @@ -51,4 +51,4 @@ board_type = "machine" desc = "A control computer to synchronize point defense batteries." build_path = /obj/machinery/pointdefense_control - origin_tech = "{'engineering':3,'combat':2}" \ No newline at end of file + origin_tech = @'{"engineering":3,"combat":2}' \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm b/code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm index a3df680001e..e19b4b57f07 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm @@ -2,7 +2,7 @@ name = "circuitboard (ship sensors)" build_path = /obj/machinery/shipsensors board_type = "machine" - origin_tech = "{'wormholes':2,'programming':2}" + origin_tech = @'{"wormholes":2,"programming":2}' req_components = list( /obj/item/stack/cable_coil = 30, /obj/item/stock_parts/manipulator = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm index a03313afe5b..d7b14d341c7 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm @@ -8,7 +8,7 @@ /obj/item/stock_parts/computer/network_card = 1 ) build_path = /obj/machinery/network/message_server - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' req_components = list( /obj/item/stock_parts/subspace/ansible = 1, /obj/item/stock_parts/subspace/filter = 1, @@ -26,7 +26,7 @@ /obj/item/stock_parts/computer/network_card = 1 ) build_path = /obj/machinery/network/telecomms_hub - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' req_components = list( /obj/item/stock_parts/subspace/ansible = 1, /obj/item/stock_parts/subspace/filter = 1, @@ -41,7 +41,7 @@ /obj/item/stock_parts/power/apc/buildable = 1 ) build_path = /obj/machinery/shipcomms/broadcaster - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' req_components = list( /obj/item/stack/cable_coil = 20, /obj/item/stock_parts/micro_laser/ultra = 5 @@ -54,7 +54,7 @@ /obj/item/stock_parts/power/apc/buildable = 1 ) build_path = /obj/machinery/shipcomms/receiver - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' req_components = list( /obj/item/stack/cable_coil = 20, /obj/item/stock_parts/subspace/filter = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm index 7f49b5364a6..bf81f6b51ee 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm @@ -12,7 +12,7 @@ /obj/item/stock_parts/circuitboard/unary_atmos/heater name = "circuitboard (gas heating system)" build_path = /obj/machinery/atmospherics/unary/heater - origin_tech = "{'powerstorage':2,'engineering':1}" + origin_tech = @'{"powerstorage":2,"engineering":1}' req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stock_parts/matter_bin = 1, @@ -21,7 +21,7 @@ /obj/item/stock_parts/circuitboard/unary_atmos/cooler name = "circuitboard (gas cooling system)" build_path = /obj/machinery/atmospherics/unary/freezer - origin_tech = "{'magnets':2,'engineering':2}" + origin_tech = @'{"magnets":2,"engineering":2}' req_components = list( /obj/item/stack/cable_coil = 2, /obj/item/stock_parts/matter_bin = 1, diff --git a/code/game/objects/items/weapons/circuitboards/other.dm b/code/game/objects/items/weapons/circuitboards/other.dm index eaa604688eb..d440f6ce30c 100644 --- a/code/game/objects/items/weapons/circuitboards/other.dm +++ b/code/game/objects/items/weapons/circuitboards/other.dm @@ -2,5 +2,5 @@ /obj/item/stock_parts/circuitboard/aicore name = "circuitboard (AI core)" - origin_tech = "{'programming':4,'biotech':2}" + origin_tech = @'{"programming":4,"biotech":2}' board_type = "other" diff --git a/code/game/objects/items/weapons/circuitboards/wall.dm b/code/game/objects/items/weapons/circuitboards/wall.dm index cb60ba671dc..6aab1dd838e 100644 --- a/code/game/objects/items/weapons/circuitboards/wall.dm +++ b/code/game/objects/items/weapons/circuitboards/wall.dm @@ -7,7 +7,7 @@ desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\"." build_path = /obj/machinery/firealarm board_type = "wall" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list() additional_spawn_components = null @@ -17,7 +17,7 @@ icon_state = "door_electronics" build_path = /obj/machinery/alarm board_type = "wall" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list() additional_spawn_components = null @@ -31,7 +31,7 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE build_path = /obj/machinery/power/apc/buildable board_type = "wall" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, @@ -45,7 +45,7 @@ name = "circuitboard (requests console)" build_path = /obj/machinery/network/requests_console board_type = "wall" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, @@ -65,7 +65,7 @@ name = "circuitboard (airlock controller)" build_path = /obj/machinery/embedded_controller/radio/simple_docking_controller board_type = "wall" - origin_tech = "{'programming':3,'engineering':3}" + origin_tech = @'{"programming":3,"engineering":3}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, @@ -86,7 +86,7 @@ name = "circuitboard (camera)" build_path = /obj/machinery/camera board_type = "wall" - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, diff --git a/code/game/objects/items/weapons/clothingbag.dm b/code/game/objects/items/weapons/clothingbag.dm index aa2b9f99ffe..80b44fc27a6 100644 --- a/code/game/objects/items/weapons/clothingbag.dm +++ b/code/game/objects/items/weapons/clothingbag.dm @@ -3,7 +3,7 @@ desc = "A cheap plastic bag that contains a fresh set of clothes." icon = 'icons/obj/items/storage/trashbag.dmi' icon_state = "trashbag3" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/icon_used = "trashbag0" var/opened = 0 diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 628d5c6925c..073d179b3ce 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -8,9 +8,11 @@ * Banana Peals */ /obj/item/bananapeel/Crossed(var/atom/movable/AM) - if (isliving(AM)) - var/mob/living/M = AM - M.slip("the [src.name]", 4) + if(!isliving(AM)) + return + var/mob/living/M = AM + M.slip("the [src.name]", 4) + /* * Bike Horns */ @@ -18,8 +20,7 @@ name = "bike horn" desc = "A horn off of a bicycle." icon = 'icons/obj/items/horn.dmi' - icon_state = "bike_horn" - item_state = "bike_horn" + icon_state = ICON_STATE_WORLD throwforce = 3 w_class = ITEM_SIZE_SMALL throw_speed = 3 @@ -27,7 +28,7 @@ attack_verb = list("HONKED") material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) obj_flags = OBJ_FLAG_HOLLOW var/spam_flag = 0 @@ -45,8 +46,7 @@ /obj/item/bikehorn/airhorn name = "air horn" desc = "A can of compressed air hooked up to an obnoxiously loud horn. SPRING BREAK!" - icon_state = "air_horn" - item_state = "air_horn" + icon = 'icons/obj/items/air_horn.dmi' audio_files = list("sound/items/air_horn_1.ogg", "sound/items/air_horn_2.ogg") material = /decl/material/solid/metal/aluminium obj_flags = OBJ_FLAG_HOLLOW \ No newline at end of file diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 2715eacd057..1cd5744c816 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -8,7 +8,7 @@ w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS color = "#e00606" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/color_desc = "ruby" var/open = FALSE @@ -40,37 +40,49 @@ update_icon() /obj/item/lipstick/attack(atom/A, mob/user, target_zone) - if(!open) return - - if(ishuman(A)) - var/mob/living/carbon/human/H = A - var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD, /obj/item/organ/external/head) - - if(!head) - return - - if(user.a_intent == I_HELP && target_zone == BP_HEAD) - head.write_on(user, src.name) - else if(head.has_lips) - if(H.lip_style) //if they already have lipstick on - to_chat(user, "You need to wipe off the old lipstick first!") - return - if(H == user) - user.visible_message("[user] does their lips with \the [src].", \ - "You take a moment to apply \the [src]. Perfect!") - H.lip_style = color - H.update_body() - else - user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ - "You begin to apply \the [src].") - if(do_after(user, 20, H) && do_after(H, 20, check_holding = 0, progress = 0, incapacitation_flags = INCAPACITATION_NONE)) //user needs to keep their active hand, H does not. - user.visible_message("[user] does [H]'s lips with \the [src].", \ - "You apply \the [src].") - H.lip_style = color - H.update_body() - else if(istype(A, /obj/item/organ/external/head)) + if(!open || !ishuman(A)) + return ..() + + if(istype(A, /obj/item/organ/external/head)) var/obj/item/organ/external/head/head = A head.write_on(user, src) + return TRUE + + var/obj/item/organ/external/head/head = user.get_organ(BP_HEAD, /obj/item/organ/external/head) + if(!head) + return ..() + + if(user.a_intent == I_HELP && target_zone == BP_HEAD) + head.write_on(user, src.name) + return TRUE + + if(!head.has_lips || !isliving(user)) + return ..() + + var/mob/living/user_living = user + if(user_living.get_lip_colour()) //if they already have lipstick on + to_chat(user, SPAN_WARNING("You need to wipe off the old lipstick first!")) + return TRUE + + if(user == user) + user.visible_message( + SPAN_NOTICE("\The [user] does their lips with \the [src]."), + SPAN_NOTICE("You take a moment to apply \the [src]. Perfect!") + ) + user_living.set_lip_colour(color) + return TRUE + + user.visible_message( + SPAN_NOTICE("\The [user] begins to do \the [user]'s lips with \the [src]."), + SPAN_NOTICE("You begin to apply \the [src].") + ) + if(do_after(user, 2 SECONDS, user) && do_after(user, 2 SECONDS, check_holding = 0, progress = 0, incapacitation_flags = INCAPACITATION_NONE)) //user needs to keep their active hand, H does not. + user.visible_message( + SPAN_NOTICE("\The [user] does \the [user]'s lips with \the [src]."), + SPAN_NOTICE("You apply \the [src].") + ) + user_living.set_lip_colour(color) + return TRUE //types /obj/item/lipstick/yellow diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index d29effbd3b5..7aef0369e8a 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -11,9 +11,9 @@ force = 5 throwforce = 6 w_class = ITEM_SIZE_LARGE - origin_tech = "{'biotech':4,'powerstorage':2}" + origin_tech = @'{"biotech":4,"powerstorage":2}' action_button_name = "Remove/Replace Paddles" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, @@ -73,16 +73,6 @@ toggle_paddles() return TRUE -// what is this proc doing? -/obj/item/defibrillator/handle_mouse_drop(var/atom/over, var/mob/user) - if(ismob(loc)) - var/mob/M = loc - if(M.try_unequip(src)) - add_fingerprint(usr) - M.put_in_hands(src) - return TRUE - . = ..() - /obj/item/defibrillator/attackby(obj/item/W, mob/user, params) if(W == paddles) reattach_paddles(user) @@ -173,7 +163,7 @@ icon = 'icons/obj/defibrillator_compact.dmi' w_class = ITEM_SIZE_NORMAL slot_flags = SLOT_LOWER_BODY - origin_tech = "{'biotech':5,'powerstorage':3}" + origin_tech = @'{"biotech":5,"powerstorage":3}' /obj/item/defibrillator/compact/loaded bcell = /obj/item/cell/high @@ -202,7 +192,7 @@ force = 2 throwforce = 6 w_class = ITEM_SIZE_LARGE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/copper = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY) max_health = ITEM_HEALTH_NO_DAMAGE @@ -445,14 +435,13 @@ M.switch_from_dead_to_living_mob_list() M.timeofdeath = 0 - M.set_stat(UNCONSCIOUS) //Life() can bring them back to consciousness if it needs to. - M.refresh_visible_overlays() + M.set_stat(UNCONSCIOUS) + M.try_refresh_visible_overlays() M.failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. M.reload_fullscreen() M.emote("gasp") SET_STATUS_MAX(M, STAT_WEAK, rand(10,25)) - M.updatehealth() apply_brain_damage(M, deadtime) /obj/item/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H, var/deadtime) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 3bb00a49499..6c1f32839b5 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -6,7 +6,7 @@ w_class = ITEM_SIZE_TINY var/sides = 6 attack_verb = list("diced") - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/dice/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 79067d5f1f0..3730c94695a 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -7,26 +7,25 @@ attack_verb = list("attacked", "poked", "battered") body_parts_covered = 0 chem_volume = 0 //ecig has no storage on its own but has reagent container created by parent obj - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/brightness_on = 1 - var/obj/item/cell/cigcell var/cartridge_type = /obj/item/chems/ecig_cartridge/med_nicotine var/obj/item/chems/ecig_cartridge/ec_cartridge - var/cell_type = /obj/item/cell/device/standard var/power_usage = 450 //value for simple ecig, enough for about 1 cartridge, in JOULES! var/ecig_colors = list(null, COLOR_DARK_GRAY, COLOR_RED_GRAY, COLOR_BLUE_GRAY, COLOR_GREEN_GRAY, COLOR_PURPLE_GRAY) var/idle = 0 var/idle_treshold = 30 /obj/item/clothing/mask/smokable/ecig/Initialize() - if(ispath(cell_type)) - cigcell = new cell_type + setup_power_supply() ec_cartridge = new cartridge_type(src) . = ..() -/obj/item/clothing/mask/smokable/ecig/get_cell() - return cigcell +/obj/item/clothing/mask/smokable/ecig/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell/device/standard + accepted_cell_type = accepted_cell_type || /obj/item/cell/device + return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) /obj/item/clothing/mask/smokable/ecig/simple name = "cheap electronic cigarette" @@ -43,7 +42,10 @@ /obj/item/clothing/mask/smokable/ecig/util name = "electronic cigarette" desc = "A popular utilitarian model electronic cigarette, the ONI-55. Comes in a variety of colors." - cell_type = /obj/item/cell/device/high //enough for four cartridges + +/obj/item/clothing/mask/smokable/ecig/util/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell/device/high + return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) //enough for four cartridges /obj/item/clothing/mask/smokable/ecig/util/Initialize() . = ..() @@ -55,16 +57,15 @@ to_chat(user,SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.")) else to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) - if(cigcell) - to_chat(user,SPAN_NOTICE("The power meter shows that there's about [round(cigcell.percent(), 25)]% power remaining.")) - else - to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) /obj/item/clothing/mask/smokable/ecig/deluxe name = "deluxe electronic cigarette" desc = "A premium model eGavana MK3 electronic cigarette, shaped like a cigar." icon = 'icons/clothing/mask/smokables/cigarette_electronic_deluxe.dmi' - cell_type = /obj/item/cell/device/high //enough for four catridges + +/obj/item/clothing/mask/smokable/ecig/deluxe/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell/device/high + return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) //enough for four cartridges /obj/item/clothing/mask/smokable/ecig/deluxe/examine(mob/user) . = ..() @@ -72,18 +73,14 @@ to_chat(user,SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.")) else to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) - if(cigcell) - to_chat(user,SPAN_NOTICE("The power meter shows that there's about [round(cigcell.percent(), 1)]% power remaining.")) - else - to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) /obj/item/clothing/mask/smokable/ecig/proc/Deactivate() - lit = 0 + lit = FALSE STOP_PROCESSING(SSobj, src) update_icon() /obj/item/clothing/mask/smokable/ecig/Process() - if(!cigcell) + if(!get_cell()) Deactivate() return if(!ec_cartridge) @@ -110,7 +107,8 @@ if (src == C.get_equipped_item(slot_wear_mask_str) && C.check_has_mouth()) //transfer, but only when not disabled idle = 0 //here we'll reduce battery by usage, and check powerlevel - you only use batery while smoking - if(!cigcell.checked_use(power_usage * CELLRATE)) //if this passes, there's not enough power in the battery + var/obj/item/cell/cell = get_cell() + if(!cell?.checked_use(power_usage * CELLRATE)) //if this passes, there's not enough power in the battery Deactivate() to_chat(C,SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and shuts down.")) return @@ -137,39 +135,23 @@ ec_cartridge = I update_icon() to_chat(user, SPAN_NOTICE("You insert \the [I] into \the [src].")) - - if(IS_SCREWDRIVER(I)) - if(cigcell) //if contains powercell - cigcell.update_icon() - cigcell.dropInto(loc) - cigcell = null - to_chat(user, SPAN_NOTICE("You remove \the [cigcell] from \the [src].")) - else //does not contains cell - to_chat(user, SPAN_NOTICE("There's no battery in \the [src].")) - - if(istype(I, /obj/item/cell/device)) - if(!cigcell && user.try_unequip(I)) - I.forceMove(src) - cigcell = I - to_chat(user, SPAN_NOTICE("You install \the [cigcell] into \the [src].")) - update_icon() - else - to_chat(user, SPAN_NOTICE("\The [src] already has a battery installed.")) - + return TRUE + return ..() /obj/item/clothing/mask/smokable/ecig/attack_self(mob/user) if(lit) Deactivate() to_chat(user, SPAN_NOTICE("You turn off \the [src].")) else - if(cigcell) + var/obj/item/cell/cell = get_cell() + if(cell) if (!ec_cartridge) to_chat(user, SPAN_NOTICE("You can't use \the [src] with no cartridge installed!")) return else if(!ec_cartridge.reagents.total_volume) to_chat(user, SPAN_NOTICE("You can't use \the [src] with no liquid left!")) return - else if(!cigcell.check_charge(power_usage * CELLRATE)) + else if(!cell.check_charge(power_usage * CELLRATE)) to_chat(user, SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and refuses to operate.")) return lit = TRUE @@ -199,7 +181,7 @@ material = /decl/material/solid/metal/aluminium matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) volume = 20 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER /obj/item/chems/ecig_cartridge/examine(mob/user)//to see how much left . = ..() diff --git a/code/game/objects/items/weapons/electric_welder.dm b/code/game/objects/items/weapons/electric_welder.dm index 056bba61579..8bc0a292070 100644 --- a/code/game/objects/items/weapons/electric_welder.dm +++ b/code/game/objects/items/weapons/electric_welder.dm @@ -8,32 +8,33 @@ force = 7 throwforce = 7 lit_colour = COLOR_CYAN_BLUE - var/obj/item/cell/cell = /obj/item/cell/high var/fuel_cost_multiplier = 10 /obj/item/weldingtool/electric/Initialize() - if(ispath(cell)) - cell = new cell(src) + setup_power_supply() . = ..() +/obj/item/weldingtool/electric/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell/high + return ..(loaded_cell_type, /obj/item/cell, /datum/extension/loaded_cell, charge_value) + /obj/item/weldingtool/electric/examine(mob/user, distance) . = ..() - if (!cell) + var/obj/item/cell/cell = get_cell() + if(!cell) to_chat(user, "There is no [welding_resource] source attached.") else to_chat(user, (distance == 0 ? "It has [get_fuel()] [welding_resource] remaining. " : "") + "[cell] is attached.") /obj/item/weldingtool/electric/afterattack(var/obj/O, var/mob/user, var/proximity) - if(proximity && istype(O, /obj/structure/reagent_dispensers/fueltank)) - if(!welding) - to_chat(user, SPAN_WARNING("\The [src] runs on an internal charge and does not need to be refuelled.")) + if(proximity && istype(O, /obj/structure/reagent_dispensers/fueltank) && !welding) + to_chat(user, SPAN_WARNING("\The [src] runs on an internal charge and does not need to be refuelled.")) return . = ..() /obj/item/weldingtool/electric/get_cell() - if(cell) - . = cell - else if(istype(loc, /obj/item/rig_module)) + . = ..() + if(!. && istype(loc, /obj/item/rig_module)) var/obj/item/rig_module/module = loc if(istype(module.holder)) . = module.holder.get_cell() @@ -45,27 +46,7 @@ /obj/item/weldingtool/electric/attackby(var/obj/item/W, var/mob/user) if(istype(W,/obj/item/stack/material/rods) || istype(W, /obj/item/chems/welder_tank)) return - if(IS_SCREWDRIVER(W)) - if(cell) - cell.dropInto(get_turf(src)) - user.put_in_hands(cell) - to_chat(user, SPAN_NOTICE("You pop \the [cell] out of \the [src].")) - welding = FALSE - cell = null - update_icon() - else - to_chat(user, SPAN_WARNING("\The [src] has no cell installed.")) - return - else if(istype(W, /obj/item/cell)) - if(cell) - to_chat(user, SPAN_WARNING("\The [src] already has a cell installed.")) - else if(user.try_unequip(W)) - cell = W - cell.forceMove(src) - to_chat(user, SPAN_NOTICE("You slot \the [cell] into \the [src].")) - update_icon() - return - . = ..() + return ..() /obj/item/weldingtool/electric/use_fuel(var/amount) var/obj/item/cell/cell = get_cell() @@ -75,5 +56,5 @@ /obj/item/weldingtool/electric/on_update_icon() . = ..() - if(cell) + if(get_cell()) add_overlay("[icon_state]-cell") diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 5453f0795f6..b6862064296 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -7,8 +7,8 @@ item_state = "plasticx" item_flags = ITEM_FLAG_NO_BLUDGEON w_class = ITEM_SIZE_SMALL - origin_tech = "{'esoteric':2}" - material = /decl/material/solid/plastic + origin_tech = @'{"esoteric":2}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/silicon = MATTER_AMOUNT_TRACE, /decl/material/liquid/anfo = MATTER_AMOUNT_REINFORCEMENT, //#TODO: Slap RDX in here diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 49a2607ec21..60dc1686377 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -14,7 +14,7 @@ throwforce = 10 force = 10 material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") possible_transfer_amounts = @"[30,60,120]" //units of liquid per spray - 120 -> same as splashing them with a bucket per spray possible_particle_amounts = @"[1,2,3]" //Amount of chempuff particles to spawn on spray @@ -41,7 +41,7 @@ amount_per_transfer_from_this = 80 spray_particles = 2 volume = 1000 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE, /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT @@ -62,7 +62,7 @@ if(!.) return if(user.buckled && isobj(user.buckled)) - addtimer(CALLBACK(src, .proc/propel_object, user.buckled, user, get_dir(A, user)), 0) + addtimer(CALLBACK(src, PROC_REF(propel_object), user.buckled, user, get_dir(A, user)), 0) else if(!user.check_space_footing()) var/old_dir = user.dir step(user, get_dir(A, user)) diff --git a/code/game/objects/items/weapons/flame.dm b/code/game/objects/items/weapons/flame.dm index 26342cc7474..e6e38990240 100644 --- a/code/game/objects/items/weapons/flame.dm +++ b/code/game/objects/items/weapons/flame.dm @@ -2,17 +2,13 @@ /obj/item/flame var/lit_heat = 1000 var/waterproof = FALSE - var/lit = 0 - material = /decl/material/solid/wood - -/obj/item/flame/afterattack(var/obj/O, var/mob/user, proximity) - ..() - if(proximity && lit && istype(O)) - O.HandleObjectHeating(src, user, 700) + var/lit = FALSE + material = /decl/material/solid/organic/wood /obj/item/flame/proc/extinguish(var/mob/user, var/no_message) - lit = 0 + lit = FALSE damtype = BRUTE + update_force() STOP_PROCESSING(SSobj, src) /obj/item/flame/fluid_act(var/datum/reagents/fluids) @@ -23,6 +19,14 @@ location.hotspot_expose(700, 5) // Potentially set fire to fuel etc. extinguish(no_message = TRUE) +/obj/item/flame/proc/light(mob/user, no_message) + if(lit) + return + lit = TRUE + damtype = BURN + update_force() + update_icon() + /obj/item/flame/get_heat() . = max(..(), lit ? lit_heat : 0) @@ -39,11 +43,21 @@ icon_state = ICON_STATE_WORLD var/burnt = 0 var/smoketime = 5 + obj_flags = OBJ_FLAG_HOLLOW // so that it's not super overpriced compared to lighters w_class = ITEM_SIZE_TINY - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' slot_flags = SLOT_EARS attack_verb = list("burnt", "singed") randpixel = 10 + max_force = 1 + +/obj/item/flame/match/light(mob/user, no_message) + if(burnt) + return + if(lit) + return + . = ..() + START_PROCESSING(SSobj, src) /obj/item/flame/match/Process() if(isliving(loc)) @@ -67,12 +81,13 @@ extinguish() return ..() -/obj/item/flame/match/extinguish(var/mob/user, var/no_message) +/obj/item/flame/match/extinguish(var/mob/user, var/no_message, var/burn = TRUE) . = ..() - name = "burnt match" - desc = "A match. This one has seen better days." - burnt = 1 - update_icon() + if(burn) + name = "burnt match" + desc = "A match. This one has seen better days." + burnt = TRUE + update_icon() /obj/item/flame/match/on_update_icon() . = ..() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 0722e0ad202..ba65dd2daaf 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -13,7 +13,7 @@ throw_range = 5 w_class = ITEM_SIZE_LARGE - origin_tech = "{'combat':1}" + origin_tech = @'{"combat":1}' material = /decl/material/solid/metal/steel var/fire_sound @@ -294,13 +294,11 @@ /obj/item/flamethrower/proc/ignite_turf(turf/target) var/datum/gas_mixture/air_transfer = tank.air_contents.remove_ratio(0.02 * (throw_amount / 100)) - - target.add_fluid(/decl/material/liquid/fuel, air_transfer.get_by_flag(XGM_GAS_FUEL)) - + target.add_fluid(/decl/material/liquid/fuel, air_transfer.get_by_flag(XGM_GAS_FUEL) * REAGENT_UNITS_PER_GAS_MOLE * 2) air_transfer.remove_by_flag(XGM_GAS_FUEL, 0) target.assume_air(air_transfer) - target.hotspot_expose((tank.air_contents.temperature * 2) + 400, 500) - + target.create_fire(tank.air_contents.temperature * 2 + 400) + target.hotspot_expose(1000, 100) for(var/mob/living/M in target) M.IgniteMob(1) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index aa8bef4b56a..60f143263b9 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -14,7 +14,7 @@ icon_state = "gift" item_state = "gift" randpixel = 10 - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard /obj/item/a_gift/Initialize() . = ..() @@ -63,12 +63,13 @@ /obj/random/lipstick, /obj/item/grenade/smokebomb, /obj/item/corncob, - /obj/item/contraband/poster, + /obj/item/poster, /obj/item/book/manual/barman_recipes, /obj/item/book/manual/chef_recipes, /obj/item/bikehorn, - /obj/item/beach_ball, - /obj/item/beach_ball/holoball, + /obj/item/ball, + /obj/item/ball/basketball, + /obj/item/ball/volleyball, /obj/item/chems/water_balloon, /obj/item/toy/blink, /obj/item/gun/launcher/foam/crossbow, diff --git a/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm index 15a12fa7460..aacd2931091 100644 --- a/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm +++ b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm @@ -3,7 +3,7 @@ name = "photon disruption grenade" icon = 'icons/obj/items/grenades/grenade_light.dmi' det_time = 20 - origin_tech = "{'wormholes':4,'materials':4}" + origin_tech = @'{"wormholes":4,"materials":4}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, @@ -13,7 +13,7 @@ /obj/item/grenade/anti_photon/detonate() playsound(src.loc, 'sound/effects/phasein.ogg', 50, 1, 5) set_light(10, -10, "#ffffff") - addtimer(CALLBACK(src, .proc/finish), rand(20 SECONDS, 29 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(finish)), rand(20 SECONDS, 29 SECONDS)) /obj/item/grenade/anti_photon/proc/finish() set_light(10, 10, "#[num2hex(rand(64,255))][num2hex(rand(64,255))][num2hex(rand(64,255))]") diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index ab3fcf1e4f6..39e2da80bb4 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -5,7 +5,6 @@ w_class = ITEM_SIZE_SMALL force = 2.0 det_time = null - unacidable = 1 var/stage = 0 var/path = 0 var/obj/item/assembly_holder/detonator = null @@ -194,7 +193,7 @@ desc = "An oversized grenade that affects a larger area." icon = 'icons/obj/items/grenades/grenade_large.dmi' allowed_containers = list(/obj/item/chems/glass) - origin_tech = "{'combat':3,'materials':3}" + origin_tech = @'{"combat":3,"materials":3}' material = /decl/material/solid/metal/steel /obj/item/grenade/chem_grenade/metalfoam diff --git a/code/game/objects/items/weapons/grenades/decompiler.dm b/code/game/objects/items/weapons/grenades/decompiler.dm index b498c7b3456..6e145b49a91 100644 --- a/code/game/objects/items/weapons/grenades/decompiler.dm +++ b/code/game/objects/items/weapons/grenades/decompiler.dm @@ -2,7 +2,7 @@ desc = "It is set to detonate in 5 seconds. It will create an unstable singularity that will break nearby objects down into purified matter cubes." name = "decompiler grenade" icon = 'icons/obj/items/grenades/delivery.dmi' - origin_tech = "{'materials':3,'magnets':2,'exoticmatter':3}" + origin_tech = @'{"materials":3,"magnets":2,"exoticmatter":3}' matter = list( /decl/material/solid/exotic_matter = MATTER_AMOUNT_TRACE ) diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index 3065f8ea6b4..afac53d7238 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -1,11 +1,13 @@ /obj/item/grenade/empgrenade name = "classic EMP grenade" icon = 'icons/obj/items/grenades/emp.dmi' - origin_tech = "{'materials':2,'magnets':3}" + origin_tech = @'{"materials":2,"magnets":3}' + var/emp_light_range = 10 + var/emp_heavy_range = 4 /obj/item/grenade/empgrenade/detonate() ..() - if(empulse(src, 4, 10)) + if(empulse(src, emp_heavy_range, emp_light_range)) qdel(src) return @@ -13,9 +15,6 @@ name = "low-yield EMP grenade" desc = "A weaker variant of the classic EMP grenade." icon = 'icons/obj/items/grenades/emp_old.dmi' - origin_tech = "{'materials':2,'magnets':3}" - -/obj/item/grenade/empgrenade/low_yield/detonate() - ..() - if(empulse(src, 4, 1)) - qdel(src) + origin_tech = @'{"materials":2,"magnets":3}' + emp_heavy_range = 1 + emp_light_range = 4 diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index ddcc59ed61f..da480a4fbec 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -2,7 +2,7 @@ name = "flashbang" desc = "A grenade designed to blind, stun and disorient by means of an extremely bright flash and loud explosion." icon = 'icons/obj/items/grenades/flashbang.dmi' - origin_tech = "{'materials':2,'combat':1}" + origin_tech = @'{"materials":2,"combat":1}' var/banglet = 0 /obj/item/grenade/flashbang/detonate() @@ -126,7 +126,7 @@ var/stepdist = rand(1,4)//How far to step var/temploc = src.loc//Saves the current location to know where to step away from walk_away(src,temploc,stepdist)//I must go, my people need me - addtimer(CALLBACK(src, .proc/detonate), rand(15,60)) + addtimer(CALLBACK(src, PROC_REF(detonate)), rand(15,60)) /obj/item/grenade/flashbang/clusterbang/segment/detonate() var/numspawned = rand(4,8) @@ -145,4 +145,4 @@ var/stepdist = rand(1,3) var/temploc = src.loc walk_away(src,temploc,stepdist) - addtimer(CALLBACK(src, .proc/detonate), rand(15,60)) + addtimer(CALLBACK(src, PROC_REF(detonate)), rand(15,60)) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 49237df9b01..c6c88a77447 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -77,7 +77,7 @@ active = TRUE update_icon() playsound(loc, arm_sound, 75, 0, -3) - addtimer(CALLBACK(src, .proc/detonate), det_time) + addtimer(CALLBACK(src, PROC_REF(detonate)), det_time) /obj/item/grenade/proc/detonate() var/turf/T = get_turf(src) diff --git a/code/game/objects/items/weapons/grenades/prank_grenades.dm b/code/game/objects/items/weapons/grenades/prank_grenades.dm index 8926c8002e2..8e7c1242f39 100644 --- a/code/game/objects/items/weapons/grenades/prank_grenades.dm +++ b/code/game/objects/items/weapons/grenades/prank_grenades.dm @@ -15,6 +15,6 @@ destroy_surroundings = 0 /obj/item/grenade/spawnergrenade/fake_carp - origin_tech = "{'materials':2,'magnets':2,'wormholes':5}" + origin_tech = @'{"materials":2,"magnets":2,"wormholes":5}' spawner_type = /mob/living/simple_animal/hostile/carp/holodeck/fake deliveryamt = 4 diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 296e02f01c7..543bbe5fac4 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -2,7 +2,7 @@ desc = "It is set to detonate in 5 seconds. It will unleash unleash an unspecified anomaly into the vicinity." name = "delivery grenade" icon = 'icons/obj/items/grenades/delivery.dmi' - origin_tech = "{'materials':3,'magnets':4}" + origin_tech = @'{"materials":3,"magnets":4}' var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver @@ -24,10 +24,10 @@ name = "manhack delivery grenade" spawner_type = /mob/living/simple_animal/hostile/viscerator deliveryamt = 5 - origin_tech = "{'materials':3,'magnets':4,'esoteric':4}" + origin_tech = @'{"materials":3,"magnets":4,"esoteric":4}' /obj/item/grenade/spawnergrenade/spesscarp name = "carp delivery grenade" spawner_type = /mob/living/simple_animal/hostile/carp deliveryamt = 5 - origin_tech = "{'materials':3,'magnets':4,'esoteric':4}" + origin_tech = @'{"materials":3,"magnets":4,"esoteric":4}' diff --git a/code/game/objects/items/weapons/grenades/supermatter.dm b/code/game/objects/items/weapons/grenades/supermatter.dm index f71e0b7e1fd..4f2758b53e3 100644 --- a/code/game/objects/items/weapons/grenades/supermatter.dm +++ b/code/game/objects/items/weapons/grenades/supermatter.dm @@ -1,7 +1,7 @@ /obj/item/grenade/supermatter name = "supermatter grenade" icon = 'icons/obj/items/grenades/banana.dmi' - origin_tech = "{'wormholes':5,'magnets':4,'engineering':5}" + origin_tech = @'{"wormholes":5,"magnets":4,"engineering":5}' arm_sound = 'sound/effects/3.wav' var/implode_at diff --git a/code/game/objects/items/weapons/hair_care.dm b/code/game/objects/items/weapons/hair_care.dm index e7d0237624a..8eeb0d8e771 100644 --- a/code/game/objects/items/weapons/hair_care.dm +++ b/code/game/objects/items/weapons/hair_care.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/items/comb.dmi' icon_state = "comb" item_state = "comb" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/haircomb/random/Initialize() . = ..() @@ -26,12 +26,13 @@ slot_flags = null icon_state = "brush" item_state = "brush" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/haircomb/brush/attack_self(mob/user) if(ishuman(user) && !user.incapacitated()) var/mob/living/carbon/human/H = user - var/decl/sprite_accessory/hair/hair_style = GET_DECL(H.h_style) + var/hairstyle = H.get_hairstyle() + var/decl/sprite_accessory/hair/hair_style = GET_DECL(hairstyle) if(hair_style.flags & VERY_SHORT) H.visible_message(SPAN_NOTICE("\The [H] just sort of runs \the [src] over their scalp.")) else diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index ce4f252a175..526ea8ddd1c 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -10,7 +10,7 @@ w_class = ITEM_SIZE_SMALL throw_speed = 2 throw_range = 5 - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel max_health = ITEM_HEALTH_NO_DAMAGE //#TODO: Once we can work out something different for handling cuff breakout, change this. Since it relies on cuffs health to tell if you can actually breakout. var/elastic @@ -141,7 +141,7 @@ var/global/last_chew = 0 //#FIXME: Its funny how only one person in the world ca cuff_type = "cable restraints" elastic = 1 max_health = 75 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/handcuffs/cable/red color = COLOR_MAROON @@ -179,4 +179,4 @@ var/global/last_chew = 0 //#FIXME: Its funny how only one person in the world ca breakouttime = 200 cuff_type = "duct tape" max_health = 50 - material = /decl/material/solid/plastic \ No newline at end of file + material = /decl/material/solid/organic/plastic \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 1b0439fa145..a874cd25b11 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -30,7 +30,7 @@ return 0 malfunction = MALFUNCTION_TEMPORARY - addtimer(CALLBACK(src,.proc/restore),time) + addtimer(CALLBACK(src,PROC_REF(restore)),time) return 1 /obj/item/implant/proc/restore() diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 1b4890ac51c..85008df6d66 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -29,12 +29,12 @@ user.set_machine(src) var/health_text = "" if(src.occupant) - if(src.occupant.health <= -100) + if(src.occupant.current_health <= -100) health_text = "Dead" - else if(src.occupant.health < 0) - health_text = "[round(src.occupant.health,0.1)]" + else if(src.occupant.current_health < 0) + health_text = "[round(src.occupant.current_health,0.1)]" else - health_text = "[round(src.occupant.health,0.1)]" + health_text = "[round(src.occupant.current_health,0.1)]" var/dat ="Implanter Status
    " diff --git a/code/game/objects/items/weapons/implants/implants/adrenaline.dm b/code/game/objects/items/weapons/implants/implants/adrenaline.dm index 75c23bc3e0b..7c3f0036fa7 100644 --- a/code/game/objects/items/weapons/implants/implants/adrenaline.dm +++ b/code/game/objects/items/weapons/implants/implants/adrenaline.dm @@ -1,7 +1,7 @@ /obj/item/implant/adrenalin name = "adrenalin implant" desc = "Removes all stuns and knockdowns." - origin_tech = "{'materials':1,'biotech':2,'esoteric':2}" + origin_tech = @'{"materials":1,"biotech":2,"esoteric":2}' hidden = 1 var/uses @@ -20,7 +20,7 @@ /obj/item/implant/adrenalin/trigger(emote, mob/source) if (emote == "pale") activate() - + /obj/item/implant/adrenalin/activate()//this implant is unused but I'm changing it for the sake of consistency if (uses < 1 || malfunction || !imp_in) return 0 uses-- diff --git a/code/game/objects/items/weapons/implants/implants/chem.dm b/code/game/objects/items/weapons/implants/implants/chem.dm index 3326284cc3f..0d184f80f7f 100644 --- a/code/game/objects/items/weapons/implants/implants/chem.dm +++ b/code/game/objects/items/weapons/implants/implants/chem.dm @@ -3,7 +3,7 @@ var/global/list/chem_implants = list() /obj/item/implant/chem name = "chemical implant" desc = "Injects things." - origin_tech = "{'materials':1,'biotech':2}" + origin_tech = @'{"materials":1,"biotech":2}' known = 1 /obj/item/implant/chem/get_data() @@ -53,4 +53,7 @@ var/global/list/chem_implants = list() /obj/item/implantcase/chem name = "glass case - 'chem'" - imp = /obj/item/implant/chem \ No newline at end of file + imp = /obj/item/implant/chem + +/obj/item/implantcase/chem/can_be_injected_by(var/atom/injector) + return FALSE diff --git a/code/game/objects/items/weapons/implants/implants/compressed.dm b/code/game/objects/items/weapons/implants/implants/compressed.dm index 6448b9c4dce..64de2aa17f6 100644 --- a/code/game/objects/items/weapons/implants/implants/compressed.dm +++ b/code/game/objects/items/weapons/implants/implants/compressed.dm @@ -2,7 +2,7 @@ name = "compressed matter implant" desc = "Based on compressed matter technology, can store a single item." icon_state = "implant_evil" - origin_tech = "{'materials':4,'biotech':2,'esoteric':2}" + origin_tech = @'{"materials":4,"biotech":2,"esoteric":2}' hidden = 1 var/activation_emote var/obj/item/scanned diff --git a/code/game/objects/items/weapons/implants/implants/death_alarm.dm b/code/game/objects/items/weapons/implants/implants/death_alarm.dm index ac1c0cffea7..f41e96f1f29 100644 --- a/code/game/objects/items/weapons/implants/implants/death_alarm.dm +++ b/code/game/objects/items/weapons/implants/implants/death_alarm.dm @@ -1,7 +1,7 @@ /obj/item/implant/death_alarm name = "death alarm implant" desc = "An alarm which monitors host vital signs and transmits a radio message upon death." - origin_tech = "{'materials':1,'biotech':2,'programming':3}" + origin_tech = @'{"materials":1,"biotech":2,"programming":3}' known = 1 var/mobname = "John Doe" diff --git a/code/game/objects/items/weapons/implants/implants/explosive.dm b/code/game/objects/items/weapons/implants/implants/explosive.dm index 62109528325..2ccdddc2153 100644 --- a/code/game/objects/items/weapons/implants/implants/explosive.dm +++ b/code/game/objects/items/weapons/implants/implants/explosive.dm @@ -3,7 +3,7 @@ name = "explosive implant" desc = "A military grade micro bio-explosive. Highly dangerous." icon_state = "implant_evil" - origin_tech = "{'materials':1,'biotech':2,'esoteric':3}" + origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}' hidden = 1 var/elevel var/phrase diff --git a/code/game/objects/items/weapons/implants/implants/freedom.dm b/code/game/objects/items/weapons/implants/implants/freedom.dm index d034c8276d3..9c98d34f961 100644 --- a/code/game/objects/items/weapons/implants/implants/freedom.dm +++ b/code/game/objects/items/weapons/implants/implants/freedom.dm @@ -3,7 +3,7 @@ /obj/item/implant/freedom name = "freedom implant" desc = "Use this to escape from those evil Red Shirts." - origin_tech = "{'materials':1,'biotech':2,'esoteric':2}" + origin_tech = @'{"materials":1,"biotech":2,"esoteric":2}' implant_color = "r" hidden = 1 var/activation_emote diff --git a/code/game/objects/items/weapons/implants/implants/imprinting.dm b/code/game/objects/items/weapons/implants/implants/imprinting.dm index 2ff70ad312c..76e7ac49e30 100644 --- a/code/game/objects/items/weapons/implants/implants/imprinting.dm +++ b/code/game/objects/items/weapons/implants/implants/imprinting.dm @@ -1,7 +1,7 @@ /obj/item/implant/imprinting name = "imprinting implant" desc = "Latest word in training your peons." - origin_tech = "{'materials':1,'biotech':2,'programming':3}" + origin_tech = @'{"materials":1,"biotech":2,"programming":3}' hidden = 1 var/list/instructions = list("Do your job.", "Respect your superiors.", "Wash you hands after using the toilet.") var/brainwashing = 0 @@ -51,7 +51,7 @@ M.StoreMemory(msg, /decl/memory_options/system) if(brainwashing) log_and_message_admins("was implanted with a brainwashing implant holding following laws: [jointext(instructions, ";")].", M) - addtimer(CALLBACK(src,.proc/activate),3000,(TIMER_UNIQUE|TIMER_OVERRIDE)) + addtimer(CALLBACK(src,PROC_REF(activate)),3000,(TIMER_UNIQUE|TIMER_OVERRIDE)) return TRUE /obj/item/implant/imprinting/proc/get_instructions() @@ -83,7 +83,7 @@ else instruction = "You remember suddenly: \"[instruction]\"" to_chat(imp_in, instruction) - addtimer(CALLBACK(src,.proc/activate),3000,(TIMER_UNIQUE|TIMER_OVERRIDE)) + addtimer(CALLBACK(src,PROC_REF(activate)),3000,(TIMER_UNIQUE|TIMER_OVERRIDE)) /obj/item/implant/imprinting/removed() if(brainwashing && !malfunction) @@ -103,7 +103,7 @@ . = ..() /obj/item/implant/imprinting/can_implant(mob/M, mob/user, target_zone) - var/mob/living/carbon/human/H = M + var/mob/living/carbon/human/H = M if(istype(H)) var/obj/item/organ/internal/B = GET_INTERNAL_ORGAN(H, BP_BRAIN) if(!B || H.isSynthetic()) diff --git a/code/game/objects/items/weapons/implants/implants/loyalty.dm b/code/game/objects/items/weapons/implants/implants/loyalty.dm index 9fc65c232c7..f7cc12b1abb 100644 --- a/code/game/objects/items/weapons/implants/implants/loyalty.dm +++ b/code/game/objects/items/weapons/implants/implants/loyalty.dm @@ -1,7 +1,7 @@ /obj/item/implant/loyalty name = "loyalty implant" desc = "Makes you loyal or such." - origin_tech = "{'materials':1,'biotech':2,'esoteric':3}" + origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}' known = 1 /obj/item/implant/loyalty/get_data() @@ -19,14 +19,16 @@ /obj/item/implant/loyalty/implanted(mob/M) if(!ishuman(M)) return FALSE - var/mob/living/carbon/human/H = M - var/decl/special_role/antag_data = H.mind && ispath(H.mind.assigned_special_role, /decl/special_role) && GET_DECL(H.mind.assigned_special_role) - if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE)) - H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [global.using_map.company_name] try to invade your mind!") + var/decl/special_role/antag_data = GET_DECL(M.mind?.assigned_special_role) + if(istype(antag_data) && (antag_data.flags & ANTAG_IMPLANT_IMMUNE)) + M.visible_message( + "\The [M] seems to resist the implant!", + "You feel the corporate tendrils of [global.using_map.company_name] try to invade your mind!" + ) return FALSE else - clear_antag_roles(H.mind, 1) - to_chat(H, "You feel a surge of loyalty towards [global.using_map.company_name].") + clear_antag_roles(M.mind, 1) + to_chat(M, SPAN_NOTICE("You feel a surge of loyalty towards [global.using_map.company_name].")) return TRUE /obj/item/implanter/loyalty diff --git a/code/game/objects/items/weapons/implants/implants/tracking.dm b/code/game/objects/items/weapons/implants/implants/tracking.dm index 5db14647141..0b317737c4b 100644 --- a/code/game/objects/items/weapons/implants/implants/tracking.dm +++ b/code/game/objects/items/weapons/implants/implants/tracking.dm @@ -3,7 +3,7 @@ var/global/list/tracking_implants = list() /obj/item/implant/tracking name = "tracking implant" desc = "Track with this." - origin_tech = "{'materials':1,'biotech':2,'wormholes':2}" + origin_tech = @'{"materials":1,"biotech":2,"wormholes":2}' known = 1 var/id = 1 diff --git a/code/game/objects/items/weapons/implants/implants/translator.dm b/code/game/objects/items/weapons/implants/implants/translator.dm index fb18b37640f..f8b9f30d836 100644 --- a/code/game/objects/items/weapons/implants/implants/translator.dm +++ b/code/game/objects/items/weapons/implants/implants/translator.dm @@ -3,7 +3,7 @@ name = "babel implant" desc = "A small implant with a microphone on it." icon_state = "implant_evil" - origin_tech = "{'materials':1,'biotech':2,'esoteric':3}" + origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}' hidden = 1 var/list/languages = list() var/learning_threshold = 20 //need to hear language spoken this many times to learn it @@ -44,6 +44,6 @@ name = "lingophagic node" desc = "A chunk of what could be discolored crystalized brain matter. It seems to pulse occasionally." icon_state = "implant_melted" - origin_tech = "{'biotech':5}" + origin_tech = @'{"biotech":5}' learning_threshold = 10 max_languages = 3 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implants/uplink.dm b/code/game/objects/items/weapons/implants/implants/uplink.dm index fa377b563f4..fece5d1fc37 100644 --- a/code/game/objects/items/weapons/implants/implants/uplink.dm +++ b/code/game/objects/items/weapons/implants/implants/uplink.dm @@ -1,7 +1,7 @@ /obj/item/implant/uplink name = "uplink implant" desc = "Summon things." - origin_tech = "{'materials':1,'biotech':2,'esoteric':3}" + origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}' hidden = 1 var/activation_emote diff --git a/code/game/objects/items/weapons/janitor_sign.dm b/code/game/objects/items/weapons/janitor_sign.dm index be909485dd7..fab3f9425cc 100644 --- a/code/game/objects/items/weapons/janitor_sign.dm +++ b/code/game/objects/items/weapons/janitor_sign.dm @@ -9,7 +9,7 @@ throw_range = 5 w_class = ITEM_SIZE_SMALL attack_verb = list("warned", "cautioned", "smashed") - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/caution/cone desc = "This cone is trying to warn you of something!" diff --git a/code/game/objects/items/weapons/lighter.dm b/code/game/objects/items/weapons/lighter.dm index 6e0efbe5856..d9e5c449e3e 100644 --- a/code/game/objects/items/weapons/lighter.dm +++ b/code/game/objects/items/weapons/lighter.dm @@ -7,12 +7,11 @@ w_class = ITEM_SIZE_TINY throwforce = 4 obj_flags = OBJ_FLAG_CONDUCTIBLE - obj_flags = OBJ_FLAG_HOLLOW slot_flags = SLOT_LOWER_BODY attack_verb = list("burnt", "singed") lit_heat = 1500 - material = /decl/material/solid/plastic - matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) + material = /decl/material/solid/organic/plastic + matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) var/tmp/max_fuel = 5 /obj/item/flame/lighter/Initialize() @@ -30,11 +29,13 @@ /obj/item/flame/lighter/populate_reagents() reagents.add_reagent(/decl/material/liquid/fuel, max_fuel) -/obj/item/flame/lighter/proc/light(mob/user) +/obj/item/flame/lighter/light(mob/user) if(submerged()) - to_chat(user, "You cannot light \the [src] underwater.") + to_chat(user, SPAN_WARNING("You cannot light \the [src] underwater.")) return - lit = 1 + if(lit) + return + ..() update_icon() light_effects(user) set_light(2, l_color = COLOR_PALE_ORANGE) @@ -94,14 +95,14 @@ else cig.light("[user] holds the [name] out for [M], and lights the [cig.name].") return - ..() + return ..() /obj/item/flame/lighter/Process() if(!submerged() && reagents.has_reagent(/decl/material/liquid/fuel)) if(ismob(loc) && prob(10) && REAGENT_VOLUME(reagents, /decl/material/liquid/fuel) < 1) to_chat(loc, "\The [src]'s flame flickers.") set_light(0) - addtimer(CALLBACK(src, .atom/proc/set_light, 2), 4) + addtimer(CALLBACK(src, TYPE_PROC_REF(.atom, set_light), 2), 4) reagents.remove_reagent(/decl/material/liquid/fuel, 0.05) else extinguish() @@ -189,6 +190,8 @@ O.reagents.trans_to_obj(src, max_fuel) to_chat(user, "You refuel [src] from \the [O]") playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + return TRUE + return ..() /obj/item/flame/lighter/zippo/black color = COLOR_DARK_GRAY diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 05b3e13de36..f8c34638f8f 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -57,7 +57,7 @@ take_damage(3, BRUTE, 0, hit_atom) /obj/item/ashtray/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/ashtray/glass material = /decl/material/solid/glass diff --git a/code/game/objects/items/weapons/material/folding.dm b/code/game/objects/items/weapons/material/folding.dm index 59ccdcf3414..6d0bc79329c 100644 --- a/code/game/objects/items/weapons/material/folding.dm +++ b/code/game/objects/items/weapons/material/folding.dm @@ -48,7 +48,7 @@ icon_state = "[get_world_inventory_state()]_open" update_held_icon() -/obj/item/knife/folding/get_mob_overlay(mob/user_mob, slot, bodypart) +/obj/item/knife/folding/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE) . = open ? ..() : new /image //Subtypes diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 442a025cdf1..91b0263ebde 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -9,7 +9,7 @@ /obj/item/kitchen/utensil w_class = ITEM_SIZE_TINY thrown_material_force_multiplier = 1 - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' attack_verb = list("attacked", "stabbed", "poked") sharp = 0 edge = 0 @@ -66,7 +66,7 @@ icon_state = "fork" /obj/item/kitchen/utensil/fork/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/kitchen/utensil/spoon name = "spoon" @@ -76,7 +76,7 @@ material_force_multiplier = 0.1 //2 when wielded with weight 20 (steel) /obj/item/kitchen/utensil/spoon/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/kitchen/utensil/spork name = "spork" @@ -84,7 +84,7 @@ icon_state = "spork" /obj/item/kitchen/utensil/spork/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/kitchen/utensil/foon name = "foon" @@ -92,7 +92,7 @@ icon_state = "foon" /obj/item/kitchen/utensil/foon/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /* * Rolling Pins @@ -103,7 +103,7 @@ desc = "Used to knock out the Bartender." icon_state = "rolling_pin" attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood material_force_multiplier = 0.7 // 10 when wielded with weight 15 (wood) thrown_material_force_multiplier = 1 // as above diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 9253cc7ac6b..d48ebfdb55e 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -7,11 +7,11 @@ material_force_multiplier = 0.3 attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") material = /decl/material/solid/metal/steel - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' obj_flags = OBJ_FLAG_CONDUCTIBLE sharp = TRUE edge = TRUE - item_flags = ITEM_FLAG_CAN_HIDE_IN_SHOES + item_flags = ITEM_FLAG_CAN_HIDE_IN_SHOES | ITEM_FLAG_IS_WEAPON material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME pickup_sound = 'sound/foley/knife1.ogg' drop_sound = 'sound/foley/knifedrop3.ogg' @@ -65,13 +65,13 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR /obj/item/knife/table/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/knife/table/primitive name = "dueling knife" desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude." icon = 'icons/obj/items/weapon/knives/savage.dmi' - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood material_alteration = MAT_FLAG_ALTERATION_NAME w_class = ITEM_SIZE_NORMAL diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 6c27d9438c0..d31b6c2d029 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -7,6 +7,7 @@ icon_state = "harpoon" item_state = "harpoon" max_force = 20 + item_flags = ITEM_FLAG_IS_WEAPON material_force_multiplier = 0.3 // 18 with hardness 60 (steel) thrown_material_force_multiplier = 0.6 attack_verb = list("jabbed","stabbed","ripped") @@ -25,7 +26,7 @@ return audible_message(SPAN_WARNING("\The [src] emits a long, harsh tone!")) playsound(loc, 'sound/weapons/bombwhine.ogg', 100, 0, -3) - addtimer(CALLBACK(src, .proc/harpoon_detonate), 4 SECONDS) //for suspense + addtimer(CALLBACK(src, PROC_REF(harpoon_detonate)), 4 SECONDS) //for suspense /obj/item/harpoon/bomb/proc/harpoon_detonate() audible_message(SPAN_DANGER("\The [src] detonates!")) //an actual sound will be handled by explosion() @@ -50,12 +51,13 @@ icon = 'icons/obj/items/tool/hatchet.dmi' icon_state = "hatchet" max_force = 15 + item_flags = ITEM_FLAG_IS_WEAPON material_force_multiplier = 0.2 // 12 with hardness 60 (steel) thrown_material_force_multiplier = 0.25 // 15 with weight 60 (steel) w_class = ITEM_SIZE_SMALL sharp = 1 edge = 1 - origin_tech = "{'materials':2,'combat':1}" + origin_tech = @'{"materials":2,"combat":1}' attack_verb = list("chopped", "torn", "cut") material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_NAME @@ -99,7 +101,7 @@ desc = "A long, machine-stamped blade with a somewhat ungainly handle. Found in military surplus stores, malls, and horror movies since before interstellar travel." base_parry_chance = 40 material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) /obj/item/hatchet/machete/deluxe name = "deluxe machete" @@ -135,7 +137,7 @@ throw_range = 3 w_class = ITEM_SIZE_HUGE slot_flags = SLOT_BACK - origin_tech = "{'materials':2,'combat':2}" + origin_tech = @'{"materials":2,"combat":2}' attack_verb = list("chopped", "sliced", "cut", "reaped") material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME @@ -150,7 +152,7 @@ w_class = ITEM_SIZE_SMALL attack_verb = list("attacked", "bashed") material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/cross/silver material = /decl/material/solid/metal/silver diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 53d839f97b0..79cb11faedb 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -94,40 +94,35 @@ /obj/item/shard/Crossed(atom/movable/AM) ..() - if(isliving(AM)) - var/mob/M = AM + if(!isliving(AM)) + return - if(M.buckled) //wheelchairs, office chairs, rollerbeds - return + var/mob/living/M = AM + if(M.buckled) //wheelchairs, office chairs, rollerbeds + return - playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(H.species.siemens_coefficient<0.5 || (H.species.species_flags & (SPECIES_FLAG_NO_EMBED|SPECIES_FLAG_NO_MINOR_CUT))) //Thick skin. - return - - var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) - var/obj/item/suit = H.get_equipped_item(slot_wear_suit_str) - if(shoes || (suit && (suit.body_parts_covered & SLOT_FEET))) - return - - to_chat(M, SPAN_DANGER("You step on \the [src]!")) - - var/list/check = list(BP_L_FOOT, BP_R_FOOT) - while(check.len) - var/picked = pick(check) - var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(H, picked) - if(affecting) - if(BP_IS_PROSTHETIC(affecting)) - return - affecting.take_external_damage(5, 0) - H.updatehealth() - if(affecting.can_feel_pain()) - SET_STATUS_MAX(H, STAT_WEAK, 3) - return - check -= picked - return + playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds + + var/decl/species/walker_species = M.get_species() + if(walker_species && (walker_species.siemens_coefficient<0.5 || (walker_species.species_flags & (SPECIES_FLAG_NO_EMBED|SPECIES_FLAG_NO_MINOR_CUT)))) //Thick skin. + return + + var/obj/item/shoes = M.get_equipped_item(slot_shoes_str) + var/obj/item/suit = M.get_equipped_item(slot_wear_suit_str) + if(shoes || (suit && (suit.body_parts_covered & SLOT_FEET))) + return + + var/list/check = list(BP_L_FOOT, BP_R_FOOT) + while(check.len) + var/picked = pick_n_take(check) + var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(M, picked) + if(!affecting || BP_IS_PROSTHETIC(affecting)) + continue + to_chat(M, SPAN_DANGER("You step on \the [src]!")) + affecting.take_external_damage(5, 0) + if(affecting.can_feel_pain()) + SET_STATUS_MAX(M, STAT_WEAK, 3) + return //Prevent the shard from being allowed to shatter /obj/item/shard/check_health(var/lastdamage = null, var/lastdamtype = null, var/lastdamflags = 0, var/consumed = FALSE) @@ -154,5 +149,5 @@ w_class = ITEM_SIZE_TINY //it's real small /obj/item/shard/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic w_class = ITEM_SIZE_TINY \ No newline at end of file diff --git a/code/game/objects/items/weapons/material/stick.dm b/code/game/objects/items/weapons/material/stick.dm index 3f834043cab..a6317d1a1e4 100644 --- a/code/game/objects/items/weapons/material/stick.dm +++ b/code/game/objects/items/weapons/material/stick.dm @@ -7,7 +7,7 @@ material_force_multiplier = 0.1 thrown_material_force_multiplier = 0.1 w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood attack_verb = list("poked", "jabbed") material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME diff --git a/code/game/objects/items/weapons/material/swiss.dm b/code/game/objects/items/weapons/material/swiss.dm index 25edfbc9d28..0567349c265 100644 --- a/code/game/objects/items/weapons/material/swiss.dm +++ b/code/game/objects/items/weapons/material/swiss.dm @@ -48,9 +48,9 @@ /obj/item/knife/folding/swiss/get_tool_quality(archetype) . = (archetype == get_tool_archetype()) ? ..() : 0 - + /obj/item/knife/folding/swiss/attack_self(mob/user) - var/choice + var/choice if(user.a_intent != I_HELP && ((SWISSKNF_LBLADE in tools) || (SWISSKNF_SBLADE in tools)) && active_tool == SWISSKNF_CLOSED) open = TRUE if(SWISSKNF_LBLADE in tools) @@ -63,7 +63,7 @@ else choice = SWISSKNF_CLOSED open = FALSE - + if(!choice || !CanPhysicallyInteract(user)) return if(choice == SWISSKNF_CLOSED) @@ -76,7 +76,7 @@ playsound(user, 'sound/weapons/flipblade.ogg', 15, 1) else user.visible_message("\The [user] opens the [lowertext(choice)].") - + active_tool = choice update_force() update_icon() @@ -109,7 +109,7 @@ if(active_tool != null) add_overlay(overlay_image(icon, active_tool, flags = RESET_COLOR)) -/obj/item/knife/folding/swiss/get_mob_overlay(mob/user_mob, slot, bodypart) +/obj/item/knife/folding/swiss/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE) . = (active_tool == SWISSKNF_LBLADE || active_tool == SWISSKNF_SBLADE) ? ..() : new /image /obj/item/knife/folding/swiss/resolve_attackby(obj/target, mob/user) diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index 32ee7ae427a..7c0e9f3ec6e 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/items/weapon/swords/claymore.dmi' slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_LARGE + item_flags = ITEM_FLAG_IS_WEAPON material_force_multiplier = 0.5 // 30 when wielded with hardnes 60 (steel) armor_penetration = 10 thrown_material_force_multiplier = 0.16 // 10 when thrown with weight 60 (steel) @@ -16,7 +17,7 @@ melee_accuracy_bonus = 10 material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - pickup_sound = 'sound/foley/knife1.ogg' + pickup_sound = 'sound/foley/knife1.ogg' drop_sound = 'sound/foley/knifedrop3.ogg' var/draw_handle = TRUE @@ -34,7 +35,7 @@ attack_verb = list("attacked", "smashed", "jabbed", "smacked", "prodded", "bonked") hitsound = "chop" . = ..() - + /obj/item/sword/on_update_icon() . = ..() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) @@ -43,18 +44,18 @@ if(material.reflectiveness >= MAT_VALUE_SHINY && check_state_in_icon("[icon_state]_shine", icon)) add_overlay(mutable_appearance(icon, "[icon_state]_shine"), adjust_brightness(color, 20 + material.reflectiveness)) -/obj/item/sword/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/sword/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) //Do not color scabbarded blades if(overlay && (material_alteration & MAT_FLAG_ALTERATION_COLOR) && (slot == slot_back_str || slot == slot_belt_str)) overlay.color = null . = ..() /obj/item/sword/wood - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood draw_handle = FALSE /obj/item/sword/replica - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/sword/katana name = "katana" @@ -64,16 +65,16 @@ /obj/item/sword/katana/set_material(new_material) . = ..() - if((material_alteration & MAT_FLAG_ALTERATION_NAME) && istype(material, /decl/material/solid/wood)) + if((material_alteration & MAT_FLAG_ALTERATION_NAME) && istype(material, /decl/material/solid/organic/wood)) SetName("[material.solid_name] bokutou") desc = "Finest wooden fibers folded exactly one thousand times by master robots." /obj/item/sword/katana/bamboo - material = /decl/material/solid/wood/bamboo + material = /decl/material/solid/organic/wood/bamboo draw_handle = FALSE /obj/item/sword/katana/wood - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood draw_handle = FALSE /obj/item/sword/katana/vibro diff --git a/code/game/objects/items/weapons/material/thrown.dm b/code/game/objects/items/weapons/material/thrown.dm index 7bbd1a4e747..a20ac48e734 100644 --- a/code/game/objects/items/weapons/material/thrown.dm +++ b/code/game/objects/items/weapons/material/thrown.dm @@ -12,6 +12,10 @@ edge = 1 material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + item_flags = ITEM_FLAG_IS_WEAPON + +/obj/item/star/get_max_weapon_value() + return throwforce /obj/item/star/throw_impact(atom/hit_atom) ..() diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index a12ccc5901b..9475893d58a 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -18,6 +18,7 @@ */ /obj/item/twohanded w_class = ITEM_SIZE_HUGE + item_flags = ITEM_FLAG_IS_WEAPON slot_flags = SLOT_BACK icon_state = ICON_STATE_WORLD pickup_sound = 'sound/foley/scrape1.ogg' @@ -67,7 +68,7 @@ if(wielded) . += wielded_parry_bonus -/obj/item/twohanded/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/twohanded/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && wielded && (slot in list(BP_L_HAND, BP_R_HAND))) overlay.icon_state = "[overlay.icon_state]-wielded" . = ..() @@ -137,7 +138,7 @@ )) -/obj/item/twohanded/spear/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/twohanded/spear/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) if(check_state_in_icon("[overlay.icon_state]-shaft", overlay.icon)) overlay.overlays += get_shaft_overlay("[overlay.icon_state]-shaft") @@ -158,12 +159,12 @@ /obj/item/twohanded/spear/steel material = /decl/material/solid/metal/steel - shaft_material = /decl/material/solid/wood + shaft_material = /decl/material/solid/organic/wood cable_color = COLOR_GREEN /obj/item/twohanded/spear/supermatter material = /decl/material/solid/exotic_matter - shaft_material = /decl/material/solid/wood/ebony + shaft_material = /decl/material/solid/organic/wood/ebony cable_color = COLOR_INDIGO /obj/item/twohanded/baseballbat @@ -174,7 +175,7 @@ throwforce = 7 attack_verb = list("smashed", "beaten", "slammed", "smacked", "struck", "battered", "bonked") hitsound = 'sound/weapons/genhit3.ogg' - material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME max_force = 40 //for wielded material_force_multiplier = 0.4 // 24 when wielded with weight 60 (steel) diff --git a/code/game/objects/items/weapons/material/urn.dm b/code/game/objects/items/weapons/material/urn.dm index 46808bc6769..c3183ae361b 100644 --- a/code/game/objects/items/weapons/material/urn.dm +++ b/code/game/objects/items/weapons/material/urn.dm @@ -5,7 +5,7 @@ icon_state = "urn" material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/urn/afterattack(var/obj/A, var/mob/user, var/proximity) if(!istype(A, /obj/effect/decal/cleanable/ash)) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 3289263cc11..1eee7a8b338 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -5,7 +5,8 @@ icon = 'icons/obj/items/weapon/energy_blade.dmi' icon_state = ICON_STATE_WORLD - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_BLOOD + atom_flags = ATOM_FLAG_NO_BLOOD + item_flags = ITEM_FLAG_IS_WEAPON w_class = ITEM_SIZE_SMALL hitsound = 'sound/weapons/genhit.ogg' @@ -19,7 +20,7 @@ material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY, /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/plutonium = MATTER_AMOUNT_REINFORCEMENT, @@ -44,6 +45,9 @@ var/list/active_attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/list/inactive_attack_verb = list("hit") +/obj/item/energy_blade/get_max_weapon_value() + return active_force + /obj/item/energy_blade/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") . = ..() if(.) @@ -160,7 +164,7 @@ add_overlay(emissive_overlay(icon, "[icon_state]-extended")) z_flags |= ZMM_MANGLE_PLANES -/obj/item/energy_blade/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) +/obj/item/energy_blade/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && active && check_state_in_icon("[overlay.icon_state]-extended", overlay.icon)) overlay.overlays += emissive_overlay(overlay.icon, "[overlay.icon_state]-extended") . = ..() diff --git a/code/game/objects/items/weapons/melee/energy_axe.dm b/code/game/objects/items/weapons/melee/energy_axe.dm index 4ed3459b412..d52e6c5b699 100644 --- a/code/game/objects/items/weapons/melee/energy_axe.dm +++ b/code/game/objects/items/weapons/melee/energy_axe.dm @@ -10,9 +10,10 @@ throw_speed = 1 throw_range = 5 w_class = ITEM_SIZE_NORMAL - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_BLOOD + atom_flags = ATOM_FLAG_NO_BLOOD obj_flags = OBJ_FLAG_CONDUCTIBLE - origin_tech = "{'magnets':3,'combat':4}" + item_flags = ITEM_FLAG_IS_WEAPON + origin_tech = @'{"magnets":3,"combat":4}' active_attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") inactive_attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") sharp = 1 diff --git a/code/game/objects/items/weapons/melee/energy_cutlass.dm b/code/game/objects/items/weapons/melee/energy_cutlass.dm index 9f15fb08784..76183114c0a 100644 --- a/code/game/objects/items/weapons/melee/energy_cutlass.dm +++ b/code/game/objects/items/weapons/melee/energy_cutlass.dm @@ -4,4 +4,4 @@ icon = 'icons/obj/items/weapon/e_cutlass.dmi' lighting_color = COLOR_SABER_CUTLASS active_parry_chance = 50 - material = /decl/material/solid/metal/brass \ No newline at end of file + material = /decl/material/solid/metal/brass diff --git a/code/game/objects/items/weapons/melee/energy_machete.dm b/code/game/objects/items/weapons/melee/energy_machete.dm index 3a12bce1b19..182e9412302 100644 --- a/code/game/objects/items/weapons/melee/energy_machete.dm +++ b/code/game/objects/items/weapons/melee/energy_machete.dm @@ -6,5 +6,5 @@ active_throwforce = 17 active_parry_chance = 30 lighting_color = "#6600cc" - origin_tech = "{'magnets':3}" + origin_tech = @'{"magnets":3}' active_attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") diff --git a/code/game/objects/items/weapons/melee/energy_sword.dm b/code/game/objects/items/weapons/melee/energy_sword.dm index ec7fc6b37c3..be1954b7c8f 100644 --- a/code/game/objects/items/weapons/melee/energy_sword.dm +++ b/code/game/objects/items/weapons/melee/energy_sword.dm @@ -2,7 +2,7 @@ name = "energy sword" desc = "May the force be mass times acceleration." icon = 'icons/obj/items/weapon/e_sword.dmi' - origin_tech = "{'magnets':3,'esoteric':4}" + origin_tech = @'{"magnets":3,"esoteric":4}' active_parry_chance = 50 var/blade_color @@ -26,7 +26,7 @@ /obj/item/energy_blade/sword/dropped(var/mob/user) ..() - addtimer(CALLBACK(src, .proc/check_loc), 1) // Swapping hands or passing to another person should not deactivate the sword. + addtimer(CALLBACK(src, PROC_REF(check_loc)), 1) // Swapping hands or passing to another person should not deactivate the sword. /obj/item/energy_blade/sword/proc/check_loc() if(!ismob(loc) && active) @@ -43,7 +43,7 @@ I.color = blade_color add_overlay(I) -/obj/item/energy_blade/sword/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) +/obj/item/energy_blade/sword/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && active && check_state_in_icon("[overlay.icon_state]-extended-glow", overlay.icon)) overlay.overlays += emissive_overlay(overlay.icon, "[overlay.icon_state]-extended-glow", color = blade_color) return ..() diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index cd25c48c2e5..3161a6dabf9 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -7,11 +7,12 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY force = 10 + item_flags = ITEM_FLAG_IS_WEAPON throwforce = 7 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'combat':4}" + origin_tech = @'{"combat":4}' attack_verb = list("flicked", "whipped", "lashed") - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/whip/abyssal name = "abyssal whip" @@ -23,7 +24,7 @@ force = 16 //max hit with 60 strength and no equipment. Duel Arena no No forfeit - Snapshot throwforce = 7 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'combat':4}" + origin_tech = @'{"combat":4}' attack_verb = list("flicked", "whipped", "lashed") /obj/item/whip/tail @@ -34,8 +35,8 @@ obj_flags = null force = 19 edge = TRUE - origin_tech = "{'combat':6,'materials':5}" - material = /decl/material/solid/leather/lizard + origin_tech = @'{"combat":6,"materials":5}' + material = /decl/material/solid/organic/leather/lizard /obj/item/whip/chainofcommand name = "chain of command" diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 76bd71502e8..f11cae1906c 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -9,9 +9,9 @@ throw_range = 10 w_class = ITEM_SIZE_NORMAL attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood matter = list( - /decl/material/solid/cloth = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY, ) var/mopspeed = 40 var/list/moppable_types = list( @@ -87,9 +87,9 @@ material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) - origin_tech = "{'engineering':4,'materials':4,'powerstorage':3}" + origin_tech = @'{"engineering":4,"materials":4,"powerstorage":3}' var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. var/refill_rate = 1 //Rate per process() tick mop refills itself diff --git a/code/game/objects/items/weapons/nuclear_cylinder.dm b/code/game/objects/items/weapons/nuclear_cylinder.dm index f6e6f20732f..68ce244b014 100644 --- a/code/game/objects/items/weapons/nuclear_cylinder.dm +++ b/code/game/objects/items/weapons/nuclear_cylinder.dm @@ -10,5 +10,5 @@ throwforce = 15.0 throw_speed = 2 throw_range = 4 - origin_tech = "{'materials':3,'engineering':4}" + origin_tech = @'{"materials":3,"engineering":4}' max_health = ITEM_HEALTH_NO_DAMAGE diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 182a7bceff0..c727a80bb74 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -14,7 +14,6 @@ var/global/list/cached_icons = list() amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[10,20,30,60]" volume = 60 - unacidable = 0 atom_flags = ATOM_FLAG_OPEN_CONTAINER var/pigment diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 771d738d613..29170908a0e 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -119,7 +119,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar return var/mob/_uroller = unroller.resolve() if(_uroller) - events_repository.unregister(/decl/observ/moved, _uroller, src, .proc/user_moved_unrolling) + events_repository.unregister(/decl/observ/moved, _uroller, src, PROC_REF(user_moved_unrolling)) unroller = null start = null slowdown_general = initial(slowdown_general) @@ -135,8 +135,8 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar start = get_turf(src) unroller = weakref(user) slowdown_general = initial(slowdown_general) + 2 //While unrolling you're slightly slower - events_repository.unregister(/decl/observ/moved, user, src, .proc/user_moved_unrolling) - events_repository.register(/decl/observ/moved, user, src, .proc/user_moved_unrolling) + events_repository.unregister(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling)) + events_repository.register(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling)) to_chat(user, SPAN_NOTICE("You start unrolling \the [src].")) //Place the first one immediately place_line(user, get_turf(user), user.dir) @@ -194,7 +194,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar layer = ABOVE_DOOR_LAYER pass_flags = PASS_FLAG_TABLE //About the height of table anchored = TRUE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/neighbors = 0 //Contains all the direction flags of all the neighboring tape_barricades var/nb_neighbors = 0 //Keep track of our cached neighbors number var/is_lifted = 0 //Whether the tape is lifted and we're allowing everyone passage. @@ -338,16 +338,17 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar return FALSE return ..() -/obj/structure/tape_barricade/Crossed(O) +/obj/structure/tape_barricade/Crossed(atom/movable/AM) . = ..() - if(!is_lifted && ismob(O)) - var/mob/M = O - add_fingerprint(M) - shake_animation(2) - if (!allowed(M)) //only select few learn art of not crumpling the tape - to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]...")) - if(M.a_intent != I_HELP) - crumple() + if(is_lifted || !isliving(AM)) + return + var/mob/living/M = AM + add_fingerprint(M) + shake_animation(2) + if (!allowed(M)) //only select few learn art of not crumpling the tape + to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]...")) + if(M.a_intent != I_HELP) + crumple() /obj/structure/tape_barricade/proc/crumple() if(!is_crumpled) @@ -363,7 +364,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar layer = ABOVE_HUMAN_LAYER pass_flags = PASS_FLAG_MOB pixel_y += 8 - addtimer(CALLBACK(src, .proc/on_unlift), time, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(on_unlift)), time, TIMER_UNIQUE) playsound(src, 'sound/effects/pageturn2.ogg', 50, TRUE) /**Called by timer when the tape line falls back in place. */ @@ -433,7 +434,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar //mapper type /obj/structure/tape_barricade/police - icon_state = "tape_h_0" + icon_state = "tape_door_0" color = COLOR_RED tape_template = /decl/barricade_tape_template/police @@ -452,7 +453,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar //mapper type /obj/structure/tape_barricade/engineering - icon_state = "tape_h_0" + icon_state = "stripetape_door_0" color = COLOR_ORANGE tape_template = /decl/barricade_tape_template/engineering diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 441e133d5c1..04dba8b0567 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -8,8 +8,8 @@ item_state = "paper" throw_speed = 4 throw_range = 20 - origin_tech = "{'wormholes':4}" - material = /decl/material/solid/cardboard //#TODO: Replace with paper + origin_tech = @'{"wormholes":4}' + material = /decl/material/solid/organic/paper /obj/item/teleportation_scroll/attack_self(mob/user) var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index bca53240384..3342015c383 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -61,7 +61,7 @@ throw_speed = 1 throw_range = 4 w_class = ITEM_SIZE_HUGE - origin_tech = "{'materials':2}" + origin_tech = @'{"materials":2}' material = /decl/material/solid/fiberglass matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) attack_verb = list("shoved", "bashed") @@ -122,9 +122,9 @@ throw_speed = 10 throw_range = 20 w_class = ITEM_SIZE_HUGE - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/wood = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/wood = MATTER_AMOUNT_REINFORCEMENT) attack_verb = list("shoved", "bashed") /obj/item/shield/buckler/handle_shield(mob/user) @@ -151,7 +151,7 @@ throw_speed = 1 throw_range = 4 w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':4,'magnets':3,'esoteric':4}" + origin_tech = @'{"materials":4,"magnets":3,"esoteric":4}' attack_verb = list("shoved", "bashed") material = /decl/material/solid/metal/titanium matter = list( diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index d3f83769f1c..6ea54072f55 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -12,7 +12,7 @@ throwforce = 0 throw_speed = 4 throw_range = 20 - material = /decl/material/liquid/cleaner + material = /decl/material/liquid/cleaner/soap max_health = 5 var/key_data @@ -45,9 +45,11 @@ /obj/item/soap/proc/wet() reagents.add_reagent(/decl/material/liquid/cleaner, SOAP_CLEANER_ON_WET) -/obj/item/soap/Crossed(var/mob/living/AM) - if(istype(AM)) - AM.slip("the [src.name]", 3) +/obj/item/soap/Crossed(atom/movable/AM) + if(!isliving(AM)) + return + var/mob/living/M = AM + M.slip("the [src.name]", 3) /obj/item/soap/afterattack(atom/target, mob/user, proximity) if(!proximity) return @@ -103,13 +105,15 @@ /obj/item/soap/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/key)) - if(!key_data) + if(key_data) + to_chat(user, SPAN_WARNING("\The [src] already has a key imprint.")) + else to_chat(user, SPAN_NOTICE("You imprint \the [I] into \the [src].")) var/obj/item/key/K = I key_data = K.key_data update_icon() - return - ..() + return TRUE + return ..() /obj/item/soap/on_update_icon() . = ..() diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index c4204e7c57d..1aff6c13438 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -9,15 +9,15 @@ throw_range = 5 w_class = ITEM_SIZE_SMALL attack_verb = list("bludgeoned", "whacked", "disciplined") - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/staff/broom name = "broom" desc = "Used for sweeping, and flying into the night while cackling. Black cat not included." icon = 'icons/obj/wizard.dmi' icon_state = "broom" - material = /decl/material/solid/wood - matter = list(/decl/material/solid/cloth = MATTER_AMOUNT_SECONDARY) + material = /decl/material/solid/organic/wood + matter = list(/decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY) /obj/item/staff/gentcane name = "gentleman's cane" @@ -25,5 +25,5 @@ icon = 'icons/obj/items/cane.dmi' icon_state = "cane" item_state = "stick" - material = /decl/material/solid/wood/ebony - matter = list(/decl/material/solid/bone = MATTER_AMOUNT_TRACE) //No ivory material :c + material = /decl/material/solid/organic/wood/ebony + matter = list(/decl/material/solid/organic/bone = MATTER_AMOUNT_TRACE) //No ivory material :c diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index ef14a59da2c..7cad1db67d4 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -13,7 +13,7 @@ max_w_class = ITEM_SIZE_LARGE max_storage_space = DEFAULT_BACKPACK_STORAGE open_sound = 'sound/effects/storage/unzip.ogg' - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth //Cannot be washed :( /obj/item/storage/backpack/can_contaminate() @@ -41,7 +41,7 @@ /obj/item/storage/backpack/holding name = "bag of holding" desc = "A backpack that opens into a localized pocket of Blue Space." - origin_tech = "{'wormholes':4}" + origin_tech = @'{"wormholes":4}' icon = 'icons/obj/items/storage/backpack/backpack_holding.dmi' max_w_class = ITEM_SIZE_NORMAL max_storage_space = 56 @@ -49,7 +49,7 @@ matter = list( /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/storage/backpack/holding/singularity_act(S, current_size) @@ -77,7 +77,7 @@ matter = list( /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/storage/backpack/santabag @@ -338,7 +338,7 @@ /obj/item/storage/backpack/satchel/flat name = "smuggler's satchel" desc = "A very slim satchel that can easily fit into tight spaces." - level = 1 + level = LEVEL_BELOW_PLATING w_class = ITEM_SIZE_NORMAL //Can fit in backpacks itself. storage_slots = 5 max_w_class = ITEM_SIZE_NORMAL @@ -351,7 +351,7 @@ /obj/item/crowbar ) -/obj/item/storage/backpack/satchel/flat/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/item/storage/backpack/satchel/flat/handle_mouse_drop(atom/over, mob/user, params) var/turf/T = get_turf(src) if(hides_under_flooring() && isturf(T) && !T.is_plating()) return TRUE @@ -385,7 +385,7 @@ I.appearance_flags |= RESET_COLOR add_overlay(I) -/obj/item/storage/backpack/ert/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/storage/backpack/ert/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && slot == slot_back_str && marking_state) var/image/I = image(overlay.icon, "[overlay.icon_state]-[marking_state]") I.color = marking_colour diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 465075772d7..68506540ff9 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -6,7 +6,7 @@ allow_quick_empty = 1 use_to_pickup = 1 slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW /obj/item/storage/bag/handle_item_insertion(obj/item/W, prevent_warning = 0) @@ -70,12 +70,12 @@ max_storage_space = 56 desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." icon_state = "bluetrashbag" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE ) - origin_tech = "{'exoticmatter':5,'materials':6}" + origin_tech = @'{"exoticmatter":5,"materials":6}' /obj/item/storage/bag/trash/advanced/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/storage/backpack/holding) || istype(W, /obj/item/storage/bag/trash/advanced)) @@ -113,7 +113,7 @@ max_w_class = ITEM_SIZE_HUGE w_class = ITEM_SIZE_SMALL can_hold = list(/obj/item/coin, /obj/item/cash) - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth /obj/item/storage/bag/cash/filled/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 664d03fa14b..0ad1cc17e9c 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -11,7 +11,7 @@ max_w_class = ITEM_SIZE_NORMAL slot_flags = SLOT_LOWER_BODY attack_verb = list("whipped", "lashed", "disciplined") - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth var/overlay_flags /obj/item/storage/belt/get_associated_equipment_slots() @@ -39,11 +39,11 @@ add_overlay(cur_overlays) update_clothing_icon() -/obj/item/storage/belt/get_mob_overlay(mob/user_mob, slot, bodypart) +/obj/item/storage/belt/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE) var/image/ret = ..() if(ret && slot == slot_belt_str && length(contents)) for(var/obj/item/I in contents) - var/image/new_overlay = I.get_mob_overlay(user_mob, slot, bodypart) + var/image/new_overlay = I.get_mob_overlay(user_mob, slot, bodypart, use_fallback_if_icon_missing) if(new_overlay) ret.overlays += new_overlay return ret @@ -132,7 +132,7 @@ /obj/item/hand_labeler, /obj/item/clothing/gloves ) - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/storage/belt/utility/full/WillContain() return list( @@ -440,8 +440,8 @@ max_w_class = ITEM_SIZE_SMALL max_storage_space = ITEM_SIZE_SMALL * 4 slot_flags = SLOT_LOWER_BODY | SLOT_BACK - material = /decl/material/solid/cloth - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/cloth + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) /obj/item/storage/belt/waistpack/big name = "large waist pack" diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 5b217e03124..452c2ecf26c 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -8,7 +8,10 @@ w_class = ITEM_SIZE_NORMAL max_w_class = ITEM_SIZE_SMALL max_storage_space = 4 - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/paper + matter = list( + /decl/material/solid/organic/cardboard = MATTER_AMOUNT_REINFORCEMENT + ) var/renamed = 0 var/icon_changed = 0 diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 0184f646b63..550a1ce233a 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -27,7 +27,7 @@ item_state = "syringe_kit" max_storage_space = DEFAULT_BOX_STORAGE use_sound = 'sound/effects/storage/box.ogg' - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard obj_flags = OBJ_FLAG_HOLLOW var/foldable = /obj/item/stack/material/cardstock // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard @@ -438,12 +438,9 @@ /obj/item/storage/box/matches/attackby(obj/item/flame/match/W, mob/user) if(istype(W) && !W.lit && !W.burnt) - W.lit = 1 - W.damtype = "burn" - W.update_icon() - START_PROCESSING(SSobj, W) + W.light() playsound(src.loc, 'sound/items/match.ogg', 60, 1, -4) - user.visible_message("[user] strikes the match on the matchbox.") + user.visible_message(SPAN_NOTICE("[user] strikes [W] on \the [src]."), SPAN_NOTICE("You strike [W] on \the [src].")) W.update_icon() return @@ -526,6 +523,13 @@ /obj/item/storage/box/greenglowsticks/WillContain() return list(/obj/item/flashlight/flare/glowstick = 6) +/obj/item/storage/box/flares + name = "box of flares" + icon_state = "box" + +/obj/item/storage/box/flares/WillContain() + return list(/obj/item/flashlight/flare = 6) + /obj/item/storage/box/freezer name = "portable freezer" desc = "This nifty shock-resistant device will keep your 'groceries' nice and non-spoiled." @@ -549,11 +553,11 @@ icon_state = "checkers" max_storage_space = 24 foldable = null - can_hold = list(/obj/item/chems/food/checker) + can_hold = list(/obj/item/checker) /obj/item/storage/box/checkers/WillContain() return list( - /obj/item/chems/food/checker = 12, - /obj/item/chems/food/checker/red = 12 + /obj/item/checker = 12, + /obj/item/checker/red = 12 ) /obj/item/storage/box/checkers/chess @@ -562,12 +566,12 @@ icon_state = "chess_b" /obj/item/storage/box/checkers/chess/WillContain() return list( - /obj/item/chems/food/checker/pawn = 8, - /obj/item/chems/food/checker/knight = 2, - /obj/item/chems/food/checker/bishop = 2, - /obj/item/chems/food/checker/rook = 2, - /obj/item/chems/food/checker/queen = 1, - /obj/item/chems/food/checker/king = 1 + /obj/item/checker/pawn = 8, + /obj/item/checker/knight = 2, + /obj/item/checker/bishop = 2, + /obj/item/checker/rook = 2, + /obj/item/checker/queen = 1, + /obj/item/checker/king = 1 ) /obj/item/storage/box/checkers/chess/red @@ -576,12 +580,12 @@ icon_state = "chess_r" /obj/item/storage/box/checkers/chess/red/WillContain() return list( - /obj/item/chems/food/checker/pawn/red = 8, - /obj/item/chems/food/checker/knight/red = 2, - /obj/item/chems/food/checker/bishop/red = 2, - /obj/item/chems/food/checker/rook/red = 2, - /obj/item/chems/food/checker/queen/red = 1, - /obj/item/chems/food/checker/king/red = 1 + /obj/item/checker/pawn/red = 8, + /obj/item/checker/knight/red = 2, + /obj/item/checker/bishop/red = 2, + /obj/item/checker/rook/red = 2, + /obj/item/checker/queen/red = 1, + /obj/item/checker/king/red = 1 ) diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 9517728db54..0e473e6530c 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -11,5 +11,5 @@ w_class = ITEM_SIZE_HUGE max_w_class = ITEM_SIZE_NORMAL max_storage_space = DEFAULT_BACKPACK_STORAGE - material = /decl/material/solid/leather/synth - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY) \ No newline at end of file + material = /decl/material/solid/organic/leather/synth + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index c7ea96dbd93..5431e31cee7 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -13,7 +13,7 @@ item_state = "syringe_kit" //placeholder, many of these don't have inhands opened = 0 //if an item has been removed from this container obj_flags = OBJ_FLAG_HOLLOW - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard var/obj/item/key_type //path of the key item that this "fancy" container is meant to store /obj/item/storage/fancy/on_update_icon() @@ -52,7 +52,6 @@ /obj/item/chems/food/egg, /obj/item/chems/food/boiledegg ) - material = /decl/material/solid/cardboard /obj/item/storage/fancy/egg_box/WillContain() return list(/obj/item/chems/food/egg = 12) @@ -73,7 +72,6 @@ w_class = ITEM_SIZE_SMALL key_type = /obj/item/chems/food/cracker can_hold = list(/obj/item/chems/food/cracker) - material = /decl/material/solid/cardboard /obj/item/storage/fancy/crackers/WillContain() return list(/obj/item/chems/food/cracker = 6) @@ -91,7 +89,6 @@ max_w_class = ITEM_SIZE_TINY max_storage_space = 6 key_type = /obj/item/pen/crayon - material = /decl/material/solid/cardboard /obj/item/storage/fancy/crayons/WillContain() return list( @@ -127,9 +124,8 @@ max_storage_space = 6 throwforce = 2 slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/cardboard key_type = /obj/item/clothing/mask/smokable/cigarette - atom_flags = ATOM_FLAG_NO_REACT | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_TEMP_CHANGE + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE | ATOM_FLAG_OPEN_CONTAINER /obj/item/storage/fancy/cigarettes/WillContain() return list(/obj/item/clothing/mask/smokable/cigarette = 6) @@ -304,9 +300,9 @@ throwforce = 2 slot_flags = SLOT_LOWER_BODY storage_slots = 7 - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany key_type = /obj/item/clothing/mask/smokable/cigarette/cigar - atom_flags = ATOM_FLAG_NO_REACT | ATOM_FLAG_NO_TEMP_CHANGE + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE /obj/item/storage/fancy/cigar/Initialize(ml, material_key) . = ..() @@ -331,12 +327,12 @@ */ /obj/item/storage/fancy/vials icon = 'icons/obj/vialbox.dmi' - icon_state = "vialbox" + icon_state = "vialbox0" name = "vial storage box" w_class = ITEM_SIZE_NORMAL max_w_class = ITEM_SIZE_TINY storage_slots = 12 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic key_type = /obj/item/chems/glass/beaker/vial /obj/item/storage/fancy/vials/WillContain() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 83e4cb90dc2..c4eefbcd45c 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -18,7 +18,7 @@ max_storage_space = DEFAULT_BOX_STORAGE use_sound = 'sound/effects/storage/box.ogg' obj_flags = OBJ_FLAG_HOLLOW - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/storage/firstaid/empty icon_state = "firstaid" diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 79771a3cbf2..63702e3fbf9 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -23,7 +23,8 @@ SHOULD_CALL_PARENT(FALSE) return TRUE //make sure this is never picked up -/obj/item/storage/internal/mob_can_equip(mob/M, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) +/obj/item/storage/internal/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) + SHOULD_CALL_PARENT(FALSE) return FALSE //make sure this is never picked up //Helper procs to cleanly implement internal storages - storage items that provide inventory slots for other items. @@ -35,7 +36,7 @@ //items that use internal storage have the option of calling this to emulate default storage handle_mouse_drop behaviour. //returns 1 if the master item's parent's handle_mouse_drop() should be called, 0 otherwise. It's strange, but no other way of //doing it without the ability to call another proc's parent, really. -/obj/item/storage/internal/proc/handle_storage_internal_mouse_drop(mob/user, obj/over_object) +/obj/item/storage/internal/proc/handle_storage_internal_mouse_drop(mob/user, obj/over_object, params) if (ishuman(user) || issmall(user)) //so monkeys can take off their backpacks -- Urist if(over_object == user && Adjacent(user)) // this must come before the screen objects only block diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index da3b91e3d75..3d23489d23d 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -18,7 +18,7 @@ allow_quick_empty = 1 allow_quick_gather = 1 collection_mode = 1 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW var/linked @@ -56,7 +56,7 @@ else icon_state = "laundry-empty" -/obj/item/storage/laundry_basket/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/item/storage/laundry_basket/handle_mouse_drop(atom/over, mob/user, params) if(over == user) return TRUE . = ..() diff --git a/code/game/objects/items/weapons/storage/lunchbox.dm b/code/game/objects/items/weapons/storage/lunchbox.dm index 553e9169fb5..61cb87867c1 100644 --- a/code/game/objects/items/weapons/storage/lunchbox.dm +++ b/code/game/objects/items/weapons/storage/lunchbox.dm @@ -1,14 +1,13 @@ /obj/item/storage/lunchbox max_storage_space = 8 //slightly smaller than a toolbox name = "rainbow lunchbox" - icon = 'icons/obj/items/storage/lunchbox.dmi' - icon_state = "lunchbox_rainbow" - item_state = "toolbox_pink" desc = "A little lunchbox. This one is the colors of the rainbow!" + icon = 'icons/obj/items/storage/lunchboxes/lunchbox_rainbow.dmi' + icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_NORMAL max_w_class = ITEM_SIZE_SMALL attack_verb = list("lunched") - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/tmp/filled = FALSE /obj/item/storage/lunchbox/WillContain() @@ -29,8 +28,7 @@ /obj/item/storage/lunchbox/heart name = "heart lunchbox" - icon_state = "lunchbox_lovelyhearts" - item_state = "toolbox_pink" + icon = 'icons/obj/items/storage/lunchboxes/lunchbox_heart.dmi' desc = "A little lunchbox. This one has cute little hearts on it!" /obj/item/storage/lunchbox/heart/filled @@ -38,8 +36,7 @@ /obj/item/storage/lunchbox/cat name = "cat lunchbox" - icon_state = "lunchbox_sciencecatshow" - item_state = "toolbox_green" + icon = 'icons/obj/items/storage/lunchboxes/lunchbox_cat.dmi' desc = "A little lunchbox. This one has a cute little science cat from a popular show on it!" /obj/item/storage/lunchbox/cat/filled @@ -47,8 +44,7 @@ /obj/item/storage/lunchbox/mars name = "\improper Mariner University lunchbox" - icon_state = "lunchbox_marsuniversity" - item_state = "toolbox_red" + icon = 'icons/obj/items/storage/lunchboxes/lunchbox_mars.dmi' desc = "A little lunchbox. This one is branded with the Mariner university logo!" /obj/item/storage/lunchbox/mars/filled @@ -56,8 +52,7 @@ /obj/item/storage/lunchbox/cti name = "\improper CTI lunchbox" - icon_state = "lunchbox_cti" - item_state = "toolbox_blue" + icon = 'icons/obj/items/storage/lunchboxes/lunchbox_cti.dmi' desc = "A little lunchbox. This one is branded with the CTI logo!" /obj/item/storage/lunchbox/cti/filled @@ -65,8 +60,7 @@ /obj/item/storage/lunchbox/syndicate name = "black and red lunchbox" - icon_state = "lunchbox_syndie" - item_state = "toolbox_syndi" + icon = 'icons/obj/items/storage/lunchboxes/lunchbox_evil.dmi' desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!" /obj/item/storage/lunchbox/syndicate/filled diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index 40ce1fd188a..16473aaaae6 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -12,7 +12,7 @@ Single Use Emergency Pouches icon_state = "pack0" opened = FALSE open_sound = 'sound/effects/rip1.ogg' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/injury_type = "generic" var/static/image/cross_overlay var/instructions = {" diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index 15b9270dd07..4105247582d 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -3,7 +3,7 @@ desc = "It's a small bag with dice inside." icon = 'icons/obj/dice.dmi' icon_state = "dicebag" - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/storage/pill_bottle/dice/WillContain() return list(/obj/item/dice = 7) @@ -42,7 +42,7 @@ for(var/obj/item/chems/food/donut/D in contents) LAZYADD(cur_overlays, overlay_image('icons/obj/food.dmi', "[i][D.overlay_state]", flags = RESET_COLOR)) i++ - + if(LAZYLEN(cur_overlays)) add_overlay(cur_overlays) @@ -61,7 +61,7 @@ max_storage_space = 10 throwforce = 2 slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/storage/cigpaper/WillContain() return list(/obj/item/paper/cig = 10) @@ -156,7 +156,7 @@ //non-tobacco /obj/item/storage/chewables/candy - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/storage/chewables/candy/cookies name = "pack of Getmore Cookies" diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index a5e16de4a3d..312251fc463 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -11,7 +11,7 @@ MRE Stuff max_w_class = ITEM_SIZE_SMALL opened = FALSE open_sound = 'sound/effects/rip1.ogg' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW var/main_meal = /obj/item/storage/mrebag var/meal_desc = "This one is menu 1, meat pizza." @@ -141,7 +141,7 @@ MRE Stuff max_w_class = ITEM_SIZE_SMALL opened = FALSE open_sound = 'sound/effects/bubbles.ogg' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/aluminium = MATTER_AMOUNT_TRACE) /obj/item/storage/mrebag/WillContain() diff --git a/code/game/objects/items/weapons/storage/picnic_basket.dm b/code/game/objects/items/weapons/storage/picnic_basket.dm index ef45022f90a..aef3686d151 100644 --- a/code/game/objects/items/weapons/storage/picnic_basket.dm +++ b/code/game/objects/items/weapons/storage/picnic_basket.dm @@ -8,7 +8,7 @@ max_w_class = ITEM_SIZE_NORMAL max_storage_space = DEFAULT_BOX_STORAGE attack_verb = list("picnics") - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/tmp/filled = FALSE /obj/item/storage/picnic_basket/WillContain() diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index a4568059e69..616f994091c 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -34,7 +34,7 @@ . = ..() -/obj/item/storage/secure/handle_mouse_drop(atom/over, mob/user) +/obj/item/storage/secure/handle_mouse_drop(atom/over, mob/user, params) var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) if(lock.locked) add_fingerprint(user) @@ -89,7 +89,7 @@ max_w_class = ITEM_SIZE_NORMAL max_storage_space = DEFAULT_BACKPACK_STORAGE use_sound = 'sound/effects/storage/briefcase.ogg' - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) /obj/item/storage/secure/briefcase/attack_hand(mob/user as mob) if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) diff --git a/code/game/objects/items/weapons/storage/specialized.dm b/code/game/objects/items/weapons/storage/specialized.dm index 28be42f14ea..3ffa5161fbc 100644 --- a/code/game/objects/items/weapons/storage/specialized.dm +++ b/code/game/objects/items/weapons/storage/specialized.dm @@ -22,7 +22,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE use_to_pickup = TRUE - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather // ----------------------------- @@ -48,7 +48,7 @@ allow_quick_empty = TRUE use_to_pickup = TRUE material = /decl/material/solid/metal/stainlesssteel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) // ----------------------------- // Plant bag @@ -71,7 +71,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE use_to_pickup = TRUE - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather // ----------------------------- @@ -86,7 +86,7 @@ icon = 'icons/obj/mining.dmi' icon_state = "sheetsnatcher" desc = "A patented storage system designed for any kind of mineral sheet." - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic storage_ui = /datum/storage_ui/default/sheetsnatcher var/capacity = 300; //the number of sheets it can carry. diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 7d351f2a05b..2f070bc69e9 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -33,20 +33,10 @@ QDEL_NULL(storage_ui) . = ..() -/obj/item/storage/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen)) || ..() - -/obj/item/storage/handle_mouse_drop(var/atom/over, var/mob/user) - if(canremove && (ishuman(user) || isrobot(user) || isanimal(user)) && !user.incapacitated(INCAPACITATION_DISRUPTED)) - if(over == user) - open(user) - return TRUE - if(istype(over, /obj/screen/inventory) && loc == user) - var/obj/screen/inventory/inv = over - add_fingerprint(usr) - if(user.try_unequip(src)) - user.equip_to_slot_if_possible(src, inv.slot_id) - return TRUE +/obj/item/storage/handle_mouse_drop(atom/over, mob/user, params) + if(canremove && (ishuman(user) || isrobot(user) || isanimal(user)) && !user.incapacitated(INCAPACITATION_DISRUPTED) && over == user) + open(user) + return TRUE . = ..() /obj/item/storage/proc/return_inv() @@ -328,7 +318,7 @@ remove_from_storage(I, T, 1) finish_bulk_removal() -/obj/item/storage/receive_mouse_drop(atom/dropping, mob/living/user) +/obj/item/storage/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && scoop_inside(dropping, user)) return TRUE diff --git a/code/game/objects/items/weapons/storage/storage_ui/default.dm b/code/game/objects/items/weapons/storage/storage_ui/default.dm index 1df98a6248d..6aeff5eecbc 100644 --- a/code/game/objects/items/weapons/storage/storage_ui/default.dm +++ b/code/game/objects/items/weapons/storage/storage_ui/default.dm @@ -1,58 +1,24 @@ /datum/storage_ui/default var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage + var/obj/screen/storage/boxes/boxes + var/obj/screen/storage/close/closer + var/obj/screen/storage/start/storage_start //storage UI + var/obj/screen/storage/cont/storage_continue + var/obj/screen/storage/end/storage_end + var/obj/screen/stored_start/stored_start + var/obj/screen/stored_cont/stored_continue + var/obj/screen/stored_end/stored_end - var/obj/screen/storage/boxes - var/obj/screen/storage/storage_start //storage UI - var/obj/screen/storage/storage_continue - var/obj/screen/storage/storage_end - var/obj/screen/storage/stored_start - var/obj/screen/storage/stored_continue - var/obj/screen/storage/stored_end - var/obj/screen/close/closer - -#define storage_ui_default "LEFT+7,BOTTOM+7 to LEFT+10,BOTTOM+8" /datum/storage_ui/default/New(var/storage) ..() - boxes = new /obj/screen/storage( ) - boxes.SetName("storage") - boxes.master = storage - boxes.icon_state = "block" - boxes.screen_loc = storage_ui_default - boxes.layer = HUD_BASE_LAYER - - storage_start = new /obj/screen/storage( ) - storage_start.SetName("storage") - storage_start.master = storage - storage_start.icon_state = "storage_start" - storage_start.screen_loc = storage_ui_default - storage_start.layer = HUD_BASE_LAYER - storage_continue = new /obj/screen/storage( ) - storage_continue.SetName("storage") - storage_continue.master = storage - storage_continue.icon_state = "storage_continue" - storage_continue.screen_loc = storage_ui_default - storage_continue.layer = HUD_BASE_LAYER - storage_end = new /obj/screen/storage( ) - storage_end.SetName("storage") - storage_end.master = storage - storage_end.icon_state = "storage_end" - storage_end.screen_loc = storage_ui_default - storage_end.layer = HUD_BASE_LAYER - - stored_start = new /obj //we just need these to hold the icon - stored_start.icon_state = "stored_start" - stored_start.layer = HUD_BASE_LAYER - stored_continue = new /obj - stored_continue.icon_state = "stored_continue" - stored_continue.layer = HUD_BASE_LAYER - stored_end = new /obj - stored_end.icon_state = "stored_end" - stored_end.layer = HUD_BASE_LAYER - - closer = new /obj/screen/close( ) - closer.master = storage - closer.icon_state = "x" - closer.layer = HUD_BASE_LAYER + boxes = new(null, null, null, null, null, storage) + storage_start = new(null, null, null, null, null, storage) + storage_continue = new(null, null, null, null, null, storage) + storage_end = new(null, null, null, null, null, storage) + closer = new(null, null, null, null, null, storage) + stored_start = new + stored_continue = new + stored_end = new /datum/storage_ui/default/Destroy() close_all() diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 3042ff6067c..da51725b5c5 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -1,9 +1,8 @@ /obj/item/storage/toolbox name = "toolbox" desc = "Bright red toolboxes like these are one of the most common sights in maintenance corridors on virtually every ship in the galaxy." - icon = 'icons/obj/items/storage/toolbox.dmi' - icon_state = "red" - item_state = "toolbox_red" + icon = 'icons/obj/items/storage/toolboxes/toolbox_red.dmi' + icon_state = ICON_STATE_WORLD obj_flags = OBJ_FLAG_CONDUCTIBLE force = 20 attack_cooldown = 21 @@ -14,7 +13,7 @@ w_class = ITEM_SIZE_LARGE max_w_class = ITEM_SIZE_NORMAL max_storage_space = DEFAULT_LARGEBOX_STORAGE //enough to hold all starting contents - origin_tech = "{'combat':1}" + origin_tech = @'{"combat":1}' attack_verb = list("robusted") use_sound = 'sound/effects/storage/toolbox.ogg' material = /decl/material/solid/metal/aluminium @@ -35,8 +34,7 @@ /obj/item/storage/toolbox/mechanical name = "mechanical toolbox" desc = "Bright blue toolboxes like these are one of the most common sights in maintenance corridors on virtually every ship in the galaxy." - icon_state = "blue" - item_state = "toolbox_blue" + icon = 'icons/obj/items/storage/toolboxes/toolbox_blue.dmi' /obj/item/storage/toolbox/mechanical/WillContain() return list( @@ -51,8 +49,8 @@ /obj/item/storage/toolbox/electrical name = "electrical toolbox" desc = "Bright yellow toolboxes like these are one of the most common sights in maintenance corridors on virtually every ship in the galaxy." - icon_state = "yellow" - item_state = "toolbox_yellow" + icon = 'icons/obj/items/storage/toolboxes/toolbox_yellow.dmi' + /obj/item/storage/toolbox/electrical/WillContain() return list( @@ -67,9 +65,8 @@ /obj/item/storage/toolbox/syndicate name = "black and red toolbox" desc = "A toolbox in black, with stylish red trim. This one feels particularly heavy, yet balanced." - icon_state = "syndicate" - item_state = "toolbox_syndi" - origin_tech = "{'combat':1,'esoteric':1}" + icon = 'icons/obj/items/storage/toolboxes/toolbox_black_red.dmi' + origin_tech = @'{"combat":1,"esoteric":1}' attack_cooldown = 10 /obj/item/storage/toolbox/syndicate/WillContain() @@ -95,8 +92,7 @@ /obj/item/storage/toolbox/repairs name = "electronics toolbox" desc = "A box full of boxes, with electrical machinery parts and tools needed to get them where they're needed." - icon_state = "yellow_striped" - item_state = "toolbox_yellow" + icon = 'icons/obj/items/storage/toolboxes/toolbox_yellow_striped.dmi' /obj/item/storage/toolbox/repairs/WillContain() return list( diff --git a/code/game/objects/items/weapons/storage/trays.dm b/code/game/objects/items/weapons/storage/trays.dm index fd8e99d9934..9b81b952fda 100644 --- a/code/game/objects/items/weapons/storage/trays.dm +++ b/code/game/objects/items/weapons/storage/trays.dm @@ -16,9 +16,8 @@ use_to_pickup = 1 allow_quick_gather = 1 use_sound = null - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - var/cooldown = 0 //Cooldown for banging the tray with a rolling pin. based on world.time. very silly var/no_drop = FALSE @@ -153,7 +152,7 @@ TRAY TYPES GO HERE /obj/item/storage/tray/wood name = "tray" //material names are automatic kay? desc = "A wooden tray to serve food on." - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/storage/tray/metal obj_flags = OBJ_FLAG_CONDUCTIBLE diff --git a/code/game/objects/items/weapons/storage/wall_mirror.dm b/code/game/objects/items/weapons/storage/wall_mirror.dm index 22077ccc64e..4ae11605eb1 100644 --- a/code/game/objects/items/weapons/storage/wall_mirror.dm +++ b/code/game/objects/items/weapons/storage/wall_mirror.dm @@ -10,7 +10,7 @@ var/shattered = FALSE var/list/ui_users var/obj/item/storage/internal/mirror_storage/mirror_storage - directional_offset = "{'NORTH':{'y':-29}, 'SOUTH':{'y':29}, 'EAST':{'x':29}, 'WEST':{'x':-29}}" + directional_offset = @'{"NORTH":{"y":-29}, "SOUTH":{"y":29}, "EAST":{"x":29}, "WEST":{"x":-29}}' obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED /obj/structure/mirror/Initialize() @@ -45,8 +45,8 @@ clear_ui_users(ui_users) . = ..() -/obj/structure/mirror/handle_mouse_drop(atom/over, mob/user) - if(!(. = mirror_storage?.handle_storage_internal_mouse_drop(user, over))) +/obj/structure/mirror/handle_mouse_drop(atom/over, mob/user, params) + if(!(. = mirror_storage?.handle_storage_internal_mouse_drop(user, over, params))) flick("mirror_open",src) return if((. = ..())) @@ -103,7 +103,7 @@ desc = "A SalonPro Nano-Mirror(TM) brand mirror! Now a portable version." icon = 'icons/obj/items/mirror.dmi' icon_state = "mirror" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/glass = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_SECONDARY diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index e66e54200cf..74b5a06e881 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -43,7 +43,7 @@ /obj/item/clothing/accessory/armor/tag, ) slot_flags = SLOT_ID - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather var/obj/item/card/id/front_id = null var/obj/item/charge_stick/front_stick = null @@ -87,9 +87,9 @@ tiny_state = "id-"+front_id.icon_state add_overlay(overlay_image(icon, tiny_state, flags = RESET_COLOR)) -/obj/item/storage/wallet/GetIdCards() +/obj/item/storage/wallet/GetIdCards(list/exceptions) . = ..() - if(istype(front_id)) + if(istype(front_id) && !is_type_in_list(front_id, exceptions)) LAZYDISTINCTADD(., front_id) /obj/item/storage/wallet/GetChargeStick() @@ -148,7 +148,7 @@ /decl/interaction_handler/remove_id/wallet/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && ishuman(user) - + /decl/interaction_handler/remove_id/wallet/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/storage/wallet/W = target var/obj/item/card/id/id = W.GetIdCard() diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 7921cdf5efb..637ce63e363 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -10,47 +10,46 @@ edge = 0 throwforce = 7 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'combat':2}" + origin_tech = @'{"combat":2}' attack_verb = list("beaten") base_parry_chance = 30 material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, ) + item_flags = ITEM_FLAG_IS_WEAPON var/stunforce = 0 var/agonyforce = 30 var/status = 0 //whether the thing is on or not - var/obj/item/cell/bcell var/hitcost = 7 -/obj/item/baton/loaded - bcell = /obj/item/cell/device/high - -/obj/item/baton/Initialize(var/ml) +/obj/item/baton/Initialize(var/ml, var/material_key, var/loaded_cell_type) . = ..(ml) - if(ispath(bcell)) - bcell = new bcell(src) - update_icon() + setup_power_supply(loaded_cell_type) -/obj/item/baton/Destroy() - if(bcell && !ispath(bcell)) - qdel(bcell) - bcell = null - return ..() +/obj/item/baton/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + . = ..(loaded_cell_type, /obj/item/cell/device, /datum/extension/loaded_cell/secured, charge_value) + update_icon() -/obj/item/baton/get_cell() - return bcell +/obj/item/baton/loaded/Initialize(var/ml, var/material_key, var/loaded_cell_type) + return ..(ml, material_key, loaded_cell_type = /obj/item/cell/device/high) + +/obj/item/baton/infinite/Initialize(var/ml, var/material_key, var/loaded_cell_type) + . = ..(ml, material_key, loaded_cell_type = /obj/item/cell/infinite) + set_status(1, null) /obj/item/baton/proc/update_status() - if(bcell.charge < hitcost) + var/obj/item/cell/cell = get_cell() + if(cell?.charge < hitcost) status = 0 update_icon() /obj/item/baton/proc/deductcharge(var/chrgdeductamt) - if(bcell) - if(bcell.checked_use(chrgdeductamt)) + var/obj/item/cell/cell = get_cell() + if(cell) + if(cell.checked_use(chrgdeductamt)) update_status() return 1 else @@ -65,55 +64,24 @@ add_overlay("[icon_state]-active") set_light(1.5, 2, "#ff6a00") else - if(!bcell) + if(!get_cell()) add_overlay("[icon_state]-nocell") set_light(0) -/obj/item/baton/examine(mob/user, distance) - . = ..() - if(distance <= 1) - examine_cell(user) - -// Addition made by Techhead0, thanks for fullfilling the todo! -/obj/item/baton/proc/examine_cell(mob/user) - if(bcell) - to_chat(user, "The baton is [round(bcell.percent())]% charged.") - if(!bcell) - to_chat(user, "The baton does not have a power source installed.") - -/obj/item/baton/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/cell/device)) - if(!bcell && user.try_unequip(W)) - W.forceMove(src) - bcell = W - to_chat(user, "You install a cell into the [src].") - update_icon() - else - to_chat(user, "[src] already has a cell.") - else if(IS_SCREWDRIVER(W)) - if(bcell) - bcell.update_icon() - bcell.dropInto(loc) - bcell = null - to_chat(user, "You remove the cell from the [src].") - status = 0 - update_icon() - else - ..() - /obj/item/baton/attack_self(mob/user) set_status(!status, user) add_fingerprint(user) /obj/item/baton/proc/set_status(var/newstatus, mob/user) - if(bcell && bcell.charge >= hitcost) + var/obj/item/cell/cell = get_cell() + if(cell?.charge >= hitcost) if(status != newstatus) change_status(newstatus) to_chat(user, "[src] is now [status ? "on" : "off"].") playsound(loc, "sparks", 75, 1, -1) else change_status(0) - if(!bcell) + if(!cell) to_chat(user, "[src] does not have a power source!") else to_chat(user, "[src] is out of charge.") @@ -181,19 +149,15 @@ return 1 -/obj/item/baton/emp_act(severity) - if(bcell) - bcell.emp_act(severity) //let's not duplicate code everywhere if we don't have to please. - ..() - // Stunbaton module for Security synthetics /obj/item/baton/robot - bcell = null hitcost = 20 // Addition made by Techhead0, thanks for fullfilling the todo! -/obj/item/baton/robot/examine_cell(mob/user) - to_chat(user, "The baton is running off an external power supply.") +/obj/item/baton/robot/examine(mob/user, distance, infix, suffix) + . = ..() + if(distance == 1) + to_chat(user, SPAN_NOTICE("The baton is running off an external power supply.")) // Override proc for the stun baton module, found in PC Security synthetics // Refactored to fix #14470 - old proc defination increased the hitcost beyond @@ -201,29 +165,25 @@ // Also hard-coded to be unuseable outside their righteous synthetic owners. /obj/item/baton/robot/attack_self(mob/user) var/mob/living/silicon/robot/R = isrobot(user) ? user : null // null if the user is NOT a robot - update_cell(R) // takes both robots and null if (R) return ..() else // Stop pretending and get out of your cardborg suit, human. - to_chat(user, "You don't seem to be able interacting with this by yourself..") + to_chat(user, "You don't seem to be able to interact with this by yourself..") add_fingerprint(user) return 0 /obj/item/baton/robot/attackby(obj/item/W, mob/user) return -/obj/item/baton/robot/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) - update_cell(isrobot(user) ? user : null) // update the status before we apply the effects - return ..() +/obj/item/baton/robot/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + SHOULD_CALL_PARENT(FALSE) + return -// Updates the baton's cell to use user's own cell -// Otherwise, if null (when the user isn't a robot), render it unuseable -/obj/item/baton/robot/proc/update_cell(mob/living/silicon/robot/user) - if (!user) - bcell = null - set_status(0) - else if (!bcell || bcell != user.cell) - bcell = user.cell // if it is null, nullify it anyway +/obj/item/baton/robot/get_cell() + var/mob/living/silicon/robot/holder = loc + if(istype(holder)) + return holder.cell + return ..() // Traitor variant for Engineering synthetics. /obj/item/baton/robot/electrified_arm @@ -254,4 +214,4 @@ hitcost = 25 attack_verb = list("poked") slot_flags = null - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE) \ No newline at end of file + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE) \ No newline at end of file diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 45d0d3c2599..95145f0c8e9 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -20,7 +20,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) obj_flags = OBJ_FLAG_CONDUCTIBLE w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' drop_sound = 'sound/foley/knifedrop3.ogg' /obj/item/retractor/Initialize() @@ -39,7 +39,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) obj_flags = OBJ_FLAG_CONDUCTIBLE w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' attack_verb = list("attacked", "pinched") drop_sound = 'sound/foley/knifedrop3.ogg' @@ -62,7 +62,7 @@ ) obj_flags = OBJ_FLAG_CONDUCTIBLE w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' attack_verb = list("burnt") /obj/item/cautery/Initialize() @@ -83,12 +83,12 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE force = 15.0 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' attack_verb = list("drilled") /obj/item/surgicaldrill/Initialize() . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_DRILL = TOOL_QUALITY_DEFAULT)) + set_extension(src, /datum/extension/tool, list(TOOL_SURGICAL_DRILL = TOOL_QUALITY_DEFAULT)) /* * Scalpel @@ -107,11 +107,11 @@ throwforce = 5 throw_speed = 3 throw_range = 5 - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - pickup_sound = 'sound/foley/knife1.ogg' + pickup_sound = 'sound/foley/knife1.ogg' drop_sound = 'sound/foley/knifedrop3.ogg' var/tool_quality = TOOL_QUALITY_DEFAULT @@ -131,7 +131,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) pickup_sound = 'sound/foley/pickup2.ogg' tool_quality = TOOL_QUALITY_DECENT - origin_tech = "{'biotech':2,'materials':2,'magnets':2}" + origin_tech = @'{"biotech":2,"materials":2,"magnets":2}' /obj/item/scalpel/laser/upgraded name = "upgraded laser scalpel" @@ -143,7 +143,7 @@ /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) tool_quality = TOOL_QUALITY_GOOD - origin_tech = "{'biotech':3,'materials':4,'magnets':4}" + origin_tech = @'{"biotech":3,"materials":4,"magnets":4}' /obj/item/scalpel/laser/advanced name = "advanced laser scalpel" @@ -156,7 +156,7 @@ /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE ) tool_quality = TOOL_QUALITY_BEST - origin_tech = "{'biotech':4,'materials':6,'magnets':5}" + origin_tech = @'{"biotech":4,"materials":6,"magnets":5}' /obj/item/incision_manager name = "incision management system" @@ -175,14 +175,14 @@ /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) pickup_sound = 'sound/foley/pickup2.ogg' - origin_tech = "{'biotech':4,'materials':7,'magnets':5,'programming':4}" + origin_tech = @'{"biotech":4,"materials":7,"magnets":5,"programming":4}' /obj/item/incision_manager/Initialize() . = ..() set_extension(src, /datum/extension/tool/variable, list( TOOL_SAW = TOOL_QUALITY_GOOD, - TOOL_SCALPEL = TOOL_QUALITY_GOOD, - TOOL_RETRACTOR = TOOL_QUALITY_GOOD, + TOOL_SCALPEL = TOOL_QUALITY_GOOD, + TOOL_RETRACTOR = TOOL_QUALITY_GOOD, TOOL_HEMOSTAT = TOOL_QUALITY_GOOD )) @@ -201,7 +201,7 @@ throwforce = 9 throw_speed = 3 throw_range = 5 - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) attack_verb = list("attacked", "slashed", "sawed", "cut") @@ -227,7 +227,7 @@ item_flags = ITEM_FLAG_NO_BLUDGEON obj_flags = OBJ_FLAG_HOLLOW throwforce = 1 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/bonegel/Initialize() . = ..() @@ -240,9 +240,9 @@ icon_state = "fixovein" force = 0 throwforce = 1 - origin_tech = "{'materials':1,'biotech':3}" + origin_tech = @'{"materials":1,"biotech":3}' w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/sutures/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 06fbf6c26db..287810c296c 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -14,7 +14,8 @@ icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY force = 10 - material = /decl/material/solid/wood + item_flags = ITEM_FLAG_IS_WEAPON + material = /decl/material/solid/organic/wood /obj/item/classic_baton/attack(mob/M, mob/living/user) if ((MUTATION_CLUMSY in user.mutations) && prob(50)) @@ -37,6 +38,7 @@ slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_SMALL force = 3 + item_flags = ITEM_FLAG_IS_WEAPON material = /decl/material/solid/metal/aluminium var/on = 0 diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 5c53fdea72a..923c79b1a25 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -13,7 +13,7 @@ action_button_name = "Toggle Jetpack" material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':1,'engineering':3}" + origin_tech = @'{"materials":1,"engineering":3}' /obj/item/tank/jetpack/Initialize() . = ..() @@ -41,7 +41,7 @@ if(on) add_overlay("[icon_state]-on") -/obj/item/tank/jetpack/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/tank/jetpack/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && slot == slot_back_str && on) overlay.icon_state = "[overlay.icon_state]-on" . = ..() diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 79fc3b3cbfc..c969810d8b6 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -10,7 +10,7 @@ amount = 32 max_amount = 32 w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic health = 10 max_health = 10 @@ -156,7 +156,7 @@ icon_state = "tape" w_class = ITEM_SIZE_TINY layer = ABOVE_OBJ_LAYER - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/obj/item/stuck = null var/crumpled = FALSE //If crumpled we become useless trash diff --git a/code/game/objects/items/weapons/tech_disks.dm b/code/game/objects/items/weapons/tech_disks.dm index c74f05d2e00..cd91b56acbe 100644 --- a/code/game/objects/items/weapons/tech_disks.dm +++ b/code/game/objects/items/weapons/tech_disks.dm @@ -3,11 +3,11 @@ /////////////////////////////////////////////////////////////////////////////// /obj/item/disk name = "data disk" - desc = "A standard 3.5 inches floppy disk for storing computer files... What's even an inch?" + desc = "A standard 3.5 inch floppy disk for storing computer files... What's even an inch?" icon = 'icons/obj/items/device/diskette.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_TINY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) throw_range = 10 throw_speed = 6 @@ -31,6 +31,7 @@ if(existing && existing != F) delete_file(F.filename) + F.holder = weakref(src) LAZYSET(stored_files, F.filename, F) free_blocks = clamp(round(free_blocks - F.block_size), 0, block_capacity) return TRUE @@ -55,6 +56,15 @@ LAZYREMOVE(stored_files, name) return TRUE +/**Renames a file's handle on the disk. Does not rename the file itself. */ +/obj/item/disk/proc/rename_file(var/oldname, var/newname, var/force = FALSE) + var/datum/computer_file/data/F = LAZYACCESS(stored_files, oldname) + if(!F || (F.unrenamable && !force)) + return FALSE + stored_files -= oldname + stored_files[newname] = F + return TRUE + /**Like a full disk format. Erase all files, even if write protected! */ /obj/item/disk/proc/delete_all() LAZYCLEARLIST(stored_files) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 206aa606eb9..e95ffde8b89 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -18,7 +18,7 @@ w_class = ITEM_SIZE_SMALL throw_speed = 4 throw_range = 20 - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/aluminium /obj/item/locator/attack_self(mob/user) diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 2f7214e5e35..07f2255a58f 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -8,12 +8,13 @@ attack_cooldown = 2*DEFAULT_WEAPON_COOLDOWN melee_accuracy_bonus = -10 w_class = ITEM_SIZE_SMALL - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' material = /decl/material/solid/metal/steel - center_of_mass = @"{'x':16,'y':20}" + center_of_mass = @'{"x":16,"y":20}' attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") material_alteration = MAT_FLAG_ALTERATION_COLOR drop_sound = 'sound/foley/bardrop1.ogg' + item_flags = ITEM_FLAG_IS_WEAPON var/static/valid_colours = list(COLOR_RED_GRAY, COLOR_MAROON, COLOR_DARK_BROWN, COLOR_GRAY20) var/handle_color var/shape_variations = 1 @@ -71,6 +72,6 @@ /obj/item/crowbar/cheap name = "discount pry bar" desc = "A plastic bar with a wedge. It looks so poorly manufactured that you're sure it will break if you try to use it." - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic w_class = ITEM_SIZE_TINY shape_variations = 6 diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index c6a3dfb128f..15999e9d391 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -2,11 +2,11 @@ name = "screwdriver" desc = "Your archetypal flathead screwdriver, with a nice, heavy polymer handle." icon = 'icons/obj/items/tool/screwdriver.dmi' - icon_state = "screwdriver_preview" + icon_state = "preview" slot_flags = SLOT_LOWER_BODY | SLOT_EARS w_class = ITEM_SIZE_TINY material = /decl/material/solid/metal/steel - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' attack_verb = list("stabbed") lock_picking_level = 5 sharp = TRUE @@ -28,7 +28,7 @@ handle_color = pick(valid_colours) add_overlay(mutable_appearance(icon, "[get_world_inventory_state()]_handle", handle_color)) -/obj/item/screwdriver/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/screwdriver/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) overlay.color = handle_color . = ..() diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index d1ca7fda619..6693b495825 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -8,7 +8,7 @@ icon_state = ICON_STATE_WORLD obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY - center_of_mass = @"{'x':14,'y':15}" + center_of_mass = @'{"x":14,"y":15}' force = 5 throwforce = 5 throw_speed = 1 @@ -16,7 +16,7 @@ w_class = ITEM_SIZE_SMALL material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'engineering':1}" + origin_tech = @'{"engineering":1}' drop_sound = 'sound/foley/tooldrop1.ogg' z_flags = ZMM_MANGLE_PLANES attack_cooldown = DEFAULT_ATTACK_COOLDOWN @@ -52,7 +52,7 @@ if(welding) update_icon() -/obj/item/weldingtool/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/weldingtool/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && welding && check_state_in_icon("[overlay.icon_state]-lit", overlay.icon)) overlay.add_overlay(emissive_overlay(overlay.icon, "[overlay.icon_state]-lit")) . = ..() @@ -194,8 +194,8 @@ if(isliving(O)) var/mob/living/L = O L.IgniteMob() - else if(istype(O)) - O.HandleObjectHeating(src, user, WELDING_TOOL_HOTSPOT_TEMP_ACTIVE) + else if(isatom(O)) + O.handle_external_heating(WELDING_TOOL_HOTSPOT_TEMP_ACTIVE, src, user) if (isturf(location)) location.hotspot_expose(WELDING_TOOL_HOTSPOT_TEMP_ACTIVE, 50, 1) spark_at(get_turf(O), 3, FALSE, O) @@ -228,7 +228,7 @@ if(location) location.hotspot_expose(WELDING_TOOL_HOTSPOT_TEMP_ACTIVE, 5) set_light(5, 0.7, COLOR_LIGHT_CYAN) - addtimer(CALLBACK(src, /atom/proc/update_icon), 5) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 5) return TRUE /**Handle the flame burning fuel while the welder is on */ @@ -245,14 +245,12 @@ if(!(src in L.get_held_items())) fuel_usage = max(fuel_usage, 2) L.IgniteMob() - - else if(isobj(loc)) - var/obj/O = loc - O.HandleObjectHeating(src, null, WELDING_TOOL_HOTSPOT_TEMP_IDLE) - else if(isturf(loc)) var/turf/location = get_turf(src) location.hotspot_expose(WELDING_TOOL_HOTSPOT_TEMP_IDLE, 5) //a bit colder when idling + else if(isatom(loc)) + var/atom/A = loc + A.handle_external_heating(WELDING_TOOL_HOTSPOT_TEMP_IDLE) if(use_fuel(fuel_usage)) return TRUE @@ -432,7 +430,7 @@ return TRUE if(standard_pour_into(user, O)) return TRUE - if(standard_feed_mob(user, O)) + if(handle_eaten_by_mob(user, O) != EATEN_INVALID) return TRUE if(user.a_intent == I_HURT) if(standard_splash_mob(user, O)) @@ -463,11 +461,11 @@ return FALSE . = ..() -/obj/item/chems/welder_tank/standard_feed_mob(mob/user, mob/target) +/obj/item/chems/welder_tank/handle_eaten_by_mob(mob/user, mob/target) if(!can_refuel) to_chat(user, SPAN_DANGER("\The [src] is sealed shut.")) - return FALSE - . = ..() + return EATEN_UNABLE + return ..() /obj/item/chems/welder_tank/get_alt_interactions(var/mob/user) . = ..() diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/weapons/tools/wirecutter.dm index 27ddcc06174..1167dbc43f1 100644 --- a/code/game/objects/items/weapons/tools/wirecutter.dm +++ b/code/game/objects/items/weapons/tools/wirecutter.dm @@ -5,9 +5,9 @@ icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':1,'engineering':1}" + origin_tech = @'{"materials":1,"engineering":1}' material = /decl/material/solid/metal/steel - center_of_mass = @"{'x':18,'y':10}" + center_of_mass = @'{"x":18,"y":10}' attack_verb = list("pinched", "nipped") sharp = 1 edge = 1 @@ -27,7 +27,7 @@ handle_color = pick(valid_colours) add_overlay(overlay_image(icon, "[get_world_inventory_state()]_handle", handle_color, flags=RESET_COLOR)) -/obj/item/wirecutters/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/wirecutters/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) overlay.color = handle_color . = ..() diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 558bc1cdae2..13bd7160c21 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -6,9 +6,9 @@ slot_flags = SLOT_LOWER_BODY material_force_multiplier = 0.2 w_class = ITEM_SIZE_SMALL - origin_tech = "{'materials':1,'engineering':1}" + origin_tech = @'{"materials":1,"engineering":1}' material = /decl/material/solid/metal/steel - center_of_mass = @"{'x':17,'y':16}" + center_of_mass = @'{"x":17,"y":16}' attack_verb = list("bashed", "battered", "bludgeoned", "whacked") material_alteration = MAT_FLAG_ALTERATION_COLOR drop_sound = 'sound/foley/bardrop1.ogg' diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index ea0f47b8c5a..87c3f5e99aa 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -9,7 +9,7 @@ attack_verb = list("whipped") hitsound = 'sound/weapons/towelwhip.ogg' desc = "A soft cotton towel." - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/towel/attack_self(mob/user) if(user.a_intent == I_GRAB) @@ -22,15 +22,43 @@ . = ..() color = get_random_colour() +/obj/item/towel/gold + name = "gold towel" + color = "#ffd700" + +/obj/item/towel/red + name = "red towel" + color = "#ff0000" + +/obj/item/towel/purple + name = "purple towel" + color = "#800080" + +/obj/item/towel/cyan + name = "cyan towel" + color = "#00ffff" + +/obj/item/towel/orange + name = "orange towel" + color = "#ff8c00" + +/obj/item/towel/pink + name = "pink towel" + color = "#ff6666" + +/obj/item/towel/light_blue + name = "light blue towel" + color = "#3fc0ea" + /obj/item/towel/black name = "black towel" color = "#222222" - material = /decl/material/solid/cloth/black + material = /decl/material/solid/organic/cloth/black /obj/item/towel/brown name = "black towel" color = "#854636" - material = /decl/material/solid/cloth/beige + material = /decl/material/solid/organic/cloth/beige /obj/item/towel/fleece // loot from the king of goats. it's a golden towel name = "golden fleece" diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 853419928f3..56243d3d4d3 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -9,7 +9,7 @@ desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." throwforce = 0 w_class = ITEM_SIZE_NORMAL - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel can_buckle = 0 //disallow manual un/buckling var/deployed = 0 @@ -90,20 +90,21 @@ deployed = 0 /obj/item/beartrap/Crossed(atom/movable/AM) - if(deployed && isliving(AM)) - var/mob/living/L = AM - if(!MOVING_DELIBERATELY(L)) - L.visible_message( - "[L] steps on \the [src].", - "You step on \the [src]!", - "You hear a loud metallic snap!" - ) - attack_mob(L) - if(!buckled_mob) - anchored = FALSE - deployed = 0 - update_icon() ..() + if(!deployed || !isliving(AM)) + return + var/mob/living/L = AM + if(MOVING_DELIBERATELY(L)) + return + L.visible_message( + SPAN_DANGER("\The [L] steps on \the [src]."), + SPAN_DANGER("You step on \the [src]!"), + "You hear a loud metallic snap!") + attack_mob(L) + if(!buckled_mob) + anchored = FALSE + deployed = 0 + update_icon() /obj/item/beartrap/on_update_icon() . = ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index bc6132ee8e4..7b4aa541c86 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -6,6 +6,7 @@ item_state = "nullrod" slot_flags = SLOT_LOWER_BODY force = 10 + item_flags = ITEM_FLAG_IS_WEAPON throw_speed = 1 throw_range = 4 throwforce = 7 @@ -116,7 +117,7 @@ anchored = TRUE can_buckle = 0 //no manual buckling or unbuckling - var/health = 25 + max_health = 25 var/countdown = 15 var/temporary = 1 var/mob/living/carbon/captured = null @@ -128,7 +129,7 @@ desc = "An energized net meant to subdue animals." anchored = FALSE - health = 5 + max_health = 5 temporary = 0 min_free_time = 5 max_free_time = 10 diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 59b2c5a1978..7848d0ff55b 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -141,18 +141,6 @@ return TRUE return ..() -/obj/item/chems/weldpack/check_mousedrop_adjacency(atom/over, mob/user) - return (loc == user && istype(over, /obj/screen)) || ..() - -/obj/item/chems/weldpack/handle_mouse_drop(atom/over, mob/user) - if(loc == user && !user.incapacitated()) - if(istype(over, /obj/screen/inventory)) - var/obj/screen/inventory/I = over - if(user.try_unequip(src)) - user.equip_to_slot_if_possible(src, I.slot_id) - return TRUE - return ..() - /obj/item/chems/weldpack/on_update_icon() . = ..() if(is_welder_attached()) diff --git a/code/game/objects/obj_edibility.dm b/code/game/objects/obj_edibility.dm new file mode 100644 index 00000000000..871c7831799 --- /dev/null +++ b/code/game/objects/obj_edibility.dm @@ -0,0 +1,148 @@ +/obj/proc/get_food_consumption_method(mob/eater) + return EATING_METHOD_EAT + +/obj/proc/is_edible(var/mob/eater) + return get_edible_material_amount(eater) > 0 + +/obj/proc/get_edible_material_amount(var/mob/eater) + return 0 + +/obj/proc/get_food_default_transfer_amount(mob/eater) + return eater?.get_eaten_transfer_amount(2) // arbitrary, should be overridden downstream + +/obj/proc/show_food_consumed_message(mob/user, mob/target) + if(user == target) + user?.visible_message( + SPAN_NOTICE("\The [target] finishes eating \the [src]."), + SPAN_NOTICE("You finish eating \the [src].") + ) + else + user?.visible_message( + SPAN_NOTICE("\The [user] feeds the last of \the [src] to \the [target]."), + SPAN_NOTICE("You feed the last of \the [src] to \the [target].") + ) + +/obj/proc/handle_consumed(mob/feeder, mob/eater, consumption_method = EATING_METHOD_EAT) + transfer_eaten_material(eater, get_food_default_transfer_amount(eater)) + play_feed_sound(eater, consumption_method) + if(!get_edible_material_amount(eater)) + if(feeder && eater) + show_food_consumed_message(feeder, eater) + feeder.drop_from_inventory(src) + eater.update_personal_goal(/datum/goal/achievement/specific_object/food, type) + physically_destroyed() + return TRUE + return FALSE + +/obj/proc/transfer_eaten_material(mob/eater, amount) + reagents?.trans_to_mob(eater, amount, CHEM_INGEST) + +/obj/proc/show_feed_message_start(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You begin trying to take a bite from \the [target].")) + else + user.visible_message(SPAN_NOTICE("\The [user] is trying to feed \the [src] to \the [target]!")) + +/obj/proc/show_feed_message_end(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You take a bite of \the [src].")) + else + user.visible_message(SPAN_NOTICE("\The [user] feeds some of \the [src] to \the [target]!")) + +/obj/proc/show_food_inedible_message(mob/user, mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_WARNING("There is nothing in \the [src] that you can eat.")) + else + to_chat(user, SPAN_WARNING("There is nothing in \the [src] that \the [target] can eat.")) + +/obj/proc/show_food_no_mouth_message(mob/user, mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_WARNING("Where do you intend to put \the [src]? You don't have a mouth!")) + else + to_chat(user, SPAN_WARNING("Where do you intend to put \the [src]? \The [target] doesn't have a mouth!")) + +/obj/proc/play_feed_sound(var/mob/user, consumption_method = EATING_METHOD_EAT) + var/turf/play_turf = get_turf(user) + if(!play_turf) + return + switch(consumption_method) + if(EATING_METHOD_EAT) + playsound(user.loc, 'sound/items/eatfood.ogg', rand(10, 50), 1) + if(EATING_METHOD_DRINK) + playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) + +/obj/proc/show_food_empty_message(mob/user, mob/target) + to_chat(user, SPAN_NOTICE("\The [src] is empty.")) + +/obj/proc/is_food_empty(mob/eater) + return get_edible_material_amount(eater) <= 0 + +// General proc for handling an attempt to eat an item, or to eat from an +// item. At time of writing, only handles classic SS13 eating (reagents). +// Returns EATEN_INVALID for an inability to eat, EATEN_UNABLE for an attempt +// prevented by something, and EATEN_SUCCESS for a successful bite. +/obj/proc/handle_eaten_by_mob(var/mob/user, var/mob/target) + + if(!istype(user)) + return EATEN_INVALID + + if(!target) + target = user + + if(!istype(target)) + return EATEN_INVALID + + if(!is_edible(target)) + show_food_inedible_message(user, target) + return EATEN_UNABLE + + if(is_food_empty(target)) + show_food_empty_message(user, target) + return EATEN_UNABLE + + if(!target.check_has_mouth()) + show_food_no_mouth_message(user, target) + return EATEN_UNABLE + + if(!target.can_eat_food_currently(src, user)) + return EATEN_UNABLE + + var/blocked = target.check_mouth_coverage() + if(blocked) + to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) + return EATEN_UNABLE + + if(user != target && !user.can_force_feed(target, src)) + return EATEN_UNABLE + + var/consumption_method = get_food_consumption_method(target) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(user != target) + if(!user.can_force_feed(target, src)) + return EATEN_UNABLE + show_feed_message_start(user, target, consumption_method) + if(!do_mob(user, target)) + return EATEN_UNABLE + var/contained = json_encode(REAGENT_LIST(src)) + admin_attack_log(user, target, "Fed the victim with [name] (Reagents: [contained])", "Was fed [src] (Reagents: [contained])", "used [src] (Reagents: [contained]) to feed") + + show_feed_message_end(user, target, consumption_method) + handle_consumed(user, target, consumption_method) + return EATEN_SUCCESS + +/obj/attack_animal(var/mob/user) + if((isanimal(user) || isalien(user)) && is_edible(user) && handle_eaten_by_mob(user) == EATEN_SUCCESS) + // TODO: put this in the mob AI. + spawn(5) + if(user && QDELETED(src) && !user.client) + user.custom_emote(1,"[pick("burps", "cries for more", "burps twice", "looks at the area where the food was")]") + return TRUE + return ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 1767c74930e..ff11e6d8cef 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -8,7 +8,6 @@ var/list/req_access var/list/matter //Used to store information about the contents of the object. var/w_class // Size of the object. - var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. var/throwforce = 1 var/sharp = 0 // whether this object cuts var/edge = 0 // whether this object is more likely to dismember @@ -17,7 +16,23 @@ var/armor_penetration = 0 var/anchor_fall = FALSE var/holographic = 0 //if the obj is a holographic object spawned by the holodeck - var/tmp/directional_offset ///JSON list of directions to x,y offsets to be applied to the object depending on its direction EX: {'NORTH':{'x':12,'y':5}, 'EAST':{'x':10,'y':50}} + var/tmp/directional_offset ///JSON list of directions to x,y offsets to be applied to the object depending on its direction EX: @'{"NORTH":{"x":12,"y":5}, "EAST":{"x":10,"y":50}}' + + ///The current health of the obj. Leave to null, unless you want the object to start at a different health than max_health. + var/health + ///The maximum health that the object can have. If set to ITEM_HEALTH_NO_DAMAGE, the object won't take any damage. + var/max_health = ITEM_HEALTH_NO_DAMAGE + +/obj/Initialize(mapload) + //Health should be set to max_health only if it's null. + if(isnull(health)) + health = max_health + . = ..() + temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - w_class, MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient + create_matter() + //Only apply directional offsets if the mappers haven't set any offsets already + if(!pixel_x && !pixel_y && !pixel_w && !pixel_z) + update_directional_offset() /obj/hitby(atom/movable/AM, var/datum/thrownthing/TT) ..() @@ -35,7 +50,7 @@ return ..() /obj/proc/get_matter_amount_modifier() - . = CEILING(w_class * BASE_OBJECT_MATTER_MULTPLIER) + . = w_class * BASE_OBJECT_MATTER_MULTPLIER /obj/assume_air(datum/gas_mixture/giver) return loc?.assume_air(giver) @@ -87,7 +102,7 @@ set_invisibility(hide ? INVISIBILITY_MAXIMUM : initial(invisibility)) /obj/proc/hides_under_flooring() - return level == 1 + return level == LEVEL_BELOW_PLATING /obj/proc/hear_talk(mob/M, text, verb, decl/language/speaking) if(talking_atom) @@ -169,9 +184,6 @@ /obj/proc/after_wounding(obj/item/organ/external/organ, datum/wound) return -/obj/can_be_injected_by(var/atom/injector) - . = ATOM_IS_OPEN_CONTAINER(src) && ..() - /obj/get_mass() return min(2**(w_class-1), 100) @@ -272,54 +284,51 @@ /obj/proc/WillContain() return -/** - * Returns the sum of this obj's matter plus the matter of all its contents. - * Overrides may add extra handling for things like material storage. - * Most useful for calculating worth or deconstructing something along with its contents. - */ -/obj/proc/get_contained_matter() - . = matter?.Copy() - for(var/obj/contained_obj in get_contained_external_atoms()) // machines handle component parts separately - . = MERGE_ASSOCS_WITH_NUM_VALUES(., contained_obj.get_contained_matter()) +/obj/get_contained_matter() + . = ..() + if(length(matter)) + . = MERGE_ASSOCS_WITH_NUM_VALUES(., matter.Copy()) //////////////////////////////////////////////////////////////// // Interactions //////////////////////////////////////////////////////////////// /**Returns a text string to describe the current damage level of the item, or null if non-applicable. */ -/obj/proc/get_examined_damage_string(var/health_ratio) - if(health_ratio >= 1) +/obj/proc/get_examined_damage_string() + if(!can_take_damage()) + return + var/health_percent = get_percent_health() + if(health_percent >= 100) return SPAN_NOTICE("It looks fully intact.") - else if(health_ratio > 0.75) + else if(health_percent > 75) return SPAN_NOTICE("It has a few cracks.") - else if(health_ratio > 0.5) + else if(health_percent > 50) return SPAN_WARNING("It looks slightly damaged.") - else if(health_ratio > 0.25) + else if(health_percent > 25) return SPAN_WARNING("It looks moderately damaged.") else return SPAN_DANGER("It looks heavily damaged.") -// -// Alt Interactions -// -/obj/get_alt_interactions(var/mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/rotate) - -/decl/interaction_handler/rotate - name = "Rotate" - expected_target_type = /obj - -/decl/interaction_handler/rotate/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/O = target - . = !!(O.obj_flags & OBJ_FLAG_ROTATABLE) - -/decl/interaction_handler/rotate/invoked(atom/target, mob/user, obj/item/prop) - var/obj/O = target - O.rotate(user) - /obj/fluid_act(var/datum/reagents/fluids) ..() if(!QDELETED(src) && fluids?.total_volume) fluids.touch_obj(src) + +// TODO: maybe iterate the entire matter list or do some partial damage handling +/obj/proc/solvent_can_melt(var/solvent_power = MAT_SOLVENT_STRONG) + if(!simulated) + return FALSE + var/decl/material/mat = get_material() + return !mat || mat.dissolves_in <= solvent_power + +/obj/melt() + if(length(matter)) + var/datum/gas_mixture/environment = loc?.return_air() + for(var/mat in matter) + var/decl/material/M = GET_DECL(mat) + M.add_burn_product(environment, MOLES_PER_MATERIAL_UNIT(matter[mat])) + matter = null + new /obj/effect/decal/cleanable/molten_item(src) + qdel(src) + +/obj/can_be_injected_by(var/atom/injector) + return ATOM_IS_OPEN_CONTAINER(src) diff --git a/code/game/objects/objs_damage.dm b/code/game/objects/objs_damage.dm new file mode 100644 index 00000000000..b576ef889c0 --- /dev/null +++ b/code/game/objects/objs_damage.dm @@ -0,0 +1,25 @@ +/** + Returns whether this object is damaged. + */ +/obj/proc/is_damaged() + return can_take_damage() && (health < max_health) + +/** + Returns TRUE if this object can take damage. + */ +/obj/proc/can_take_damage() + return (health != ITEM_HEALTH_NO_DAMAGE) && (max_health != ITEM_HEALTH_NO_DAMAGE) + +/** + Returns the percentage of health remaining for this object. + */ +/obj/proc/get_percent_health() + return can_take_damage()? round((health * 100)/max_health, HEALTH_ROUNDING) : 100 + +/** + Returns the percentage of damage done to this object. + */ +/obj/proc/get_percent_damages() + //Clamp from 0 to 100 so health values larger than max_health don't return unhelpful numbers + return clamp(100 - get_percent_health(), 0, 100) + diff --git a/code/game/objects/objs_interactions.dm b/code/game/objects/objs_interactions.dm new file mode 100644 index 00000000000..b295c6fd71f --- /dev/null +++ b/code/game/objects/objs_interactions.dm @@ -0,0 +1,20 @@ +/obj/get_alt_interactions(mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/rotate) + +/** + Interaction for rotating an object in the world. + */ +/decl/interaction_handler/rotate + name = "Rotate" + expected_target_type = /obj + +/decl/interaction_handler/rotate/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(.) + var/obj/O = target + . = !!(O.obj_flags & OBJ_FLAG_ROTATABLE) + +/decl/interaction_handler/rotate/invoked(atom/target, mob/user, obj/item/prop) + var/obj/O = target + O.rotate(user) diff --git a/code/game/objects/random/date_based.dm b/code/game/objects/random/date_based.dm index 0eee0d30f9e..3987c3b3f34 100644 --- a/code/game/objects/random/date_based.dm +++ b/code/game/objects/random/date_based.dm @@ -5,7 +5,7 @@ /obj/random/date_based name = "random object (date based)" icon_state = "yup" - spawn_method = .proc/check_date + spawn_method = PROC_REF(check_date) var/datum/is_date/date_check /obj/random/date_based/Destroy() diff --git a/code/game/objects/random/random_multi.dm b/code/game/objects/random/random_multi.dm index 0cc5e826482..aef5ffd5e15 100644 --- a/code/game/objects/random/random_multi.dm +++ b/code/game/objects/random/random_multi.dm @@ -6,7 +6,7 @@ desc = "This item type is used to spawn random objects at round-start. Only one spawn point for a given group id is selected." icon = 'icons/misc/mark.dmi' icon_state = "x3" - invisibility = INVISIBILITY_MAXIMUM + invisibility = INVISIBILITY_ABSTRACT var/id // Group id var/weight // Probability weight for this spawn point diff --git a/code/game/objects/random/subtypes/maintenance.dm b/code/game/objects/random/subtypes/maintenance.dm index 843d88c59f4..bc1d513f554 100644 --- a/code/game/objects/random/subtypes/maintenance.dm +++ b/code/game/objects/random/subtypes/maintenance.dm @@ -2,7 +2,7 @@ name = "random maintenance item" desc = "This is a random maintenance item." icon = 'icons/obj/items/gift_wrapped.dmi' - icon_state = "gift1" + icon_state = "gift_1" /obj/random/maintenance/spawn_choices() var/static/list/spawnable_choices = list( @@ -19,7 +19,7 @@ something, make sure it's not in one of the other lists.*/ name = "random clean maintenance item" desc = "This is a random clean maintenance item." icon = 'icons/obj/items/gift_wrapped.dmi' - icon_state = "gift2" + icon_state = "gift_2" /obj/random/maintenance/clean/spawn_choices() var/static/list/spawnable_choices = list( @@ -60,7 +60,6 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random research maintenance item" desc = "This is a random research maintenance item." - icon_state = "science" /obj/random/maintenance/research/spawn_choices() var/static/list/spawnable_choices = list( @@ -92,7 +91,6 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random engineering maintenance item" desc = "This is a random engineering maintenance item." - icon_state = "tool" /obj/random/maintenance/engineering/spawn_choices() var/static/list/spawnable_choices = list( @@ -165,7 +163,6 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random medical maintenance item" desc = "This is a random medical maintenance item." - icon_state = "medical" /obj/random/maintenance/medical/spawn_choices() var/static/list/spawnable_choices = list( @@ -207,7 +204,6 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around security areas*/ name = "random security maintenance item" desc = "This is a random security maintenance item." - icon_state = "security" /obj/random/maintenance/security/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/game/objects/random/subtypes/medical.dm b/code/game/objects/random/subtypes/medical.dm index 6e62abc699a..ddae0322ea0 100644 --- a/code/game/objects/random/subtypes/medical.dm +++ b/code/game/objects/random/subtypes/medical.dm @@ -44,7 +44,7 @@ /obj/item/stack/medical/splint = 1, /obj/item/chems/hypospray/autoinjector = 3, /obj/item/storage/pill_bottle/burn_meds = 2, - /obj/item/storage/pill_bottle/antitox = 2, + /obj/item/storage/pill_bottle/antitoxins = 2, /obj/item/storage/med_pouch/trauma = 2, /obj/item/storage/med_pouch/burn = 2, /obj/item/storage/med_pouch/toxin = 2, @@ -53,6 +53,19 @@ ) return spawnable_choices +/obj/random/medical/pillbottle + name = "Random Pill Bottle" + desc = "This is a random pill bottle." + +/obj/random/medical/pillbottle/spawn_choices() + var/static/list/spawnable_choices = list( + /obj/item/storage/pill_bottle/antibiotics, + /obj/item/storage/pill_bottle/oxygen, + /obj/item/storage/pill_bottle/brute_meds, + /obj/item/storage/pill_bottle/sugariron + ) + return spawnable_choices + /obj/random/firstaid name = "Random First Aid Kit" desc = "This is a random first aid kit." diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index fbb91f2e3d9..a7464e4890d 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -14,7 +14,7 @@ /obj/item/storage/pill_bottle/zoom = 2, /obj/item/chems/glass/beaker/vial/random/toxin = 1, /obj/item/chems/glass/beaker/sulphuric = 1, - /obj/item/contraband/poster = 5, + /obj/item/poster = 5, /obj/item/butterflyblade = 3, /obj/item/butterflyhandle = 3, /obj/item/baton/cattleprod = 1, @@ -238,7 +238,7 @@ /obj/random/smokes name = "random smokeable" desc = "This is a random smokeable item." - icon = 'icons/obj/cigarettes.dmi' + icon = 'icons/obj/items/storage/cigpack/acme.dmi' icon_state = "Bpacket" /obj/random/smokes/spawn_choices() @@ -318,7 +318,7 @@ name = "random loot" desc = "This is some random loot." icon = 'icons/obj/items/gift_wrapped.dmi' - icon_state = "gift3" + icon_state = "gift_3" /obj/random/loot/spawn_choices() var/static/list/spawnable_choices = list( @@ -370,7 +370,7 @@ name = "random vending machine" desc = "This is a randomly selected vending machine." icon = 'icons/obj/vending.dmi' - icon_state = "" + icon_state = "coffee-hellfire" /obj/random/vendor/spawn_choices() var/static/list/spawnable_choices = list( @@ -384,7 +384,7 @@ name = "random lipstick" desc = "This is a tube of lipstick." icon = 'icons/obj/items/lipstick.dmi' - icon_state = "lipstick_closed" + icon_state = "lipstick_0" /obj/random/lipstick/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/game/objects/random/subtypes/mobs.dm b/code/game/objects/random/subtypes/mobs.dm index de10a2ed398..412d2e2f972 100644 --- a/code/game/objects/random/subtypes/mobs.dm +++ b/code/game/objects/random/subtypes/mobs.dm @@ -1,7 +1,8 @@ /obj/random/mouse name = "Random Mouse" desc = "This is a random boring maus." - icon_state = "mouse_gray" + icon = 'icons/mob/simple_animal/mouse_gray.dmi' + icon_state = "world-resting" spawn_nothing_percentage = 15 /obj/random/mouse/spawn_choices() diff --git a/code/game/objects/random/subtypes/paperwork.dm b/code/game/objects/random/subtypes/paperwork.dm index 4d566079313..4dc4421a8e7 100644 --- a/code/game/objects/random/subtypes/paperwork.dm +++ b/code/game/objects/random/subtypes/paperwork.dm @@ -17,8 +17,8 @@ /obj/random/clipboard name = "random clipboard" desc = "This is a random material clipboard." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "clipboard_preview" + icon = 'icons/obj/items/clipboard.dmi' + icon_state = "clipboard" /obj/random/clipboard/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/game/objects/random/subtypes/tech.dm b/code/game/objects/random/subtypes/tech.dm index 5d3d2f86dc5..52f09fe5b46 100644 --- a/code/game/objects/random/subtypes/tech.dm +++ b/code/game/objects/random/subtypes/tech.dm @@ -2,7 +2,7 @@ name = "random scanner" desc = "This is a random technology scanner." icon = 'icons/obj/items/device/scanner/atmos_scanner.dmi' - icon_state = "atmos" + icon_state = ICON_STATE_WORLD /obj/random/technology_scanner/spawn_choices() var/static/list/spawnable_choices = list( @@ -98,7 +98,7 @@ name = "random assembly" desc = "This is a random circuit assembly." icon = 'icons/obj/items/gift_wrapped.dmi' - icon_state = "gift1" + icon_state = "gift_1" /obj/random/assembly/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/game/objects/random/subtypes/tools.dm b/code/game/objects/random/subtypes/tools.dm index e7af77f0465..58c637a8cf0 100644 --- a/code/game/objects/random/subtypes/tools.dm +++ b/code/game/objects/random/subtypes/tools.dm @@ -33,8 +33,8 @@ /obj/random/toolbox name = "random toolbox" desc = "This is a random toolbox." - icon = 'icons/obj/items/storage/toolbox.dmi' - icon_state = "red" + icon = 'icons/obj/items/storage/toolboxes/toolbox_red.dmi' + icon_state = ICON_STATE_WORLD /obj/random/toolbox/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/game/objects/random/subtypes/toys.dm b/code/game/objects/random/subtypes/toys.dm index ff0465d923e..02b5aa65728 100644 --- a/code/game/objects/random/subtypes/toys.dm +++ b/code/game/objects/random/subtypes/toys.dm @@ -155,8 +155,8 @@ /obj/random/plushie name = "random plushie" desc = "This is a random plushie." - icon = 'icons/obj/toy/toy.dmi' - icon_state = "nymphplushie" + icon = 'icons/obj/toy/plush_cat.dmi' + icon_state = ICON_STATE_WORLD /obj/random/plushie/spawn_choices() var/static/list/spawnable_choices = list( @@ -169,7 +169,7 @@ /obj/random/plushie/large name = "random large plushie" desc = "This is a random large plushie." - icon = 'icons/obj/toy/toy.dmi' + icon = 'icons/obj/structures/plushie.dmi' icon_state = "droneplushie" /obj/random/plushie/large/spawn_choices() diff --git a/code/game/objects/random/subtypes/weapons.dm b/code/game/objects/random/subtypes/weapons.dm index 379cf7d7674..f058612dd92 100644 --- a/code/game/objects/random/subtypes/weapons.dm +++ b/code/game/objects/random/subtypes/weapons.dm @@ -2,7 +2,7 @@ name = "Random Energy Weapon" desc = "This is a random energy weapon." icon = 'icons/obj/guns/energy_gun.dmi' - icon_state = "energykill100" + icon_state = ICON_STATE_WORLD /obj/random/energy/spawn_choices() var/static/list/spawnable_choices = list( @@ -33,7 +33,7 @@ name = "Random Projectile Weapon" desc = "This is a random projectile weapon." icon = 'icons/obj/guns/revolvers.dmi' - icon_state = "revolver" + icon_state = ICON_STATE_WORLD /obj/random/projectile/spawn_choices() var/static/list/spawnable_choices = list( @@ -66,7 +66,7 @@ name = "Random Handgun" desc = "This is a random sidearm." icon = 'icons/obj/guns/pistol.dmi' - icon_state = "secguncomp" + icon_state = ICON_STATE_WORLD /obj/random/handgun/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 3dd813f6153..71c12758222 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -3,10 +3,10 @@ w_class = ITEM_SIZE_STRUCTURE layer = STRUCTURE_LAYER abstract_type = /obj/structure + max_health = 50 + var/structure_flags var/last_damage_message - var/health = 0 - var/maxhealth = 50 var/hitsound = 'sound/weapons/smash.ogg' var/parts_type var/parts_amount @@ -38,16 +38,11 @@ if(!CanFluidPass()) fluid_update(TRUE) -/obj/structure/get_examined_damage_string(health_ratio) - if(maxhealth == -1) - return - . = ..() - /obj/structure/examine(mob/user, distance, infix, suffix) . = ..() if(distance <= 3) - var/damage_desc = get_examined_damage_string(health / maxhealth) + var/damage_desc = get_examined_damage_string() if(length(damage_desc)) to_chat(user, damage_desc) @@ -103,9 +98,9 @@ damage *= STRUCTURE_BRITTLE_MATERIAL_DAMAGE_MULTIPLIER playsound(loc, hitsound, 75, 1) - health = clamp(health - damage, 0, maxhealth) + health = clamp(health - damage, 0, max_health) - show_damage_message(health/maxhealth) + show_damage_message(health/max_health) if(health == 0) physically_destroyed() @@ -144,19 +139,21 @@ AM.reset_offsets() AM.reset_plane_and_layer() -/obj/structure/Crossed(O) +/obj/structure/Crossed(atom/movable/AM) . = ..() - if(ismob(O)) - var/mob/M = O - M.reset_offsets() - M.reset_plane_and_layer() + if(!ismob(AM)) + return + var/mob/M = AM + M.reset_offsets() + M.reset_plane_and_layer() -/obj/structure/Uncrossed(O) +/obj/structure/Uncrossed(atom/movable/AM) . = ..() - if(ismob(O)) - var/mob/M = O - M.reset_offsets() - M.reset_plane_and_layer() + if(!ismob(AM)) + return + var/mob/M = AM + M.reset_offsets() + M.reset_plane_and_layer() /obj/structure/Move() var/turf/T = get_turf(src) @@ -220,7 +217,7 @@ take_damage(rand(5, 15)) /obj/structure/proc/can_repair(var/mob/user) - if(health >= maxhealth) + if(health >= max_health) to_chat(user, SPAN_NOTICE("\The [src] does not need repairs.")) return FALSE return TRUE diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index 2f9817726c0..c38aa84cab5 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -104,20 +104,19 @@ /obj/structure/proc/handle_repair(mob/user, obj/item/tool) var/obj/item/stack/stack = tool - var/amount_needed = CEILING((maxhealth - health)/DOOR_REPAIR_AMOUNT) + var/amount_needed = CEILING((max_health - health)/DOOR_REPAIR_AMOUNT) var/used = min(amount_needed,stack.amount) if(used) - to_chat(user, SPAN_NOTICE("You fit [used] [stack.singular_name]\s to damaged areas of \the [src].")) + to_chat(user, SPAN_NOTICE("You fit [stack.get_string_for_amount(used)] to damaged areas of \the [src].")) stack.use(used) last_damage_message = null - health = clamp(health, health + used*DOOR_REPAIR_AMOUNT, maxhealth) + health = clamp(health, health + used*DOOR_REPAIR_AMOUNT, max_health) /obj/structure/attackby(obj/item/O, mob/user) if(O.force && user.a_intent == I_HURT) attack_animation(user) visible_message(SPAN_DANGER("\The [src] has been [pick(O.attack_verb)] with \the [O] by \the [user]!")) - playsound(loc, hitsound, 100, 1) take_damage(O.force) . = TRUE diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 2a8421a82cd..f887575361f 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -22,14 +22,14 @@ else set_opacity(initial(opacity)) hitsound = material?.hitsound || initial(hitsound) - if(maxhealth != -1) - maxhealth = initial(maxhealth) + material?.integrity * get_material_health_modifier() + if(max_health != -1) + max_health = initial(max_health) + material?.integrity * get_material_health_modifier() if(reinf_material) var/bonus_health = reinf_material.integrity * get_material_health_modifier() - maxhealth += bonus_health + max_health += bonus_health if(!keep_health) health += bonus_health - health = keep_health ? min(health, maxhealth) : maxhealth + health = keep_health ? min(health, max_health) : max_health update_icon() /obj/structure/proc/update_material_name(var/override_name) diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm index 91d3ce82d05..b432310a0cc 100644 --- a/code/game/objects/structures/banners.dm +++ b/code/game/objects/structures/banners.dm @@ -3,16 +3,16 @@ desc = "A sturdy frame suitable for hanging a banner." icon = 'icons/obj/structures/banner_frame.dmi' icon_state = "banner_stand" - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood anchored = TRUE density = FALSE opacity = FALSE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE layer = ABOVE_WINDOW_LAYER obj_flags = OBJ_FLAG_ANCHORABLE tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR - maxhealth = 50 + max_health = 50 /// Reference to any banner currently hung on the frame. var/obj/item/banner/banner @@ -83,7 +83,7 @@ desc = "A furled-up banner." icon = 'icons/obj/banner.dmi' icon_state = "banner" - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth max_health = 20 material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME w_class = ITEM_SIZE_NORMAL diff --git a/code/game/objects/structures/barricade.dm b/code/game/objects/structures/barricade.dm index fac16dd1095..a7709ec0961 100644 --- a/code/game/objects/structures/barricade.dm +++ b/code/game/objects/structures/barricade.dm @@ -5,10 +5,10 @@ icon_state = "barricade" anchored = TRUE density = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE layer = ABOVE_WINDOW_LAYER material_alteration = MAT_FLAG_ALTERATION_ALL - maxhealth = 100 + max_health = 100 var/spike_damage //how badly it smarts when you run into this like a rube var/list/poke_description = list("gored", "spiked", "speared", "stuck", "stabbed") @@ -18,12 +18,12 @@ /obj/structure/barricade/spike/Initialize() if(!reinf_material) - reinf_material = /decl/material/solid/wood + reinf_material = /decl/material/solid/organic/wood . = ..() /obj/structure/barricade/Initialize() if(!material) - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood . = ..() if(!istype(material)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index d1d9d9d5014..42f4ad03af0 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -6,7 +6,7 @@ appearance_flags = 0 anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/cult = 0 /obj/structure/sign/double/barsign/proc/get_valid_states(initial=1) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index ae1737eb9e5..046bd6e2119 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -17,7 +17,7 @@ LINEN BINS throw_speed = 1 throw_range = 2 w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/bedsheet/attackby(obj/item/I, mob/user) if(is_sharp(I)) @@ -78,6 +78,9 @@ LINEN BINS /obj/item/bedsheet/brown icon = 'icons/obj/bedsheets/bedsheet_brown.dmi' +/obj/item/bedsheet/ian + icon = 'icons/obj/bedsheets/bedsheet_ian.dmi' + ////////////////////////////////////////// // Bedsheet bin ////////////////////////////////////////// @@ -88,7 +91,7 @@ LINEN BINS icon_state = "linenbin-full" anchored = TRUE w_class = ITEM_SIZE_STRUCTURE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT var/stored = 0 //Currently stored unspawned bedsheets, mainly used by mapped bins var/max_stored = 20 //Maximum amount of bedsheets that can be put in here diff --git a/code/game/objects/structures/benches.dm b/code/game/objects/structures/benches.dm index a47875bdc83..ed9805ff78b 100644 --- a/code/game/objects/structures/benches.dm +++ b/code/game/objects/structures/benches.dm @@ -35,8 +35,8 @@ /obj/structure/table/bench/wooden icon_state = "solid_preview" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/wood - reinf_material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood + reinf_material = /decl/material/solid/organic/wood /obj/structure/table/bench/padded icon_state = "padded_preview" @@ -47,4 +47,8 @@ /obj/structure/table/bench/glass color = COLOR_DEEP_SKY_BLUE alpha = 77 - reinf_material = /decl/material/solid/glass \ No newline at end of file + reinf_material = /decl/material/solid/glass + +/obj/structure/table/bench/marble + color = COLOR_OFF_WHITE + reinf_material = /decl/material/solid/stone/marble diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 79c00050395..2b3e3b5a7a1 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -7,7 +7,7 @@ var/global/list/station_bookcases = list() density = TRUE opacity = TRUE obj_flags = OBJ_FLAG_ANCHORABLE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index b3830b82719..1ba9bf8b4ab 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -3,7 +3,7 @@ desc = "A rack that holds coats." icon = 'icons/obj/structures/coatrack.dmi' icon_state = "coatrack0" - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany material_alteration = (MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR) tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT var/max_items = 3 diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index a57ef2228f0..892a16828ed 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -6,7 +6,7 @@ var/global/list/closets = list() icon = 'icons/obj/closets/bases/closet.dmi' icon_state = "base" density = TRUE - maxhealth = 100 + max_health = 100 material = /decl/material/solid/metal/steel tool_interaction_flags = TOOL_INTERACTION_ANCHOR @@ -313,7 +313,7 @@ var/global/list/closets = list() ) physically_destroyed() -/obj/structure/closet/receive_mouse_drop(atom/dropping, mob/user) +/obj/structure/closet/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() var/atom/movable/AM = dropping if(!. && istype(AM) && opened && !istype(AM, /obj/structure/closet) && AM.simulated && !AM.anchored && (large || !ismob(AM))) diff --git a/code/game/objects/structures/crates_lockers/closets/_closet_appearance_definitions.dm b/code/game/objects/structures/crates_lockers/closets/_closet_appearance_definitions.dm index 1e13e508629..510d9d7814c 100644 --- a/code/game/objects/structures/crates_lockers/closets/_closet_appearance_definitions.dm +++ b/code/game/objects/structures/crates_lockers/closets/_closet_appearance_definitions.dm @@ -209,6 +209,12 @@ "biohazard" = COLOR_OFF_WHITE ) +/decl/closet_appearance/bio/medical + extra_decals = list( + "lower_half_solid" = COLOR_PALE_BLUE_GRAY, + "biohazard" = COLOR_OFF_WHITE + ) + /decl/closet_appearance/secure_closet can_lock = TRUE @@ -471,6 +477,13 @@ "hydro" = COLOR_DARK_GREEN_GRAY ) +/decl/closet_appearance/secure_closet/hydroponics/xenoflora + extra_decals = list( + "stripe_vertical_right_partial" = COLOR_PURPLE, + "stripe_vertical_mid_partial" = COLOR_PURPLE, + "hydro" = COLOR_PURPLE + ) + /decl/closet_appearance/secure_closet/chaplain decals = list( "lower_side_vent", diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 97b84c05003..5b6fee17ec9 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -84,3 +84,13 @@ /obj/item/clothing/mask/gas/half, /obj/item/tank/emergency/oxygen/engi ) + +/obj/structure/closet/l3closet/medical + closet_appearance = /decl/closet_appearance/bio/medical + +/obj/structure/closet/l3closet/medical/WillContain() + return list( + /obj/item/clothing/suit/bio_suit/general = 3, + /obj/item/clothing/head/bio_hood/general = 3, + /obj/item/clothing/mask/gas = 3 + ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index a2c234cb532..39f01e28bbc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -47,7 +47,7 @@ var/created_size = 0 for(var/i = 1 to 200) //sanity loop limit var/obj/item/cash_type = pick(3; /obj/item/cash/c1000, 4; /obj/item/cash/c500, 5; /obj/item/cash/c200) - var/bundle_size = initial(cash_type.w_class) / 2 + var/bundle_size = initial(cash_type.w_class) if(created_size + bundle_size <= storage_capacity) created_size += bundle_size . += cash_type diff --git a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm index 90d559c11ab..b523e51c7a6 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm @@ -55,3 +55,16 @@ add_overlay("locked") else add_overlay("open") + +// Subtypes +/obj/structure/closet/secure_closet/guncabinet/sidearm + name = "emergency weapon cabinet" + req_access = list( + access_armory, + access_captain + ) + +/obj/structure/closet/secure_closet/guncabinet/sidearm/WillContain() + return list( + /obj/item/gun/energy/gun = 4 + ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index dc8417131df..829d77763b7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -17,3 +17,15 @@ /obj/item/wirecutters/clippers, /obj/item/chems/spray/plantbgone, ) + + +/obj/structure/closet/secure_closet/hydroponics/sci + name = "xenoflorist's locker" + req_access = list(access_xenobiology) + closet_appearance = /decl/closet_appearance/secure_closet/hydroponics/xenoflora + +/obj/structure/closet/secure_closet/hydroponics/sci/WillContain() + . = ..() + . += /obj/item/clothing/head/bio_hood/scientist + . += /obj/item/clothing/suit/bio_suit/scientist + . += /obj/item/clothing/mask/ diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 1af9ff2e060..d6f61c5aff8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -84,12 +84,12 @@ /obj/item/clothing/accessory/storage/vest ) -/obj/structure/closet/secure_closet/CMO +/obj/structure/closet/secure_closet/cmo name = "chief medical officer's locker" req_access = list(access_cmo) closet_appearance = /decl/closet_appearance/secure_closet/cmo -/obj/structure/closet/secure_closet/CMO/WillContain() +/obj/structure/closet/secure_closet/cmo/WillContain() return list( new/datum/atom_creator/weighted(list(/obj/item/storage/backpack/medic, /obj/item/storage/backpack/satchel/med)), new/datum/atom_creator/simple(/obj/item/storage/backpack/dufflebag/med, 50), @@ -133,6 +133,18 @@ . = ..() tool_interaction_flags &= ~TOOL_INTERACTION_ANCHOR +/obj/structure/closet/secure_closet/medical_wall/pills + name = "pill cabinet" + +/obj/structure/closet/secure_closet/medical_wall/pills/WillContain() + return list( + /obj/item/storage/pill_bottle/antibiotics = 1, + /obj/item/storage/pill_bottle/painkillers = 1, + /obj/item/storage/pill_bottle/antitoxins = 1, + /obj/item/storage/pill_bottle/burn_meds = 1, + /obj/random/medical/pillbottle = 1 + ) + /obj/structure/closet/secure_closet/counselor name = "counselor's locker" closet_appearance = /decl/closet_appearance/secure_closet/medical diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 3064e8412d0..b28f43c6291 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -30,12 +30,12 @@ /obj/item/storage/belt/general ) -/obj/structure/closet/secure_closet/RD +/obj/structure/closet/secure_closet/research_director name = "chief science officer's locker" req_access = list(access_rd) closet_appearance = /decl/closet_appearance/secure_closet/rd -/obj/structure/closet/secure_closet/RD/WillContain() +/obj/structure/closet/secure_closet/research_director/WillContain() return list( /obj/item/clothing/suit/bio_suit/scientist = 2, /obj/item/clothing/head/bio_hood/scientist = 2, @@ -60,3 +60,26 @@ /obj/item/storage/box/syringes, /obj/item/chems/glass/bottle/sedatives ) + +/obj/structure/closet/secure_closet/pilot + name = "pilot locker" + req_access = list(access_xenobiology) + +/obj/structure/closet/secure_closet/pilot/WillContain() + return list( + /obj/item/storage/backpack/parachute, + /obj/item/knife/utility, + /obj/item/clothing/under/pilot, + /obj/item/clothing/suit/storage/toggle/bomber, + /obj/item/clothing/mask/gas/half, + /obj/item/clothing/shoes/color/black, + /obj/item/clothing/gloves/color/black, + /obj/item/radio/headset/headset_sci, + /obj/item/flashlight, + /obj/item/chems/food/liquidfood, + /obj/item/chems/drinks/cans/waterbottle, + /obj/item/storage/box/flares, + /obj/item/cell/device, + /obj/item/radio, + /obj/item/storage/backpack/satchel + ) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 548a0f3fc3f..4b08f285a1e 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -23,7 +23,7 @@ L.client.eye = src L.forceMove(src) L.set_sdisability(MUTED) - health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues + health = L.current_health + 100 //stoning damaged mobs will result in easier to shatter statues intialTox = L.getToxLoss() intialFire = L.getFireLoss() intialBrute = L.getBruteLoss() @@ -50,7 +50,7 @@ timer-- for(var/mob/living/M in src) //Go-go gadget stasis field M.setToxLoss(intialTox) - M.adjustFireLoss(intialFire - M.getFireLoss()) + M.adjustFireLoss(intialFire - M.getFireLoss(), do_update_health = FALSE) M.adjustBruteLoss(intialBrute - M.getBruteLoss()) M.setOxyLoss(intialOxy) if (timer <= 0) @@ -65,7 +65,7 @@ for(var/mob/living/M in src) M.dropInto(loc) M.unset_sdisability(MUTED) - M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob + M.take_overall_damage((M.current_health - health - 100),0) //any new damage the statue incurred is transfered to the mob if(M.client) M.client.eye = M.client.mob M.client.perspective = MOB_PERSPECTIVE @@ -104,7 +104,7 @@ visible_message("[user] strikes [src] with [I].") check_health() -/obj/structure/closet/statue/receive_mouse_drop(atom/dropping, var/mob/user) +/obj/structure/closet/statue/receive_mouse_drop(atom/dropping, mob/user, params) return TRUE /obj/structure/closet/statue/relaymove() diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 7d8a8b81774..a7b3a7c779b 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -65,7 +65,7 @@ desc = "It's a storage unit for tools." closet_appearance = /decl/closet_appearance/secure_closet/engineering/tools -/obj/structure/closet/firecloset/chief/WillContain() +/obj/structure/closet/toolcloset/WillContain() return list( new /datum/atom_creator/simple(/obj/item/clothing/suit/storage/hazardvest, 40), new /datum/atom_creator/simple(/obj/item/flashlight, 70), @@ -141,7 +141,7 @@ storage_types = CLOSET_STORAGE_ITEMS setup = 0 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' icon = 'icons/obj/closets/bases/wall.dmi' /obj/structure/closet/hydrant/Initialize(ml, _mat, _reinf_mat) @@ -170,7 +170,7 @@ storage_types = CLOSET_STORAGE_ITEMS setup = 0 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' icon = 'icons/obj/closets/bases/wall.dmi' /obj/structure/closet/medical_wall/Initialize() @@ -192,7 +192,7 @@ storage_types = CLOSET_STORAGE_ITEMS setup = 0 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' icon = 'icons/obj/closets/bases/wall.dmi' /obj/structure/closet/shipping_wall/Initialize() diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index 1263c4b7451..cb186904d24 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -12,7 +12,7 @@ storage_types = CLOSET_STORAGE_ITEMS setup = 0 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' /obj/structure/closet/walllocker/Initialize() . = ..() @@ -28,4 +28,4 @@ /obj/item/clothing/head/helmet/space = 2, /obj/item/clothing/suit/space = 2, /obj/item/tank/oxygen = 2 - ) \ No newline at end of file + ) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 695f17f89a6..8427a6b1628 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -3,7 +3,7 @@ desc = "A rectangular steel crate." icon = 'icons/obj/closets/bases/crate.dmi' closet_appearance = /decl/closet_appearance/crate - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE setup = 0 storage_types = CLOSET_STORAGE_ITEMS var/rigged = 0 @@ -252,6 +252,19 @@ /obj/item/scanner/plant = 2 ) +/obj/structure/closet/crate/hydroponics/exotic + name = "exotic seeds crate" + desc = "All you need to destroy that pesky planet." + +/obj/structure/closet/crate/hydroponics/exotic/WillContain() + return list( + /obj/item/seeds/random = 6, + /obj/item/seeds/ambrosiavulgarisseed = 2, + /obj/item/seeds/kudzuseed, + /obj/item/seeds/libertymycelium, + /obj/item/seeds/reishimycelium + ) + /obj/structure/closet/crate/secure/biohazard name = "biohazard cart" desc = "A heavy cart with extensive sealing. You shouldn't eat things you find in it." diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 8a2a0683594..860d8889bea 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/shipping_crates.dmi' icon_state = "densecrate" density = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE - material = /decl/material/solid/wood + atom_flags = ATOM_FLAG_CLIMBABLE + material = /decl/material/solid/organic/wood /obj/structure/largecrate/Initialize() . = ..() diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index d8240222d2a..cd170f82f0c 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -210,7 +210,7 @@ /obj/structure/crematorium_tray/attack_robot(mob/user) return attack_hand_with_interaction_checks(user) -/obj/structure/crematorium_tray/receive_mouse_drop(atom/dropping, mob/user) +/obj/structure/crematorium_tray/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && (ismob(dropping) || istype(dropping, /obj/structure/closet/body_bag))) var/atom/movable/AM = dropping diff --git a/code/game/objects/structures/curtain_decls.dm b/code/game/objects/structures/curtain_decls.dm index 63548ee6746..909a5fcc418 100644 --- a/code/game/objects/structures/curtain_decls.dm +++ b/code/game/objects/structures/curtain_decls.dm @@ -5,7 +5,7 @@ var/name = "curtain" var/color = COLOR_WHITE var/alpha = 255 - var/material_key = /decl/material/solid/plastic + var/material_key = /decl/material/solid/organic/plastic /decl/curtain_kind/proc/make_item(var/loc) var/obj/item/curtain/C = new(loc) @@ -21,7 +21,7 @@ //Cloth curtains /decl/curtain_kind/cloth - material_key = /decl/material/solid/cloth + material_key = /decl/material/solid/organic/cloth /decl/curtain_kind/cloth/bed name = "bed curtain" @@ -39,7 +39,7 @@ /decl/curtain_kind/plastic name = "plastic curtain" color = "#b8f5e3" - material_key = /decl/material/solid/plastic + material_key = /decl/material/solid/organic/plastic /decl/curtain_kind/plastic/medical alpha = 200 diff --git a/code/game/objects/structures/defensive_barrier.dm b/code/game/objects/structures/defensive_barrier.dm index d3e3a8f7adc..d28141302bc 100644 --- a/code/game/objects/structures/defensive_barrier.dm +++ b/code/game/objects/structures/defensive_barrier.dm @@ -10,13 +10,13 @@ can_buckle = TRUE material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_NAME - maxhealth = 200 + max_health = 200 var/secured /obj/structure/defensive_barrier/Initialize() . = ..() update_icon() - events_repository.register(/decl/observ/dir_set, src, src, .proc/update_layers) + events_repository.register(/decl/observ/dir_set, src, src, PROC_REF(update_layers)) /obj/structure/defensive_barrier/physically_destroyed(var/skip_qdel) visible_message(SPAN_DANGER("\The [src] was destroyed!")) @@ -24,7 +24,7 @@ . = ..() /obj/structure/defensive_barrier/Destroy() - events_repository.unregister(/decl/observ/dir_set, src, src, .proc/update_layers) + events_repository.unregister(/decl/observ/dir_set, src, src, PROC_REF(update_layers)) . = ..() /obj/structure/defensive_barrier/proc/update_layers() @@ -91,7 +91,7 @@ var/obj/item/defensive_barrier/B = new(get_turf(user), material?.type) playsound(src, 'sound/items/Deconstruct.ogg', 100, 1) B.stored_health = health - B.stored_max_health = maxhealth + B.stored_max_health = max_health B.add_fingerprint(user) qdel(src) return TRUE diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index ae993ab4536..e5ab45af656 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -5,11 +5,11 @@ desc = "A display case for prized possessions. It taunts you to kick it." density = TRUE anchored = TRUE - unacidable = TRUE //Dissolving the case would also delete the gun. alpha = 150 - maxhealth = 100 + max_health = 100 hitsound = 'sound/effects/Glasshit.ogg' req_access = null + material = /decl/material/solid/glass var/destroyed = FALSE var/locked = TRUE @@ -57,9 +57,9 @@ if(!istype(subtracting) || !length(subtracting.matter)) return for(var/mat in matter) - if(!subtracting[mat]) + if(!subtracting.matter[mat]) continue - matter[mat] -= subtracting[mat] + matter[mat] -= subtracting.matter[mat] if(matter[mat] <= 0) matter -= mat UNSETEMPTY(matter) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 242254d1b3e..4e047589e64 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -4,7 +4,7 @@ icon_state = "metal" hitsound = 'sound/weapons/genhit.ogg' material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR - maxhealth = 50 + max_health = 50 density = TRUE anchored = TRUE opacity = TRUE @@ -174,32 +174,32 @@ material = /decl/material/solid/gemstone/diamond /obj/structure/door/wood - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/structure/door/mahogany - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany /obj/structure/door/maple - material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple /obj/structure/door/ebony - material = /decl/material/solid/wood/ebony + material = /decl/material/solid/organic/wood/ebony /obj/structure/door/walnut - material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut /obj/structure/door/cult material = /decl/material/solid/stone/cult /obj/structure/door/wood/saloon - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood opacity = FALSE /obj/structure/door/glass material = /decl/material/solid/glass /obj/structure/door/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/structure/door/exotic_matter material = /decl/material/solid/exotic_matter diff --git a/code/game/objects/structures/emergency_dispenser.dm b/code/game/objects/structures/emergency_dispenser.dm index c8b7075f4d5..6bc0e2528f8 100644 --- a/code/game/objects/structures/emergency_dispenser.dm +++ b/code/game/objects/structures/emergency_dispenser.dm @@ -7,7 +7,7 @@ icon_state = "world" anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/static/list/spawnitems = list(/obj/item/tank/emergency/oxygen,/obj/item/clothing/mask/breath) var/amount = 3 // spawns each items X times. diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 208a3af9305..6bccabb09f6 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -6,7 +6,7 @@ anchored = TRUE density = FALSE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-29}, 'SOUTH':{'y':29}, 'EAST':{'x':-29}, 'WEST':{'x':29}}" + directional_offset = @'{"NORTH":{"y":-29}, "SOUTH":{"y":29}, "EAST":{"x":-29}, "WEST":{"x":29}}' var/obj/item/chems/spray/extinguisher/has_extinguisher var/opened = 0 diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm index c3d6311309b..fc6227b924f 100644 --- a/code/game/objects/structures/fireaxe_cabinet.dm +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -6,7 +6,7 @@ anchored = TRUE density = FALSE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/damage_threshold = 15 var/open @@ -40,7 +40,7 @@ toggle_open(user) return TRUE -/obj/structure/fireaxecabinet/handle_mouse_drop(atom/over, mob/user) +/obj/structure/fireaxecabinet/handle_mouse_drop(atom/over, mob/user, params) if(over == user) if(!open) to_chat(user, SPAN_WARNING("\The [src] is closed.")) diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index b79059e4c22..ce595ef7b40 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -14,7 +14,7 @@ icon_state = "campfire" anchored = TRUE density = FALSE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood var/datum/effect/effect/system/steam_spread/steam // Used when being quenched. @@ -179,8 +179,8 @@ /obj/structure/fire_source/attackby(var/obj/item/thing, var/mob/user) - if(ATOM_SHOULD_TEMPERATURE_ENQUEUE(thing) && user.a_intent != I_HURT) - thing.HandleObjectHeating(src, user, DIRECT_HEAT) + if(ATOM_SHOULD_TEMPERATURE_ENQUEUE(thing) && user.a_intent != I_HURT && lit == FIRE_LIT) + thing.handle_external_heating(DIRECT_HEAT, src, user) return TRUE if(ATOM_IS_OPEN_CONTAINER(thing)) @@ -195,6 +195,8 @@ var/obj/item/flame/match/match = thing if(!match.burnt && !match.lit) match.lit = TRUE + match.damtype = BURN + match.update_force() match.update_icon() return TRUE @@ -228,8 +230,8 @@ if(istype(thing, /obj/item/stack)) var/obj/item/stack/stack = thing - if(stack.material.fuel_value > 0) - var/fuel_per_unit = 2 * stack.material.fuel_value + if(stack.material.accelerant_value > FUEL_VALUE_NONE) + var/fuel_per_unit = 2 * stack.material.accelerant_value var/use_stacks = min(stack.amount, FLOOR((IDEAL_FUEL - fuel) / fuel_per_unit)) var/add_fuel = round(fuel_per_unit * use_stacks) if(stack.material.burn_product) @@ -244,9 +246,9 @@ var/modified_fuel = FALSE for(var/mat in thing.matter) var/decl/material/material = GET_DECL(mat) - if(material.fuel_value > 0) + if(material.accelerant_value > FUEL_VALUE_NONE) modified_fuel = TRUE - var/add_fuel = round(thing.matter[mat] / SHEET_MATERIAL_AMOUNT) * material.fuel_value + var/add_fuel = round(MOLES_PER_MATERIAL_UNIT(thing.matter[mat])) * material.accelerant_value if(material.burn_product) if(waste[material.burn_product]) waste[material.burn_product] += add_fuel @@ -273,9 +275,9 @@ var/do_steam = FALSE for(var/rtype in RG.reagent_volumes) var/decl/material/R = GET_DECL(rtype) - if(R.fuel_value <= 0) + if(R.accelerant_value <= FUEL_VALUE_RETARDANT) do_steam = TRUE - fuel += REAGENT_VOLUME(RG, rtype) * R.fuel_value + fuel += REAGENT_VOLUME(RG, rtype) * R.accelerant_value RG.clear_reagents() fuel = max(0, fuel) if(lit == FIRE_LIT) diff --git a/code/game/objects/structures/fishtanks.dm b/code/game/objects/structures/fishtanks.dm index e36abb928f4..8a730e42916 100644 --- a/code/game/objects/structures/fishtanks.dm +++ b/code/game/objects/structures/fishtanks.dm @@ -24,7 +24,7 @@ var/global/list/fishtank_cache = list() density = TRUE atom_flags = ATOM_FLAG_CHECKS_BORDER | ATOM_FLAG_CLIMBABLE mob_offset = TRUE - maxhealth = 50 + max_health = 50 var/deleting var/fill_type diff --git a/code/game/objects/structures/flora/_flora.dm b/code/game/objects/structures/flora/_flora.dm index 169d256011b..f7081d56bcd 100644 --- a/code/game/objects/structures/flora/_flora.dm +++ b/code/game/objects/structures/flora/_flora.dm @@ -6,7 +6,7 @@ anchored = TRUE density = FALSE //Plants usually have no collisions w_class = ITEM_SIZE_NORMAL //Size determines material yield - material = /decl/material/solid/plantmatter //Generic plantstuff + material = /decl/material/solid/organic/plantmatter //Generic plantstuff tool_interaction_flags = 0 hitsound = 'sound/effects/hit_bush.ogg' var/tmp/snd_cut = 'sound/effects/plants/brush_leaves.ogg' //Sound to play when cutting the plant down diff --git a/code/game/objects/structures/flora/potted.dm b/code/game/objects/structures/flora/potted.dm index 7aefcbfd899..c5e4d41e47a 100644 --- a/code/game/objects/structures/flora/potted.dm +++ b/code/game/objects/structures/flora/potted.dm @@ -14,9 +14,9 @@ snd_cut = 'sound/effects/break_ceramic.ogg' material = /decl/material/solid/stone/ceramic matter = list( - /decl/material/solid/clay = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/sand = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plantmatter = MATTER_AMOUNT_SECONDARY, //#TODO: Maybe eventually drop the plant, or some seeds or something? + /decl/material/solid/clay = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/sand = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plantmatter = MATTER_AMOUNT_SECONDARY, //#TODO: Maybe eventually drop the plant, or some seeds or something? ) /obj/structure/flora/pottedplant/get_material_health_modifier() diff --git a/code/game/objects/structures/flora/stump.dm b/code/game/objects/structures/flora/stump.dm index 7894b70732f..38e6c557eb1 100644 --- a/code/game/objects/structures/flora/stump.dm +++ b/code/game/objects/structures/flora/stump.dm @@ -20,7 +20,7 @@ icon = 'icons/obj/flora/tree_stumps.dmi' w_class = ITEM_SIZE_HUGE pixel_x = -16 //All trees are offset 16 pixels - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood //dead trees /obj/structure/flora/stump/tree/dead diff --git a/code/game/objects/structures/flora/tree.dm b/code/game/objects/structures/flora/tree.dm index 220a0d91c14..232c5615606 100644 --- a/code/game/objects/structures/flora/tree.dm +++ b/code/game/objects/structures/flora/tree.dm @@ -7,7 +7,7 @@ density = TRUE pixel_x = -16 layer = ABOVE_HUMAN_LAYER - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood w_class = ITEM_SIZE_STRUCTURE hitsound = 'sound/effects/hit_wood.ogg' snd_cut = 'sound/effects/plants/tree_fall.ogg' diff --git a/code/game/objects/structures/fountain.dm b/code/game/objects/structures/fountain.dm index f35652da0d3..34691ace6ba 100644 --- a/code/game/objects/structures/fountain.dm +++ b/code/game/objects/structures/fountain.dm @@ -7,7 +7,6 @@ icon_state = "fountain" density = TRUE anchored = TRUE - unacidable = TRUE pixel_x = -16 var/used = FALSE var/increase_age_prob = (100 / 6) @@ -75,7 +74,7 @@ else to_chat(user, "You touch the fountain. All the memories of your life seem to fade into the distant past as seconds drag like years. You feel the inexplicable sensation of your skin tightening and thinning across your entire body as your muscles degrade and your joints weaken. Time returns to its 'normal' pace. You can only just barely remember touching the fountain.") user.became_older = TRUE - user.change_hair_color(80, 80, 80) + user.set_hair_colour(COLOR_GRAY80) var/max_age = age.standalone_value_descriptors[age.standalone_value_descriptors[length(age.standalone_value_descriptors)]] if(new_age >= max_age) to_chat(user, "The burden of the years is too much, and you are reduced to dust.") diff --git a/code/game/objects/structures/fuel_port.dm b/code/game/objects/structures/fuel_port.dm index ef1de75d390..4e5589fd37e 100644 --- a/code/game/objects/structures/fuel_port.dm +++ b/code/game/objects/structures/fuel_port.dm @@ -7,7 +7,7 @@ density = FALSE anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/open = FALSE var/parent_shuttle diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index ccd1ff948da..c95d6d96d30 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -8,7 +8,7 @@ obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) - maxhealth = 100 + max_health = 100 parts_amount = 2 parts_type = /obj/item/stack/material/strut @@ -196,7 +196,7 @@ /obj/structure/girder/cult icon= 'icons/obj/cult.dmi' icon_state= "cultgirder" - maxhealth = 150 + max_health = 150 cover = 70 /obj/structure/girder/cult/dismantle() @@ -206,10 +206,10 @@ . = ..() /obj/structure/girder/wood - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany /obj/structure/grille/wood - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany /obj/structure/lattice/wood - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 683a53c58e8..08bfd215d85 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -16,7 +16,7 @@ handle_generic_blending = TRUE material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - maxhealth = 20 + max_health = 20 var/destroyed = 0 var/list/connections diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 2cfd12331c2..0acc26f3654 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -3,7 +3,7 @@ desc = "A folded membrane which rapidly expands into a large cubical shape on activation." icon = 'icons/obj/structures/inflatable.dmi' icon_state = "folded_wall" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic w_class = ITEM_SIZE_NORMAL var/deploy_path = /obj/structure/inflatable/wall var/inflatable_health @@ -41,10 +41,10 @@ opacity = FALSE icon = 'icons/obj/structures/inflatable.dmi' icon_state = "wall" - maxhealth = 20 + max_health = 20 hitsound = 'sound/effects/Glasshit.ogg' atmos_canpass = CANPASS_DENSITY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/undeploy_path = null var/taped @@ -107,7 +107,7 @@ deflate(TRUE) /obj/structure/inflatable/can_repair_with(obj/item/tool) - . = istype(tool, /obj/item/stack/tape_roll/duct_tape) && (health < maxhealth) + . = istype(tool, /obj/item/stack/tape_roll/duct_tape) && (health < max_health) /obj/structure/inflatable/handle_repair(mob/user, obj/item/tool) var/obj/item/stack/tape_roll/duct_tape/T = tool @@ -121,7 +121,7 @@ playsound(src, 'sound/effects/tape.ogg', 50, TRUE) last_damage_message = null to_chat(user, SPAN_NOTICE("You tape up some of the damage to \the [src].")) - health = clamp(health + 3, 0, maxhealth) + health = clamp(health + 3, 0, max_health) taped = TRUE /obj/structure/inflatable/attackby(obj/item/W, mob/user) diff --git a/code/game/objects/structures/ironing_board.dm b/code/game/objects/structures/ironing_board.dm index fe42db90178..473f91bb780 100644 --- a/code/game/objects/structures/ironing_board.dm +++ b/code/game/objects/structures/ironing_board.dm @@ -31,7 +31,7 @@ holding = null update_icon() - events_repository.unregister(/decl/observ/destroyed, I, src, /obj/structure/bed/roller/ironingboard/proc/remove_item) + events_repository.unregister(/decl/observ/destroyed, I, src, TYPE_PROC_REF(/obj/structure/bed/roller/ironingboard, remove_item)) // make a screeching noise to drive people mad /obj/structure/bed/roller/ironingboard/Move() @@ -76,7 +76,7 @@ if(user.try_unequip(I, src)) cloth = I - events_repository.register(/decl/observ/destroyed, I, src, /obj/structure/bed/roller/ironingboard/proc/remove_item) + events_repository.register(/decl/observ/destroyed, I, src, TYPE_PROC_REF(/obj/structure/bed/roller/ironingboard, remove_item)) update_icon() return else if(istype(I,/obj/item/ironingiron)) @@ -101,7 +101,7 @@ if(!cloth) if(!holding && !R.enabled && user.try_unequip(I, src)) holding = R - events_repository.register(/decl/observ/destroyed, I, src, /obj/structure/bed/roller/ironingboard/proc/remove_item) + events_repository.register(/decl/observ/destroyed, I, src, TYPE_PROC_REF(/obj/structure/bed/roller/ironingboard, remove_item)) update_icon() return to_chat(user, "There isn't anything on the ironing board.") @@ -150,4 +150,5 @@ name = "ironing board" desc = "A collapsed ironing board that can be carried around." icon = 'icons/obj/structures/ironing.dmi' + icon_state = "folded" structure_form_type = /obj/structure/bed/roller/ironingboard \ No newline at end of file diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm index e97d7d3fc86..596c9f0b506 100644 --- a/code/game/objects/structures/iv_drip.dm +++ b/code/game/objects/structures/iv_drip.dm @@ -75,7 +75,7 @@ add_overlay(light) -/obj/structure/iv_drip/handle_mouse_drop(atom/over, mob/user) +/obj/structure/iv_drip/handle_mouse_drop(atom/over, mob/user, params) if(attached) drip_detach() return TRUE diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 1c4ef94cda8..6dd17b9b4b7 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -5,7 +5,7 @@ icon_state = "cart" anchored = FALSE density = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED var/obj/item/storage/bag/trash/mybag = null var/obj/item/mop/mymop = null @@ -176,7 +176,7 @@ icon_state = "pussywagon" anchored = FALSE density = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER buckle_layer_above = TRUE buckle_movable = TRUE movement_handlers = list( @@ -263,4 +263,4 @@ icon_state = "keys" w_class = ITEM_SIZE_TINY material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_TRACE) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE) diff --git a/code/game/objects/structures/memorial.dm b/code/game/objects/structures/memorial.dm index 553f6685c88..5ad8f7a944e 100644 --- a/code/game/objects/structures/memorial.dm +++ b/code/game/objects/structures/memorial.dm @@ -7,7 +7,6 @@ pixel_y = -16 density = TRUE anchored = TRUE - unacidable = TRUE material = /decl/material/solid/stone/marble material_alteration = MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_NAME diff --git a/code/game/objects/structures/mineral_bath.dm b/code/game/objects/structures/mineral_bath.dm index 845d32402a6..14bb3ef3f23 100644 --- a/code/game/objects/structures/mineral_bath.dm +++ b/code/game/objects/structures/mineral_bath.dm @@ -83,7 +83,7 @@ occupant = null STOP_PROCESSING(SSobj, src) -/obj/structure/mineral_bath/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/structure/mineral_bath/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && ismob(dropping)) enter_bath(dropping, user) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 6a3c583affd..39d74c931f5 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -114,7 +114,7 @@ /obj/structure/morgue_tray/attack_robot(mob/user) return attack_hand_with_interaction_checks(user) -/obj/structure/morgue_tray/receive_mouse_drop(atom/dropping, mob/user) +/obj/structure/morgue_tray/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && (ismob(dropping) || istype(dropping, /obj/structure/closet/body_bag))) var/atom/movable/AM = dropping diff --git a/code/game/objects/structures/pit.dm b/code/game/objects/structures/pit.dm index c4aa53f548d..0ff20c66427 100644 --- a/code/game/objects/structures/pit.dm +++ b/code/game/objects/structures/pit.dm @@ -11,16 +11,17 @@ /obj/structure/pit/attackby(obj/item/W, mob/user) if(IS_SHOVEL(W)) - if(W.do_tool_interaction(TOOL_SHOVEL, user, src, 5 SECONDS, "[open ? "filling up" : "digging open"]", "[open ? "fills up" : "digs open"]")) + var/dig_message = open ? "filling in" : "excavating" + if(W.do_tool_interaction(TOOL_SHOVEL, user, src, 5 SECONDS, dig_message, dig_message)) if(open) close(user) else open() else - to_chat(user, SPAN_NOTICE("You stop shoveling.")) + to_chat(user, SPAN_NOTICE("You stop digging.")) return TRUE - if (!open && istype(W, /obj/item/stack/material) && W.material?.type == /decl/material/solid/wood) + if (!open && istype(W, /obj/item/stack/material) && W.material?.type == /decl/material/solid/organic/wood) if(locate(/obj/structure/gravemarker) in src.loc) to_chat(user, SPAN_WARNING("There's already a grave marker here.")) else @@ -47,7 +48,7 @@ desc = initial(desc) open = TRUE for(var/atom/movable/A in src) - A.forceMove(src.loc) + A.dropInto(loc) update_icon() /obj/structure/pit/proc/close(var/user) @@ -56,22 +57,17 @@ open = FALSE //If we close the pit without anything inside, just leave the soil undisturbed - var/turf/T = get_turf(src) - if(!length((T.contents - src))) + if(isturf(loc)) + for(var/atom/movable/A in loc) + if(A != src && !A.anchored && A != user && A.simulated) + A.forceMove(src) + if(!length(contents)) qdel(src) - return - - for(var/atom/movable/A in T) - if(!A.anchored && A != user && A.simulated) - A.forceMove(src) - - update_icon() + else + update_icon() /obj/structure/pit/return_air() - if(open && loc) - return loc.return_air() - else - return null + return open && loc?.return_air() /obj/structure/pit/proc/digout(mob/escapee) var/breakout_time = 1 //2 minutes by default @@ -162,7 +158,7 @@ pixel_x = 15 pixel_y = 8 anchored = TRUE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood w_class = ITEM_SIZE_NORMAL var/message = "Unknown." diff --git a/code/game/objects/structures/quicksand.dm b/code/game/objects/structures/quicksand.dm index da5a381cfa9..3ae09a30e4f 100644 --- a/code/game/objects/structures/quicksand.dm +++ b/code/game/objects/structures/quicksand.dm @@ -83,12 +83,13 @@ else ..() -/obj/effect/quicksand/Crossed(var/atom/movable/AM) - if(isliving(AM)) - var/mob/living/L = AM - if(L.throwing || L.can_overcome_gravity()) - return - buckle_mob(L) - if(!exposed) - expose() - to_chat(L, SPAN_DANGER("You fall into \the [src]!")) +/obj/effect/quicksand/Crossed(atom/movable/AM) + if(!isliving(AM)) + return + var/mob/living/L = AM + if(L.throwing || L.can_overcome_gravity()) + return + buckle_mob(L) + if(!exposed) + expose() + to_chat(L, SPAN_DANGER("You fall into \the [src]!")) diff --git a/code/game/objects/structures/racks.dm b/code/game/objects/structures/racks.dm index 1f8828f5b74..7aaa0dd4420 100644 --- a/code/game/objects/structures/racks.dm +++ b/code/game/objects/structures/racks.dm @@ -7,12 +7,13 @@ handle_generic_blending = FALSE tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE throwpass = TRUE parts_amount = 2 parts_type = /obj/item/stack/material/strut density = TRUE anchored = TRUE + structure_flags = STRUCTURE_FLAG_SURFACE /obj/structure/rack/Initialize() ..() diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index f472368a72d..69a056f2d2d 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -8,11 +8,11 @@ layer = OBJ_LAYER climb_speed_mult = 0.25 anchored = FALSE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CHECKS_BORDER | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CHECKS_BORDER | ATOM_FLAG_CLIMBABLE obj_flags = OBJ_FLAG_ROTATABLE | OBJ_FLAG_MOVES_UNSUPPORTED material = DEFAULT_FURNITURE_MATERIAL material_alteration = MAT_FLAG_ALTERATION_ALL - maxhealth = 100 + max_health = 100 parts_amount = 2 parts_type = /obj/item/stack/material/strut @@ -76,25 +76,6 @@ return !density return TRUE -/obj/structure/railing/examine(mob/user) - . = ..() - if(health < maxhealth) - switch(health / maxhealth) - if(0.0 to 0.5) - to_chat(user, "It looks severely damaged!") - if(0.25 to 0.5) - to_chat(user, "It looks damaged!") - if(0.5 to 1.0) - to_chat(user, "It has a few scrapes and dents.") - -/obj/structure/railing/take_damage(amount) - health -= amount - if(health <= 0) - visible_message("\The [src] [material.destruction_desc]!") - playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) - material.place_shards(get_turf(usr)) - qdel(src) - /obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1) neighbor_status = 0 var/Rturn = turn(src.dir, -90) @@ -252,15 +233,15 @@ if(IS_WELDER(W)) var/obj/item/weldingtool/F = W if(F.isOn()) - if(health >= maxhealth) + if(health >= max_health) to_chat(user, "\The [src] does not need repairs.") return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, src)) - if(health >= maxhealth) + if(health >= max_health) return user.visible_message("\The [user] repairs some damage to \the [src].", "You repair some damage to \the [src].") - health = min(health+(maxhealth/5), maxhealth) + health = min(health+(max_health/5), max_health) return // Install @@ -300,7 +281,7 @@ . = ..() if(.) if(!anchored || material.is_brittle()) - take_damage(maxhealth) // Fatboy + take_damage(max_health) // Fatboy user.jump_layer_shift() - addtimer(CALLBACK(user, /mob/living/proc/jump_layer_shift_end), 2) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living, jump_layer_shift_end)), 2) diff --git a/code/game/objects/structures/rubble.dm b/code/game/objects/structures/rubble.dm index 632fedb3ccf..8a1bf024a49 100644 --- a/code/game/objects/structures/rubble.dm +++ b/code/game/objects/structures/rubble.dm @@ -6,7 +6,7 @@ opacity = TRUE density = TRUE anchored = TRUE - maxhealth = 50 + max_health = 50 var/list/loot = list( /obj/item/cell, diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index ad71597b51c..6eeed5b35c6 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -165,7 +165,7 @@ FLOOR SAFES name = "floor safe" icon_state = "floorsafe" density = FALSE - level = 1 //underfloor + level = LEVEL_BELOW_PLATING layer = BELOW_OBJ_LAYER /obj/structure/safe/floor/Initialize() diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index b422eef2902..2b4de7e59db 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -5,4 +5,3 @@ desc = "A stand with the empty body of a cyborg bolted to it." density = TRUE anchored = TRUE - unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr \ No newline at end of file diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index bf3419b3059..ce38bacadd5 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -7,7 +7,7 @@ /obj/item/sign name = "sign" w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic ///The type of the sign this item will turn into upon installation var/sign_type @@ -94,7 +94,7 @@ layer = ABOVE_WINDOW_LAYER w_class = ITEM_SIZE_NORMAL obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'WEST':{'x':32}, 'EAST':{'x':-32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "WEST":{"x":32}, "EAST":{"x":-32}}' abstract_type = /obj/structure/sign parts_type = /obj/item/sign parts_amount = 1 diff --git a/code/game/objects/structures/signs/bar_signs.dm b/code/game/objects/structures/signs/bar_signs.dm index 917bf4c3b05..51396fea7bb 100644 --- a/code/game/objects/structures/signs/bar_signs.dm +++ b/code/game/objects/structures/signs/bar_signs.dm @@ -5,7 +5,7 @@ //The sign is 64x32, so it needs two tiles. ;3 icon = 'icons/obj/signs/bar.dmi' //The bar sign always faces south - directional_offset = "{'NORTH':{'y':32}, 'SOUTH':{'y':32}, 'WEST':{'y':32}, 'EAST':{'y':32}}" + directional_offset = @'{"NORTH":{"y":32}, "SOUTH":{"y":32}, "WEST":{"y":32}, "EAST":{"y":32}}' abstract_type = /obj/structure/sign/double/maltesefalcon /obj/structure/sign/double/maltesefalcon/left diff --git a/code/game/objects/structures/signs/diploma.dm b/code/game/objects/structures/signs/diploma.dm index efc0ae4e6f6..d36a52bafd3 100644 --- a/code/game/objects/structures/signs/diploma.dm +++ b/code/game/objects/structures/signs/diploma.dm @@ -52,10 +52,10 @@ desc = "A wall-mounted laminated diploma." icon = 'icons/obj/signs/plaques.dmi' icon_state = "goldenplaque" - material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple matter = list( /decl/material/solid/glass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/paper = MATTER_AMOUNT_TRACE, + /decl/material/solid/organic/paper = MATTER_AMOUNT_TRACE, ) parts_type = /obj/item/sign/diploma ///Details on the diploma this plaque contains. Can be a path on definition, turns into an instance at runtime. @@ -84,10 +84,10 @@ abstract_type = /obj/item/sign/diploma name = "diploma" sign_type = /obj/structure/sign/plaque/diploma - material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple matter = list( /decl/material/solid/glass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/paper = MATTER_AMOUNT_TRACE, + /decl/material/solid/organic/paper = MATTER_AMOUNT_TRACE, ) ///Details on the diploma this plaque contains. Can be a path on definition, turns into an instance at runtime. var/datum/diploma_details/details = /datum/diploma_details diff --git a/code/game/objects/structures/signs/direction_signs.dm b/code/game/objects/structures/signs/direction_signs.dm index 77b10cf104c..1b331afc994 100644 --- a/code/game/objects/structures/signs/direction_signs.dm +++ b/code/game/objects/structures/signs/direction_signs.dm @@ -9,7 +9,7 @@ icon = 'icons/obj/signs/directions.dmi' icon_state = "direction" //Direction signs are always meant to face south! The arrow on the sign matches the direction it points to. - directional_offset = "{'NORTH':{'y':32}, 'SOUTH':{'y':32}, 'WEST':{'y':32}, 'EAST':{'y':32}}" + directional_offset = @'{"NORTH":{"y":32}, "SOUTH":{"y":32}, "WEST":{"y":32}, "EAST":{"y":32}}' /obj/structure/sign/directions/update_description() desc = "A direction sign, pointing out \the [name] is [global.dir_name(dir)]." diff --git a/code/game/objects/structures/signs/warning_signs.dm b/code/game/objects/structures/signs/warning_signs.dm index e11bafb614d..7165a62c8a0 100644 --- a/code/game/objects/structures/signs/warning_signs.dm +++ b/code/game/objects/structures/signs/warning_signs.dm @@ -8,7 +8,7 @@ desc = "You've been warned!" icon = 'icons/obj/signs/slim_warnings.dmi' icon_state = "securearea" - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'WEST':{'x':34}, 'EAST':{'x':-34}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "WEST":{"x":34}, "EAST":{"x":-34}}' /obj/structure/sign/warning/update_description() desc = "A warning sign which reads '[sanitize(name)]'." diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index 99e28d423d4..fd144cae909 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -74,7 +74,7 @@ release() return ..() -/mob/living/simple_animal/handle_mouse_drop(atom/over, mob/user) +/mob/living/simple_animal/handle_mouse_drop(atom/over, mob/user, params) if(istype(over, /obj/structure/stasis_cage)) var/obj/structure/stasis_cage/cage = over if(!stat && !istype(buckled, /obj/effect/energy_net)) diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index 19e18b6339b..95fb9712f41 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -25,7 +25,7 @@ parts_type = /obj/item/stack/material/strut var/base_icon = "bed" -/obj/structure/bed/user_can_mousedrop_onto(var/mob/user, var/atom/being_dropped, var/incapacitation_flags) +/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params) if(user == being_dropped) return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT) return ..() @@ -81,7 +81,7 @@ return var/padding_type //This is awful but it needs to be like this until tiles are given a material var. if(istype(W,/obj/item/stack/tile/carpet)) - padding_type = /decl/material/solid/carpet + padding_type = /decl/material/solid/organic/carpet else if(istype(W,/obj/item/stack/material)) var/obj/item/stack/material/M = W if(M.material && (M.material.flags & MAT_FLAG_PADDING)) @@ -128,14 +128,14 @@ name = "psychiatrist's couch" desc = "For prime comfort during psychiatric evaluations." icon_state = "psychbed" - material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut /obj/structure/bed/psych/leather - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/padded material = /decl/material/solid/metal/aluminium - reinf_material = /decl/material/solid/cloth + reinf_material = /decl/material/solid/organic/cloth /* * Roller beds @@ -237,7 +237,7 @@ queue_icon_update() STOP_PROCESSING(SSobj,src) -/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user) +/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user, params) if(ishuman(user) || isrobot(user)) if(over == buckled_mob && beaker) if(iv_attached) @@ -268,8 +268,8 @@ pickup_sound = 'sound/foley/pickup2.ogg' material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/cloth = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT, ) var/structure_form_type = /obj/structure/bed/roller //The deployed form path. diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm index 13e985881b5..197a92739aa 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm @@ -25,13 +25,13 @@ icon_state = base_icon var/image/I = image(icon, "[base_icon]_over") I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER - if(material_alteration & MAT_FLAG_ALTERATION_COLOR) + if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR)) I.appearance_flags |= RESET_COLOR I.color = material.color add_overlay(I) I = image(icon, "[base_icon]_armrest") I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER - if(material_alteration & MAT_FLAG_ALTERATION_COLOR) + if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR)) I.appearance_flags |= RESET_COLOR I.color = material.color add_overlay(I) @@ -51,7 +51,7 @@ if(has_special_overlay) I = image(icon, "[base_icon]_special") I.layer = buckled_mob ? ABOVE_HUMAN_LAYER : FLOAT_LAYER - if(material_alteration & MAT_FLAG_ALTERATION_COLOR) + if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR)) I.appearance_flags |= RESET_COLOR I.color = material.color add_overlay(I) @@ -65,25 +65,25 @@ update_icon() /obj/structure/bed/chair/padded/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/chair/padded/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/chair/padded/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/chair/padded/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/padded/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/chair/padded/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/chair/padded/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/chair/padded/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/chair/padded/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/chair/padded/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow // Leaving this in for the sake of compilation. /obj/structure/bed/chair/comfy @@ -93,25 +93,25 @@ base_icon = "comfychair" /obj/structure/bed/chair/comfy/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/chair/comfy/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/chair/comfy/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/chair/comfy/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/comfy/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/chair/comfy/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/chair/comfy/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/chair/comfy/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/chair/comfy/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/chair/comfy/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow /obj/structure/bed/chair/comfy/captain name = "captain chair" @@ -120,7 +120,7 @@ base_icon = "capchair" buckle_movable = 1 material = /decl/material/solid/metal/steel - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue has_special_overlay = TRUE /obj/structure/bed/chair/armchair @@ -130,25 +130,25 @@ base_icon = "armchair" /obj/structure/bed/chair/armchair/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/chair/armchair/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/chair/armchair/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/chair/armchair/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/armchair/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/chair/armchair/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/chair/armchair/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/chair/armchair/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/chair/armchair/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/chair/armchair/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow /obj/structure/bed/chair/office name = "office chair" @@ -196,9 +196,9 @@ occupant.visible_message("[occupant] crashed into \the [A]!") /obj/structure/bed/chair/office/light - reinf_material = /decl/material/solid/cloth + reinf_material = /decl/material/solid/organic/cloth /obj/structure/bed/chair/office/dark - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/office/comfy name = "comfy office chair" @@ -207,25 +207,25 @@ base_icon = "comfyofficechair" /obj/structure/bed/chair/office/comfy/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/chair/office/comfy/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/chair/office/comfy/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/chair/office/comfy/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/office/comfy/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/chair/office/comfy/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/chair/office/comfy/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/chair/office/comfy/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/chair/office/comfy/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/chair/office/comfy/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow /obj/structure/bed/chair/rounded name = "rounded chair" @@ -234,25 +234,25 @@ base_icon = "roundedchair" /obj/structure/bed/chair/rounded/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/chair/rounded/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/chair/rounded/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/chair/rounded/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/rounded/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/chair/rounded/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/chair/rounded/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/chair/rounded/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/chair/rounded/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/chair/rounded/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow /obj/structure/bed/chair/shuttle name = "shuttle seat" @@ -271,11 +271,11 @@ ..() /obj/structure/bed/chair/shuttle/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/chair/shuttle/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/chair/shuttle/white - reinf_material = /decl/material/solid/cloth + reinf_material = /decl/material/solid/organic/cloth /obj/structure/bed/chair/wood name = "classic chair" @@ -283,7 +283,7 @@ icon_state = "wooden_chair_preview" base_icon = "wooden_chair" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/structure/bed/chair/wood/attackby(obj/item/W, mob/user) if(istype(W,/obj/item/stack) || IS_WIRECUTTER(W)) @@ -292,16 +292,16 @@ /obj/structure/bed/chair/wood/mahogany color = WOOD_COLOR_RICH - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany /obj/structure/bed/chair/wood/maple color = WOOD_COLOR_PALE - material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple /obj/structure/bed/chair/wood/ebony color = WOOD_COLOR_BLACK - material = /decl/material/solid/wood/ebony + material = /decl/material/solid/organic/wood/ebony /obj/structure/bed/chair/wood/walnut color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut /obj/structure/bed/chair/wood/wings name = "winged chair" @@ -310,16 +310,16 @@ /obj/structure/bed/chair/wood/wings/mahogany color = WOOD_COLOR_RICH - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany /obj/structure/bed/chair/wood/wings/maple color = WOOD_COLOR_PALE - material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple /obj/structure/bed/chair/wood/wings/ebony color = WOOD_COLOR_BLACK - material = /decl/material/solid/wood/ebony + material = /decl/material/solid/organic/wood/ebony /obj/structure/bed/chair/wood/wings/walnut color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut /obj/structure/bed/chair/pew name = "pew" @@ -327,13 +327,13 @@ icon_state = "pew" base_icon = "pew" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood obj_flags = 0 /obj/structure/bed/chair/pew/left icon_state = "pew_left" /obj/structure/bed/chair/pew/mahogany color = WOOD_COLOR_RICH - material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany /obj/structure/bed/chair/pew/left/mahogany color = WOOD_COLOR_RICH - material = /decl/material/solid/wood/mahogany \ No newline at end of file + material = /decl/material/solid/organic/wood/mahogany \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm new file mode 100644 index 00000000000..b38ffe0919b --- /dev/null +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm @@ -0,0 +1,27 @@ +/obj/structure/bed/sofa/pew + name = "pew" + desc = "A long, hard wooden seat, often seen in churches and other places of worship, as well as courtrooms." + icon_state = "pewmiddle" + base_icon = "pewmiddle" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood + +/obj/structure/bed/sofa/pew/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/mahogany + +/obj/structure/bed/sofa/pew/right + icon_state = "pewend_right" + base_icon = "pewend_right" + +/obj/structure/bed/sofa/pew/right/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/mahogany + +/obj/structure/bed/sofa/pew/left + icon_state = "pewend_left" + base_icon = "pewend_left" + +/obj/structure/bed/sofa/pew/left/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/mahogany \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm index 0ee8fae8343..a4a9853f8c3 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm @@ -7,7 +7,7 @@ buckle_dir = FALSE buckle_lying = FALSE //force people to sit up in chairs when buckled obj_flags = OBJ_FLAG_ROTATABLE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood var/has_special_overlay = FALSE @@ -84,25 +84,25 @@ update_icon() /obj/structure/bed/sofa/middle/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/sofa/middle/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/sofa/middle/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/sofa/middle/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/sofa/middle/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/sofa/middle/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/sofa/middle/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/sofa/middle/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/sofa/middle/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/sofa/middle/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow /obj/structure/bed/sofa/right name = "sofa" @@ -111,25 +111,25 @@ base_icon = "sofa_r" /obj/structure/bed/sofa/right/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/sofa/right/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/sofa/right/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/sofa/right/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/sofa/right/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/sofa/right/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/sofa/right/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/sofa/right/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/sofa/right/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/sofa/right/yellow - reinf_material = /decl/material/solid/cloth/yellow + reinf_material = /decl/material/solid/organic/cloth/yellow /obj/structure/bed/sofa/left name = "sofa" @@ -138,22 +138,22 @@ base_icon = "sofa_l" /obj/structure/bed/sofa/left/red - reinf_material = /decl/material/solid/carpet + reinf_material = /decl/material/solid/organic/carpet /obj/structure/bed/sofa/left/brown - reinf_material = /decl/material/solid/leather + reinf_material = /decl/material/solid/organic/leather /obj/structure/bed/sofa/left/teal - reinf_material = /decl/material/solid/cloth/teal + reinf_material = /decl/material/solid/organic/cloth/teal /obj/structure/bed/sofa/left/black - reinf_material = /decl/material/solid/cloth/black + reinf_material = /decl/material/solid/organic/cloth/black /obj/structure/bed/sofa/left/green - reinf_material = /decl/material/solid/cloth/green + reinf_material = /decl/material/solid/organic/cloth/green /obj/structure/bed/sofa/left/purple - reinf_material = /decl/material/solid/cloth/purple + reinf_material = /decl/material/solid/organic/cloth/purple /obj/structure/bed/sofa/left/blue - reinf_material = /decl/material/solid/cloth/blue + reinf_material = /decl/material/solid/organic/cloth/blue /obj/structure/bed/sofa/left/beige - reinf_material = /decl/material/solid/cloth/beige + reinf_material = /decl/material/solid/organic/cloth/beige /obj/structure/bed/sofa/left/lime - reinf_material = /decl/material/solid/cloth/lime + reinf_material = /decl/material/solid/organic/cloth/lime /obj/structure/bed/sofa/left/yellow - reinf_material = /decl/material/solid/cloth/yellow \ No newline at end of file + reinf_material = /decl/material/solid/organic/cloth/yellow \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm index 9cad329aae8..29b93c08003 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm @@ -15,7 +15,7 @@ /obj/item/stool/padded icon_state = "stool_padded_preview" //set for the map - padding_material = /decl/material/solid/carpet + padding_material = /decl/material/solid/organic/carpet /obj/item/stool/Initialize() . = ..() @@ -27,7 +27,7 @@ update_icon() /obj/item/stool/padded - padding_material = /decl/material/solid/carpet + padding_material = /decl/material/solid/organic/carpet /obj/item/stool/bar name = "bar stool" @@ -37,7 +37,7 @@ /obj/item/stool/bar/padded icon_state = "bar_stool_padded_preview" - padding_material = /decl/material/solid/carpet + padding_material = /decl/material/solid/organic/carpet /obj/item/stool/on_update_icon() . = ..() @@ -108,7 +108,7 @@ return var/padding_type //This is awful but it needs to be like this until tiles are given a material var. if(istype(W,/obj/item/stack/tile/carpet)) - padding_type = /decl/material/solid/carpet + padding_type = /decl/material/solid/organic/carpet else if(istype(W,/obj/item/stack/material)) var/obj/item/stack/material/M = W if(M.material && (M.material.flags & MAT_FLAG_PADDING)) @@ -135,4 +135,4 @@ //Generated subtypes for mapping porpoises /obj/item/stool/wood - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index ef9eb7989d8..1d839db87bb 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -8,18 +8,19 @@ desc = "It's a table, for putting things on. Or standing on, if you really want to." density = TRUE anchored = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE layer = TABLE_LAYER throwpass = TRUE // Note that mob_offset also determines whether you can walk from one table to another without climbing. // TODO: add 1px step-up? mob_offset = 12 handle_generic_blending = TRUE - maxhealth = 10 + max_health = 10 tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC parts_amount = 2 parts_type = /obj/item/stack/material/strut + structure_flags = STRUCTURE_FLAG_SURFACE var/can_flip = TRUE var/is_flipped = FALSE @@ -464,7 +465,7 @@ return TRUE return TRUE -/obj/structure/table/receive_mouse_drop(atom/dropping, mob/user) +/obj/structure/table/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && !isrobot(user) && isitem(dropping) && user.get_active_hand() == dropping && user.try_unequip(dropping)) var/obj/item/I = dropping @@ -659,8 +660,8 @@ /obj/structure/table/gamblingtable icon_state = "gamble_preview" felted = TRUE - material = /decl/material/solid/wood/walnut - reinf_material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut + reinf_material = /decl/material/solid/organic/wood/walnut /obj/structure/table/glass icon_state = "plain_preview" @@ -674,81 +675,81 @@ /obj/structure/table/holotable icon_state = "holo_preview" + holographic = TRUE color = COLOR_OFF_WHITE material = /decl/material/solid/metal/aluminium/holographic reinf_material = /decl/material/solid/metal/aluminium/holographic /obj/structure/table/holo_plastictable icon_state = "holo_preview" + holographic = TRUE color = COLOR_OFF_WHITE - material = /decl/material/solid/plastic/holographic - reinf_material = /decl/material/solid/plastic/holographic + material = /decl/material/solid/organic/plastic/holographic + reinf_material = /decl/material/solid/organic/plastic/holographic /obj/structure/table/holo_woodentable + holographic = TRUE icon_state = "holo_preview" - -/obj/structure/table/holo_woodentable/Initialize() - material = /decl/material/solid/wood/holographic - reinf_material = /decl/material/solid/wood/holographic - . = ..() + material = /decl/material/solid/organic/wood/holographic + reinf_material = /decl/material/solid/organic/wood/holographic //wood wood wood /obj/structure/table/woodentable icon_state = "solid_preview" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/wood - reinf_material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood + reinf_material = /decl/material/solid/organic/wood /obj/structure/table/woodentable/mahogany color = WOOD_COLOR_RICH - material = /decl/material/solid/wood/mahogany - reinf_material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany + reinf_material = /decl/material/solid/organic/wood/mahogany /obj/structure/table/woodentable/maple color = WOOD_COLOR_PALE - material = /decl/material/solid/wood/maple - reinf_material = /decl/material/solid/wood/maple + material = /decl/material/solid/organic/wood/maple + reinf_material = /decl/material/solid/organic/wood/maple /obj/structure/table/woodentable/ebony color = WOOD_COLOR_BLACK - material = /decl/material/solid/wood/ebony - reinf_material = /decl/material/solid/wood/ebony + material = /decl/material/solid/organic/wood/ebony + reinf_material = /decl/material/solid/organic/wood/ebony /obj/structure/table/woodentable/walnut color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/wood/walnut - reinf_material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut + reinf_material = /decl/material/solid/organic/wood/walnut /obj/structure/table/woodentable_reinforced icon_state = "reinf_preview" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/wood - reinf_material = /decl/material/solid/wood - additional_reinf_material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood + reinf_material = /decl/material/solid/organic/wood + additional_reinf_material = /decl/material/solid/organic/wood /obj/structure/table/woodentable_reinforced/walnut color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/wood/walnut - reinf_material = /decl/material/solid/wood/walnut - additional_reinf_material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut + reinf_material = /decl/material/solid/organic/wood/walnut + additional_reinf_material = /decl/material/solid/organic/wood/walnut /obj/structure/table/woodentable_reinforced/walnut/maple - additional_reinf_material = /decl/material/solid/wood/maple + additional_reinf_material = /decl/material/solid/organic/wood/maple /obj/structure/table/woodentable_reinforced/mahogany color = WOOD_COLOR_RICH - material = /decl/material/solid/wood/mahogany - reinf_material = /decl/material/solid/wood/mahogany - additional_reinf_material = /decl/material/solid/wood/mahogany + material = /decl/material/solid/organic/wood/mahogany + reinf_material = /decl/material/solid/organic/wood/mahogany + additional_reinf_material = /decl/material/solid/organic/wood/mahogany /obj/structure/table/woodentable_reinforced/mahogany/walnut - additional_reinf_material = /decl/material/solid/wood/walnut + additional_reinf_material = /decl/material/solid/organic/wood/walnut /obj/structure/table/woodentable_reinforced/ebony color = WOOD_COLOR_BLACK - material = /decl/material/solid/wood/ebony - reinf_material = /decl/material/solid/wood/ebony - additional_reinf_material = /decl/material/solid/wood/ebony + material = /decl/material/solid/organic/wood/ebony + reinf_material = /decl/material/solid/organic/wood/ebony + additional_reinf_material = /decl/material/solid/organic/wood/ebony /obj/structure/table/woodentable_reinforced/ebony/walnut - additional_reinf_material = /decl/material/solid/wood/walnut + additional_reinf_material = /decl/material/solid/organic/wood/walnut diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index b9c5cca488b..07d1f16441a 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -28,8 +28,8 @@ T.pixel_x = 0 T.pixel_y = 0 T.layer = ABOVE_OBJ_LAYER - events_repository.register(/decl/observ/moved, T, src, /atom/movable/proc/move_to_turf) - events_repository.register(/decl/observ/moved, src, T, /atom/movable/proc/move_to_turf) + events_repository.register(/decl/observ/moved, T, src, TYPE_PROC_REF(/atom/movable, move_to_turf)) + events_repository.register(/decl/observ/moved, src, T, TYPE_PROC_REF(/atom/movable, move_to_turf)) T.stake = src pinned_target = T else diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index c49e81e6844..ff844e19d4f 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -27,7 +27,7 @@ var/number_of_underwear = LAZYACCESS(amount_of_underwear_by_id_card, id) - 1 if(number_of_underwear) LAZYSET(amount_of_underwear_by_id_card, id, number_of_underwear) - events_repository.register(/decl/observ/destroyed, id, src, /obj/structure/undies_wardrobe/proc/remove_id_card) + events_repository.register(/decl/observ/destroyed, id, src, TYPE_PROC_REF(/obj/structure/undies_wardrobe, remove_id_card)) else remove_id_card(id) @@ -36,7 +36,7 @@ /obj/structure/undies_wardrobe/proc/remove_id_card(var/id_card) LAZYREMOVE(amount_of_underwear_by_id_card, id_card) - events_repository.unregister(/decl/observ/destroyed, id_card, src, /obj/structure/undies_wardrobe/proc/remove_id_card) + events_repository.unregister(/decl/observ/destroyed, id_card, src, TYPE_PROC_REF(/obj/structure/undies_wardrobe, remove_id_card)) /obj/structure/undies_wardrobe/attack_hand(var/mob/user) if(!human_who_can_use_underwear(user)) diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index e919d9ce5af..c70b7ca4552 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -6,7 +6,7 @@ desc = "A low wall section which serves as the base of windows, amongst other things." icon = 'icons/obj/structures/wall_frame.dmi' icon_state = "frame" - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_CAN_BE_PAINTED | ATOM_FLAG_ADJACENT_EXCEPTION + atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_CAN_BE_PAINTED | ATOM_FLAG_ADJACENT_EXCEPTION obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED anchored = TRUE density = TRUE @@ -16,7 +16,7 @@ material = DEFAULT_WALL_MATERIAL handle_generic_blending = TRUE tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) - maxhealth = 40 + max_health = 40 parts_amount = 2 parts_type = /obj/item/stack/material/strut @@ -48,12 +48,13 @@ if(paint_color) to_chat(user, SPAN_NOTICE("It has a smooth coat of paint applied.")) -/obj/structure/wall_frame/get_examined_damage_string(health_ratio) - if(maxhealth == -1) +/obj/structure/wall_frame/get_examined_damage_string() + if(!can_take_damage()) return - if(health_ratio > 0.7) + var/health_percent = get_percent_health() + if(health_percent > 70) return SPAN_NOTICE("It's got a few dents and scratches.") - else if(health_ratio > 0.3) + else if(health_percent > 30) return SPAN_WARNING("A few pieces of panelling have fallen off.") else return SPAN_DANGER("It's nearly falling to pieces.") diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index cdf020d1e31..c9d7b701def 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -208,7 +208,7 @@ var/global/list/hygiene_props = list() icon_state = "urinal" density = FALSE anchored = TRUE - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED /obj/structure/hygiene/urinal/attackby(var/obj/item/I, var/mob/user) @@ -284,7 +284,7 @@ var/global/list/hygiene_props = list() /obj/effect/mist/Initialize() . = ..() if(. != INITIALIZE_HINT_QDEL) - addtimer(CALLBACK(src, /datum/proc/qdel_self), 25 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, qdel_self)), 25 SECONDS) /obj/structure/hygiene/shower/attackby(obj/item/I, var/mob/user) if(istype(I, /obj/item/scanner/gas)) @@ -335,17 +335,16 @@ var/global/list/hygiene_props = list() M.bodytemperature += temp_adj if(ishuman(M)) var/mob/living/carbon/human/H = M - if(water_temperature >= H.get_temperature_threshold(HEAT_LEVEL_1)) + if(water_temperature >= H.get_mob_temperature_threshold(HEAT_LEVEL_1)) to_chat(H, SPAN_DANGER("The water is searing hot!")) - else if(water_temperature <= H.get_temperature_threshold(COLD_LEVEL_1)) + else if(water_temperature <= H.get_mob_temperature_threshold(COLD_LEVEL_1)) to_chat(H, SPAN_DANGER("The water is freezing cold!")) /obj/item/bikehorn/rubberducky name = "rubber ducky" desc = "Rubber ducky you're so fine, you make bathtime lots of fuuun. Rubber ducky I'm awfully fooooond of yooooouuuu~" //thanks doohl - icon = 'icons/obj/watercloset.dmi' - icon_state = "rubberducky" - item_state = "rubberducky" + icon = 'icons/obj/rubber_duck.dmi' + icon_state = ICON_STATE_WORLD /obj/structure/hygiene/sink name = "sink" @@ -355,7 +354,7 @@ var/global/list/hygiene_props = list() anchored = TRUE var/busy = 0 //Something's being washed at the moment -/obj/structure/hygiene/sink/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/structure/hygiene/sink/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && isitem(dropping) && ATOM_IS_OPEN_CONTAINER(dropping)) var/obj/item/thing = dropping @@ -410,8 +409,9 @@ var/global/list/hygiene_props = list() else if (istype(O, /obj/item/baton)) var/obj/item/baton/B = O - if(B.bcell) - if(B.bcell.charge > 0 && B.status == 1) + var/obj/item/cell/cell = B.get_cell() + if(cell) + if(cell.charge > 0 && B.status == 1) flick("baton_active", src) if(isliving(user)) var/mob/living/M = user @@ -526,7 +526,7 @@ var/global/list/hygiene_props = list() return if(can_use(1)) - visible_message(SPAN_NOTICE("\The [usr] tears a sheet from \the [src]."), SPAN_NOTICE("You tear a sheet from \the [src].")) + usr.visible_message(SPAN_NOTICE("\The [usr] tears a sheet from \the [src]."), SPAN_NOTICE("You tear a sheet from \the [src].")) var/obj/item/paper/crumpled/bog/C = new(loc) usr.put_in_hands(C) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 32c5c114abe..80839fb8b84 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -7,7 +7,7 @@ layer = SIDE_WINDOW_LAYER anchored = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CHECKS_BORDER | ATOM_FLAG_CAN_BE_PAINTED + atom_flags = ATOM_FLAG_CHECKS_BORDER | ATOM_FLAG_CAN_BE_PAINTED obj_flags = OBJ_FLAG_ROTATABLE | OBJ_FLAG_MOVES_UNSUPPORTED alpha = 180 material = /decl/material/solid/glass @@ -15,7 +15,7 @@ atmos_canpass = CANPASS_PROC handle_generic_blending = TRUE hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 100 + max_health = 100 var/damage_per_fire_tick = 2 // Amount of damage per fire tick. Regular windows are not fireproof so they might as well break quickly. var/construction_state = 2 diff --git a/code/game/sound.dm b/code/game/sound.dm index b72d517281a..d4eb620d38f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -55,8 +55,8 @@ var/global/const/FALLOFF_SOUNDS = 0.5 volume *= pressure_factor - if(!turf_source.blocks_air && (T.zone || turf_source.zone) && T.zone != turf_source.zone) - volume -= 30 + if(!turf_source.blocks_air && T.zone != turf_source.zone) + volume = round(volume * 0.7) // quick and dirty volume reduction from ZAS flood fill return volume /mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff, is_global, extrarange, override_env, envdry, envwet) diff --git a/code/game/turfs/exterior/_exterior.dm b/code/game/turfs/exterior/_exterior.dm index b0d07c078cd..7fe91eec612 100644 --- a/code/game/turfs/exterior/_exterior.dm +++ b/code/game/turfs/exterior/_exterior.dm @@ -8,7 +8,6 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH zone_membership_candidate = TRUE var/base_color - var/diggable = 1 var/dirt_color = "#7c5e42" var/possible_states = 0 var/icon_edge_layer = -1 @@ -16,6 +15,18 @@ var/icon_has_corners = FALSE ///If this turf is on a level that belongs to a planetoid, this is a reference to that planetoid. var/datum/planetoid_data/owner + ///Overrides the level's strata for this turf. + var/strata_override + var/decl/material/material + /// Whether or not sand/clay has been dug up here. + var/dug = FALSE + +/turf/exterior/can_be_dug() + return !density && !is_open() + +/turf/exterior/clear_diggable_resources() + dug = TRUE + ..() /turf/exterior/Initialize(mapload, no_update_icon = FALSE) @@ -50,11 +61,13 @@ if(mapload) update_icon() else - for (var/turf/T in RANGE_TURFS(src, 1)) - if(TICK_CHECK) // not CHECK_TICK -- only queue if the server is overloaded - T.queue_icon_update() - else - T.update_icon() + for(var/direction in global.alldirs) + var/turf/target_turf = get_step_resolving_mimic(src, direction) + if(istype(target_turf)) + if(TICK_CHECK) // not CHECK_TICK -- only queue if the server is overloaded + target_turf.queue_icon_update() + else + target_turf.update_icon() /turf/exterior/is_floor() return !density && !is_open() @@ -73,25 +86,9 @@ for(var/obj/O in src) O.hide(0) -/turf/exterior/attackby(obj/item/C, mob/user) - //#TODO: Add some way to dig to lower levels? - if(diggable && IS_SHOVEL(C)) - if(C.do_tool_interaction(TOOL_SHOVEL, user, src, 5 SECONDS)) - new /obj/structure/pit(src) - diggable = FALSE - else - to_chat(user, SPAN_NOTICE("You stop shoveling.")) - return TRUE - - if(istype(C, /obj/item/stack/tile)) - var/obj/item/stack/tile/T = C - T.try_build_turf(user, src) - return TRUE - - . = ..() - /turf/exterior/explosion_act(severity) - SHOULD_CALL_PARENT(FALSE) + SHOULD_CALL_PARENT(TRUE) + ..() if(!istype(src, get_base_turf_by_area(src)) && (severity == 1 || (severity == 2 && prob(40)))) ChangeTurf(get_base_turf_by_area(src)) @@ -106,8 +103,8 @@ var/neighbors = 0 for(var/direction in global.cardinal) - var/turf/exterior/turf_to_check = get_step(src,direction) - if(!turf_to_check || turf_to_check.density) + var/turf/exterior/turf_to_check = get_step_resolving_mimic(src, direction) + if(!istype(turf_to_check) || turf_to_check.density) continue if(istype(turf_to_check, type)) neighbors |= direction @@ -128,11 +125,11 @@ if(icon_has_corners) for(var/direction in global.cornerdirs) - var/turf/exterior/turf_to_check = get_step(src,direction) - if(!isturf(turf_to_check) || turf_to_check.density || istype(turf_to_check, type)) + var/turf/exterior/turf_to_check = get_step_resolving_mimic(src, direction) + if(!istype(turf_to_check) || turf_to_check.density || istype(turf_to_check, type)) continue - if(!istype(turf_to_check) || icon_edge_layer > turf_to_check.icon_edge_layer) + if(icon_edge_layer > turf_to_check.icon_edge_layer) var/draw_state var/res = (neighbors & direction) if(res == 0) diff --git a/code/game/turfs/exterior/exterior_concrete.dm b/code/game/turfs/exterior/exterior_concrete.dm index 4a1fb989f44..cd50d2256e7 100644 --- a/code/game/turfs/exterior/exterior_concrete.dm +++ b/code/game/turfs/exterior/exterior_concrete.dm @@ -14,10 +14,12 @@ var/global/exterior_broken_states = icon_states('icons/turf/exterior/broken.dmi' name = "concrete" desc = "A flat expanse of artificial stone-like artificial material." icon = 'icons/turf/exterior/concrete.dmi' - diggable = FALSE var/broken var/burned +/turf/exterior/concrete/can_be_dug() + return FALSE + /turf/exterior/concrete/flooded flooded = TRUE color = COLOR_LIQUID_WATER diff --git a/code/game/turfs/exterior/exterior_grass.dm b/code/game/turfs/exterior/exterior_grass.dm index 2f700ee0695..d398dda4546 100644 --- a/code/game/turfs/exterior/exterior_grass.dm +++ b/code/game/turfs/exterior/exterior_grass.dm @@ -36,6 +36,7 @@ /turf/exterior/wildgrass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if((temperature > T0C + 200 && prob(5)) || temperature > T0C + 1000) melt() + return ..() /turf/exterior/wildgrass/melt() if(icon_state != "scorched") diff --git a/code/game/turfs/exterior/exterior_ice.dm b/code/game/turfs/exterior/exterior_ice.dm index f2016b237f5..c18e7a94a03 100644 --- a/code/game/turfs/exterior/exterior_ice.dm +++ b/code/game/turfs/exterior/exterior_ice.dm @@ -19,6 +19,7 @@ /turf/exterior/snow/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) melt() + return ..() /turf/exterior/snow/melt() if(icon_state != "permafrost") diff --git a/code/game/turfs/exterior/exterior_mud.dm b/code/game/turfs/exterior/exterior_mud.dm index 6f73f298485..018ff3548da 100644 --- a/code/game/turfs/exterior/exterior_mud.dm +++ b/code/game/turfs/exterior/exterior_mud.dm @@ -1,13 +1,25 @@ +/turf/exterior/clay + name = "clay" + desc = "Thick, claggy clay." + icon = 'icons/turf/exterior/mud_light.dmi' + icon_edge_layer = EXT_EDGE_CLAY + footstep_type = /decl/footsteps/mud + +/turf/exterior/clay/get_diggable_resources() + return dug ? null : list(/obj/item/stack/material/ore/clay = list(3, 2)) + +/turf/exterior/clay/flooded + flooded = TRUE + /turf/exterior/mud name = "mud" - desc = "Thick, claggy and waterlogged." - icon = 'icons/turf/exterior/mud_light.dmi' + desc = "Thick, waterlogged mud." + icon = 'icons/turf/exterior/mud_dark.dmi' icon_edge_layer = EXT_EDGE_MUD footstep_type = /decl/footsteps/mud -/turf/exterior/mud/dark - icon = 'icons/turf/exterior/mud_dark.dmi' - icon_edge_layer = EXT_EDGE_MUD_DARK +/turf/exterior/mud/flooded + flooded = TRUE /turf/exterior/dry name = "dry mud" diff --git a/code/game/turfs/exterior/exterior_rock.dm b/code/game/turfs/exterior/exterior_rock.dm new file mode 100644 index 00000000000..758b907ffc9 --- /dev/null +++ b/code/game/turfs/exterior/exterior_rock.dm @@ -0,0 +1,20 @@ +/turf/exterior/rock + name = "rock floor" + icon = 'icons/turf/exterior/rock.dmi' + icon_edge_layer = EXT_EDGE_VOLCANIC + +/turf/exterior/rock/can_be_dug() + return FALSE + +/turf/exterior/rock/Initialize(mapload, no_update_icon) + . = ..() + material = SSmaterials.get_strata_material_type(src) + if(material) + var/decl/material/M = GET_DECL(material) + name = "[M.adjective_name] floor" + dirt_color = M.color + color = M.color + +/turf/exterior/rock/volcanic + name = "volcanic floor" + strata_override = /decl/strata/igneous \ No newline at end of file diff --git a/code/game/turfs/exterior/exterior_sand.dm b/code/game/turfs/exterior/exterior_sand.dm index 491a9c6fcfb..81b2b039f7d 100644 --- a/code/game/turfs/exterior/exterior_sand.dm +++ b/code/game/turfs/exterior/exterior_sand.dm @@ -4,13 +4,17 @@ dirt_color = "#ae9e66" footstep_type = /decl/footsteps/sand icon = 'icons/turf/exterior/sand.dmi' - icon_edge_layer = EXT_EDGE_SAND + icon_edge_layer = EXT_EDGE_SAND icon_has_corners = TRUE possible_states = 4 /turf/exterior/sand/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if((temperature > T0C + 1700 && prob(5)) || temperature > T0C + 3000) melt() + return ..() + +/turf/exterior/sand/get_diggable_resources() + return dug ? null : list(/obj/item/stack/material/ore/sand = list(3, 2)) /turf/exterior/sand/melt() if(icon_state != "glass") @@ -18,4 +22,7 @@ desc = "A glassed patch of sand." icon_state = "glass" icon_edge_layer = -1 - diggable = FALSE + clear_diggable_resources() + +/turf/exterior/sand/can_be_dug() + return icon_state != "glass" && ..() diff --git a/code/game/turfs/exterior/exterior_seafloor.dm b/code/game/turfs/exterior/exterior_seafloor.dm index 4ab69066acd..97b8cd64262 100644 --- a/code/game/turfs/exterior/exterior_seafloor.dm +++ b/code/game/turfs/exterior/exterior_seafloor.dm @@ -5,6 +5,9 @@ icon_edge_layer = EXT_EDGE_SEAFLOOR var/detail_decal +/turf/exterior/seafloor/get_diggable_resources() + return dug ? null : list(/obj/item/stack/material/ore/sand = list(3, 2)) + /turf/exterior/seafloor/flooded flooded = TRUE color = COLOR_LIQUID_WATER diff --git a/code/game/turfs/exterior/exterior_sky.dm b/code/game/turfs/exterior/exterior_sky.dm index f9026b330ab..9f61b8056c8 100644 --- a/code/game/turfs/exterior/exterior_sky.dm +++ b/code/game/turfs/exterior/exterior_sky.dm @@ -2,6 +2,7 @@ name = "sky" desc = "Hope you don't have a fear of heights..." icon = 'icons/turf/exterior/sky_static.dmi' + icon_state = "0" z_flags = 0 /turf/exterior/open/sky/north diff --git a/code/game/turfs/exterior/exterior_volcanic.dm b/code/game/turfs/exterior/exterior_volcanic.dm deleted file mode 100644 index e595845f10b..00000000000 --- a/code/game/turfs/exterior/exterior_volcanic.dm +++ /dev/null @@ -1,5 +0,0 @@ -/turf/exterior/volcanic - name = "volcanic floor" - icon = 'icons/turf/exterior/volcanic.dmi' - dirt_color = COLOR_GRAY20 - icon_edge_layer = EXT_EDGE_VOLCANIC \ No newline at end of file diff --git a/code/game/turfs/exterior/exterior_wall.dm b/code/game/turfs/exterior/exterior_wall.dm index 461e4b827f0..50a2538c158 100644 --- a/code/game/turfs/exterior/exterior_wall.dm +++ b/code/game/turfs/exterior/exterior_wall.dm @@ -3,6 +3,46 @@ ///List of all the /turf/exterior/wall that exists in the world on all z-levels var/global/list/natural_walls = list() +/obj/abstract/ramp_sculptor + name = "ramp sculptor" + icon_state = "x" + var/place_dir + +/obj/abstract/ramp_sculptor/south + icon_state = "arrow" + dir = SOUTH + place_dir = SOUTH + +/obj/abstract/ramp_sculptor/north + icon_state = "arrow" + dir = NORTH + place_dir = NORTH + +/obj/abstract/ramp_sculptor/east + icon_state = "arrow" + dir = EAST + place_dir = EAST + +/obj/abstract/ramp_sculptor/west + icon_state = "arrow" + dir = WEST + place_dir = WEST + +/obj/abstract/ramp_sculptor/Initialize() + ..() + var/turf/exterior/wall/ramp = get_turf(src) + if(istype(ramp) && !ramp.ramp_slope_direction) + if(!place_dir || !(place_dir in global.cardinal)) + for(var/checkdir in global.cardinal) + var/turf/neighbor = get_step(ramp, checkdir) + if(neighbor && neighbor.density) + place_dir = global.reverse_dir[checkdir] + break + if(place_dir) + dir = place_dir + ramp.make_ramp(null, place_dir) + return INITIALIZE_HINT_QDEL + /turf/exterior/wall name = "wall" icon = 'icons/turf/walls/_previews.dmi' @@ -13,11 +53,9 @@ var/global/list/natural_walls = list() blocks_air = TRUE turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_OBSTACLE - ///Overrides the level's strata for this turf. - var/strata_override + var/ramp_slope_direction var/paint_color var/image/ore_overlay - var/decl/material/material var/decl/material/reinf_material var/floor_type = /turf/exterior/barren var/static/list/exterior_wall_shine_cache = list() @@ -27,13 +65,99 @@ var/global/list/natural_walls = list() if(paint_color) to_chat(user, SPAN_NOTICE("It has been noticeably discoloured by the elements.")) +/turf/exterior/wall/AltClick(mob/user) + + if(user.Adjacent(src) && istype(user.get_active_hand(), /obj/item/pickaxe) && HasAbove(z)) + var/user_dir = get_dir(src, user) + if(!(user_dir in global.cardinal)) + to_chat(user, SPAN_WARNING("You must be standing at a cardinal angle to create a ramp.")) + return TRUE + + var/turf/exterior/wall/support = get_step(src, global.reverse_dir[user_dir]) + if(!istype(support) || support.ramp_slope_direction) + to_chat(user, SPAN_WARNING("You cannot cut a ramp into a wall with no additional walls behind it.")) + return TRUE + + var/obj/item/pickaxe/P = user.get_active_hand() + playsound(user, P.drill_sound, 20, 1) + to_chat(user, SPAN_NOTICE("You start [P.drill_verb] \the [src], forming it into a ramp.")) + if(do_after(user, round(P.digspeed*0.5), src) && !ramp_slope_direction) + to_chat(user, SPAN_NOTICE("You finish [P.drill_verb] \the [src] into a ramp.")) + make_ramp(user, user_dir) + return TRUE + + . = ..() + +/turf/proc/handle_ramp_dug_below(turf/exterior/wall/ramp) + if(simulated && !is_open()) + ChangeTurf(get_base_turf(z)) + +/turf/exterior/wall/proc/make_ramp(var/mob/user, var/new_slope, var/skip_icon_update = FALSE) + + ramp_slope_direction = new_slope + + var/old_ao = permit_ao + if(ramp_slope_direction) + drop_ore() + permit_ao = FALSE + blocks_air = FALSE + density = FALSE + opacity = FALSE + + // Pretend to be a normal floor turf under the ramp. + var/turf/exterior/under = floor_type + icon = initial(under.icon) + icon_state = initial(under.icon_state) + icon_edge_layer = initial(under.icon_edge_layer) + icon_edge_states = initial(under.icon_edge_states) + icon_has_corners = initial(under.icon_has_corners) + color = initial(under.color) + + decals = null + var/turf/ramp_above = GetAbove(src) + if(ramp_above) + ramp_above.handle_ramp_dug_below(src) + update_neighboring_ramps() + + else + permit_ao = initial(permit_ao) + blocks_air = initial(blocks_air) + density = initial(density) + color = initial(color) + set_opacity(!material || material.opacity >= 0.5) + + icon = 'icons/turf/walls/natural.dmi' + icon_state = "blank" + icon_edge_layer = initial(icon_edge_layer) + icon_edge_states = initial(icon_edge_states) + icon_has_corners = initial(icon_has_corners) + + if(!skip_icon_update) + for(var/turf/exterior/wall/neighbor in RANGE_TURFS(src, 1)) + neighbor.update_icon() + if(old_ao != permit_ao) + regenerate_ao() + +/turf/exterior/wall/proc/update_neighboring_ramps(destroying_self) + // Clear any ramps we were supporting. + for(var/turf/exterior/wall/neighbor in RANGE_TURFS(src, 1)) + if(!neighbor.ramp_slope_direction || neighbor == src) + continue + var/turf/exterior/wall/support = get_step(neighbor, global.reverse_dir[neighbor.ramp_slope_direction]) + if(!istype(support) || (destroying_self && support == src) || support.ramp_slope_direction) + neighbor.dismantle_wall(ramp_update = FALSE) // This will only occur on ramps, so no need to propagate to other ramps. + /turf/exterior/wall/Initialize(var/ml, var/materialtype, var/rmaterialtype) ..(ml, TRUE) // We update our own icon, no point doing it twice. - // Clear mapping icons. - icon = 'icons/turf/walls/solid.dmi' - icon_state = "blank" + // Clear mapped appearance. color = null + icon = 'icons/turf/walls/natural.dmi' + icon_state = "blank" + + // Init ramp state if needed. + if(ramp_slope_direction) + make_ramp(null, ramp_slope_direction, TRUE) // Init materials. material = SSmaterials.get_strata_material_type(src) @@ -49,13 +173,14 @@ var/global/list/natural_walls = list() reinf_material = rmaterialtype if(ispath(reinf_material, /decl/material)) reinf_material = GET_DECL(reinf_material) + . = INITIALIZE_HINT_LATELOAD /turf/exterior/wall/LateInitialize(var/ml) ..() update_material(!ml) spread_deposit() - if(floor_type && HasAbove(z)) + if(!ramp_slope_direction && floor_type && HasAbove(z)) var/turf/T = GetAbove(src) if(!istype(T, floor_type) && T.is_open()) T.ChangeTurf(floor_type, keep_air = TRUE) @@ -67,11 +192,14 @@ var/global/list/natural_walls = list() queue_icon_update() /turf/exterior/wall/explosion_act(severity) + SHOULD_CALL_PARENT(FALSE) if(severity == 1 || (severity == 2 && prob(40))) dismantle_wall() /turf/exterior/wall/Destroy() global.natural_walls -= src + if(!ramp_slope_direction) + update_neighboring_ramps(destroying_self = TRUE) . = ..() /turf/exterior/wall/proc/set_material(var/decl/material/newmaterial, var/decl/material/newrmaterial) @@ -94,7 +222,7 @@ var/global/list/natural_walls = list() for(var/trydir in global.cardinal) if(!prob(reinf_material.ore_spread_chance)) continue - var/turf/exterior/wall/target_turf = get_step(src, trydir) + var/turf/exterior/wall/target_turf = get_step_resolving_mimic(src, trydir) if(!istype(target_turf) || !isnull(target_turf.reinf_material)) continue target_turf.set_material(target_turf.material, reinf_material) @@ -103,29 +231,31 @@ var/global/list/natural_walls = list() /turf/exterior/wall/attackby(obj/item/W, mob/user, click_params) if(!user.check_dexterity(DEXTERITY_COMPLEX_TOOLS)) - return + return ..() - if(istype(W, /obj/item/depth_scanner)) - var/obj/item/depth_scanner/C = W - C.scan_atom(user, src) - return TRUE + if(!ramp_slope_direction) - if (istype(W, /obj/item/measuring_tape)) - var/obj/item/measuring_tape/P = W - user.visible_message(SPAN_NOTICE("\The [user] extends [P] towards [src]."),SPAN_NOTICE("You extend [P] towards [src].")) - if(do_after(user,10, src)) - to_chat(user, SPAN_NOTICE("\The [src] has been excavated to a depth of [excavation_level]cm.")) - return TRUE + if(istype(W, /obj/item/depth_scanner)) + var/obj/item/depth_scanner/C = W + C.scan_atom(user, src) + return TRUE - if(istype(W, /obj/item/pickaxe/xeno)) - return handle_xenoarch_tool_interaction(W, user) + if (istype(W, /obj/item/measuring_tape)) + var/obj/item/measuring_tape/P = W + user.visible_message(SPAN_NOTICE("\The [user] extends [P] towards [src]."),SPAN_NOTICE("You extend [P] towards [src].")) + if(do_after(user,10, src)) + to_chat(user, SPAN_NOTICE("\The [src] has been excavated to a depth of [excavation_level]cm.")) + return TRUE + + if(istype(W, /obj/item/pickaxe/xeno)) + return handle_xenoarch_tool_interaction(W, user) // Drill out natural walls. if(istype(W, /obj/item/pickaxe)) var/obj/item/pickaxe/P = W playsound(user, P.drill_sound, 20, 1) to_chat(user, SPAN_NOTICE("You start [P.drill_verb][destroy_artifacts(P, INFINITY)].")) - if(do_after(user, P.digspeed, src)) + if(do_after(user, (ramp_slope_direction ? round(P.digspeed*0.5) : P.digspeed), src)) to_chat(user, SPAN_NOTICE("You finish [P.drill_verb] \the [src].")) dismantle_wall() return TRUE @@ -164,24 +294,47 @@ var/global/list/natural_walls = list() if(M) ore_overlay.transform = M if(update_neighbors) - for(var/turf/exterior/T in RANGE_TURFS(src, 1)) - T.update_icon() - else - update_icon() + for(var/direction in global.alldirs) + var/turf/exterior/target_turf = get_step_resolving_mimic(src, direction) + if(istype(target_turf)) + target_turf.update_icon() + update_icon() /turf/exterior/wall/on_update_icon() - cut_overlays() - if(!istype(material)) return var/list/wall_connections = list() for(var/stepdir in global.alldirs) - var/turf/exterior/wall/T = get_step(src, stepdir) - if(istype(T)) - wall_connections += get_dir(src, T) - wall_connections = dirs_to_corner_states(wall_connections) + + // Get the wall. + var/turf/exterior/wall/T = get_step_resolving_mimic(src, stepdir) + if(!istype(T)) + continue + + if(ramp_slope_direction) // We are a ramp. + // Adjacent ramps flowing in the same direction as us. + if(ramp_slope_direction == T.ramp_slope_direction) + wall_connections += stepdir + continue + // It's an adjacent non-ramp wall. + if(!T.ramp_slope_direction) + // It is behind us. + if(stepdir & global.reverse_dir[ramp_slope_direction]) + wall_connections += stepdir + continue + else // We are a wall. + // It is a wall. + if(!T.ramp_slope_direction) + wall_connections += stepdir + continue + // It's a ramp running away from us. + if(stepdir & T.ramp_slope_direction) + wall_connections += stepdir + continue + + var/list/corner_states = dirs_to_corner_states(wall_connections) var/material_icon_base = material.icon_base_natural || 'icons/turf/walls/natural.dmi' var/base_color = paint_color ? paint_color : material.color @@ -195,9 +348,43 @@ var/global/list/natural_walls = list() shine = clamp((material.reflectiveness * 0.01) * 255, 10, (0.6 * ReadHSV(RGBtoHSV(material.color))[3])) exterior_wall_shine_cache[shine_cache_key] = shine - icon = get_combined_wall_icon(wall_connections, null, material_icon_base, base_color, shine_value = shine) - icon_state = "" - color = null + var/new_icon + if(ramp_slope_direction) + + ..() // Draw the floor under us. + + var/turf/exterior/wall/neighbor = get_step(src, turn(ramp_slope_direction, -90)) + var/has_left_neighbor = istype(neighbor) && neighbor.ramp_slope_direction == ramp_slope_direction + neighbor = get_step(src, turn(ramp_slope_direction, 90)) + var/has_right_neighbor = istype(neighbor) && neighbor.ramp_slope_direction == ramp_slope_direction + + var/state = "ramp-single" + if(has_left_neighbor && has_right_neighbor) + state = "ramp-blend-full" + else if(has_left_neighbor) + state = "ramp-blend-left" + else if(has_right_neighbor) + state = "ramp-blend-right" + + var/image/I = image(material_icon_base, state, dir = ramp_slope_direction) + I.color = base_color + I.appearance_flags |= RESET_COLOR + add_overlay(I) + if(shine) + I = image(material_icon_base, "[state]-shine", dir = ramp_slope_direction) + I.appearance_flags |= RESET_ALPHA + I.alpha = shine + add_overlay(I) + + else + + new_icon = get_combined_wall_icon(corner_states, null, material_icon_base, base_color, shine_value = shine) + if(icon != new_icon) + icon = new_icon + if(icon_state != "") + icon_state = "" + if(color) + color = null if(ore_overlay) add_overlay(ore_overlay) @@ -206,35 +393,53 @@ var/global/list/natural_walls = list() if(archaeo_overlay) add_overlay(archaeo_overlay) -/turf/exterior/wall/proc/dismantle_wall(no_product = FALSE) - if(reinf_material?.ore_result_amount && !no_product) +/turf/exterior/wall/proc/drop_ore() + if(reinf_material?.ore_result_amount) pass_geodata_to(new /obj/item/stack/material/ore(src, reinf_material.ore_result_amount, reinf_material.type)) - if(prob(MAT_DROP_CHANCE) && !no_product) - pass_geodata_to(new /obj/item/stack/material/ore(src, 1, material.type)) + reinf_material = null + ore_overlay = null + update_material(FALSE) + if(prob(MAT_DROP_CHANCE) && !ramp_slope_direction && material) + pass_geodata_to(new /obj/item/stack/material/ore(src, material.ore_result_amount, material.type)) + +/turf/exterior/wall/proc/dismantle_wall(no_product = FALSE, ramp_update = TRUE) + + if(!no_product) + drop_ore() destroy_artifacts(null, INFINITY) + + if(ramp_update && !ramp_slope_direction) + ramp_slope_direction = NORTH // Temporary so we don't let any neighboring ramps use us as supports. + update_neighboring_ramps() + ramp_slope_direction = null + playsound(src, 'sound/items/Welder.ogg', 100, 1) - . = ChangeTurf(floor_type || get_base_turf_by_area(src)) - if(istype(., /turf/simulated/floor/asteroid)) + var/turf/new_turf = ChangeTurf(floor_type || get_base_turf_by_area(src)) + if(istype(new_turf, /turf/simulated/floor/asteroid)) var/turf/simulated/floor/asteroid/debris = . debris.overlay_detail = "asteroid[rand(0,9)]" debris.updateMineralOverlays(1) + return new_turf /turf/exterior/wall/proc/get_default_material() . = /decl/material/solid/stone/sandstone -/turf/exterior/wall/Bumped(AM) +/turf/exterior/wall/proc/pass_geodata_to(obj/O) + var/datum/extension/geological_data/ours = get_extension(src, /datum/extension/geological_data) + if(ours.geodata) + ours.geodata.UpdateNearbyArtifactInfo(src) + set_extension(O, /datum/extension/geological_data) + var/datum/extension/geological_data/newdata = get_extension(O, /datum/extension/geological_data) + if(newdata) + newdata.set_data(ours.geodata.get_copy()) + +/turf/exterior/wall/Bumped(var/atom/movable/AM) . = ..() - if(ismob(AM)) + if(!. && !ramp_slope_direction && ismob(AM)) var/mob/M = AM var/obj/item/pickaxe/held = M.get_active_hand() if(istype(held)) attackby(held, M) - -/turf/exterior/wall/proc/pass_geodata_to(obj/O) - var/datum/extension/geological_data/ours = get_extension(src, /datum/extension/geological_data) - ours.geodata.UpdateNearbyArtifactInfo(src) - set_extension(O, /datum/extension/geological_data) - var/datum/extension/geological_data/newdata = get_extension(O, /datum/extension/geological_data) - newdata.set_data(ours.geodata.get_copy()) + return TRUE #undef MAT_DROP_CHANCE \ No newline at end of file diff --git a/code/game/turfs/exterior/exterior_water.dm b/code/game/turfs/exterior/exterior_water.dm index 9f1f1174ebb..d273ef0aad3 100644 --- a/code/game/turfs/exterior/exterior_water.dm +++ b/code/game/turfs/exterior/exterior_water.dm @@ -20,3 +20,6 @@ O.reagents.add_reagent(reagent_type, fill_amount) return TRUE . = ..() + +/turf/exterior/water/can_be_dug() + return FALSE diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index a0b5e210674..3ea49fd069f 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -1426,6 +1426,20 @@ var/global/list/floor_decals = list() /obj/effect/floor_decal/rust/part_rusted1 icon_state = "part_rusted1" +/obj/effect/floor_decal/rust/part_rusted2 + icon_state = "part_rusted2" + +/obj/effect/floor_decal/rust/part_rusted3 + icon_state = "part_rusted3" + +/obj/effect/floor_decal/rust/mono_rusted1 + icon_state = "mono_rusted1" + +/obj/effect/floor_decal/rust/mono_rusted2 + icon_state = "mono_rusted2" + +/obj/effect/floor_decal/rust/mono_rusted3 + icon_state = "mono_rusted3" /obj/effect/floor_decal/rust/steel_decals_rusted1 icon_state = "steel_decals_rusted1" diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index c395b5ab829..8fa66094a89 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -329,13 +329,14 @@ /turf/simulated/floor/beach name = "beach" icon = 'icons/misc/beach.dmi' + abstract_type = /turf/simulated/floor/beach /turf/simulated/floor/beach/sand name = "sand" icon_state = "sand" /turf/simulated/floor/beach/sand/desert - icon_state = "desert" + icon_state = "desert0" /turf/simulated/floor/beach/sand/desert/Initialize() . = ..() @@ -368,7 +369,7 @@ /turf/simulated/floor/crystal name = "crystal floor" icon = 'icons/turf/flooring/crystal.dmi' - icon_state = "" + icon_state = "crystal" initial_flooring = /decl/flooring/crystal /turf/simulated/floor/glass diff --git a/code/game/turfs/flooring/flooring_shuttle.dm b/code/game/turfs/flooring/flooring_shuttle.dm index f61c6d879e6..662d4a4356c 100644 --- a/code/game/turfs/flooring/flooring_shuttle.dm +++ b/code/game/turfs/flooring/flooring_shuttle.dm @@ -1,6 +1,11 @@ /turf/simulated/floor/shuttle name = "floor" icon = 'icons/turf/shuttle.dmi' + abstract_type = /turf/simulated/floor/shuttle + +/turf/simulated/floor/shuttle/plating + icon_state = "plating" + initial_flooring = null /turf/simulated/floor/shuttle/blue icon_state = "floor" diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index e6dbb700925..2731f21dee6 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -6,6 +6,7 @@ ) open_turf_type = /turf/simulated/open zone_membership_candidate = TRUE + abstract_type = /turf/simulated var/wet = 0 var/image/wet_overlay = null @@ -29,12 +30,12 @@ wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") overlays += wet_overlay - timer_id = addtimer(CALLBACK(src,/turf/simulated/proc/unwet_floor), 8 SECONDS, (TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE)) + timer_id = addtimer(CALLBACK(src, TYPE_PROC_REF(/turf/simulated, unwet_floor)), 8 SECONDS, (TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE)) /turf/simulated/proc/unwet_floor(var/check_very_wet = TRUE) if(check_very_wet && wet >= 2) wet-- - timer_id = addtimer(CALLBACK(src,/turf/simulated/proc/unwet_floor), 8 SECONDS, (TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE)) + timer_id = addtimer(CALLBACK(src, TYPE_PROC_REF(/turf/simulated, unwet_floor)), 8 SECONDS, (TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE)) return wet = 0 if(wet_overlay) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 9cb2c239f71..f6be67f476e 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -34,7 +34,7 @@ return flooring?.get_movement_delay(travel_dir, mover) || ..() /turf/simulated/floor/protects_atom(var/atom/A) - return (A.level <= 1 && !is_plating()) || ..() + return (A.level <= LEVEL_BELOW_PLATING && !is_plating()) || ..() /turf/simulated/floor/Initialize(var/ml, var/floortype) . = ..(ml) @@ -69,6 +69,7 @@ //This proc auto corrects the grass tiles' siding. /turf/simulated/floor/proc/make_plating(var/place_product, var/defer_icon_update) + LAZYCLEARLIST(decals) for(var/obj/effect/decal/writing/W in src) qdel(W) diff --git a/code/game/turfs/simulated/floor_acts.dm b/code/game/turfs/simulated/floor_acts.dm index 421d85e8d31..357277289c3 100644 --- a/code/game/turfs/simulated/floor_acts.dm +++ b/code/game/turfs/simulated/floor_acts.dm @@ -1,5 +1,6 @@ /turf/simulated/floor/explosion_act(severity) - SHOULD_CALL_PARENT(FALSE) + SHOULD_CALL_PARENT(TRUE) + ..() if(severity == 1) ChangeTurf(get_base_turf_by_area(src)) else if(severity == 2) @@ -25,14 +26,13 @@ hotspot_expose(1000,CELL_VOLUME) /turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - var/temp_destroy = get_damage_temperature() if(!burnt && prob(5)) burn_tile(exposed_temperature) else if(temp_destroy && exposed_temperature >= (temp_destroy + 100) && prob(1) && !is_plating()) make_plating() //destroy the tile, exposing plating burn_tile(exposed_temperature) - return + return ..() //should be a little bit lower than the temperature required to destroy the material /turf/simulated/floor/proc/get_damage_temperature() diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index b962c1e9245..74a2f36c6df 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -12,11 +12,6 @@ if(!C || !user) return 0 - if(istype(C, /obj/item/stack/tile/roof)) - var/obj/item/stack/tile/roof/T = C - T.try_build_turf(user, src) - return TRUE - if(IS_COIL(C) || (flooring && istype(C, /obj/item/stack/material/rods))) return ..(C, user) diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index 748eac0f5b4..b75170c71c8 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -125,14 +125,26 @@ var/material_icon_base = get_wall_icon() var/base_color = material.color + + var/new_icon + var/new_icon_state + var/new_color + if(!density) - icon = material_icon_base - icon_state = "fwall_open" - color = base_color + new_icon = material_icon_base + new_icon_state = "fwall_open" + new_color = base_color else - icon = get_combined_wall_icon(wall_connections, other_connections, material_icon_base, base_color, paint_color, stripe_color, (material.wall_flags & WALL_HAS_EDGES) && (stripe_color || base_color)) - icon_state = "" - color = null + new_icon = get_combined_wall_icon(wall_connections, other_connections, material_icon_base, base_color, paint_color, stripe_color, (material.wall_flags & WALL_HAS_EDGES) && (stripe_color || base_color)) + new_icon_state = "" + new_color = null + + if(icon != new_icon) + icon = new_icon + if(icon_state != new_icon_state) + icon_state = new_icon_state + if(color != new_color) + color = new_color if(apply_reinf_overlay()) var/image/I diff --git a/code/game/turfs/simulated/wall_shuttle.dm b/code/game/turfs/simulated/wall_shuttle.dm index 6bbe097ec6d..e5b23c2627e 100644 --- a/code/game/turfs/simulated/wall_shuttle.dm +++ b/code/game/turfs/simulated/wall_shuttle.dm @@ -3,6 +3,7 @@ icon = 'icons/turf/shuttle.dmi' thermal_conductivity = 0.05 heat_capacity = 0 + abstract_type = /turf/simulated/shuttle /turf/simulated/shuttle/wall name = "wall" diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index dbff11eff57..7c76f439110 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -60,11 +60,11 @@ /turf/simulated/wall/plastic color = COLOR_EGGSHELL icon_state = "plastic" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic // A plastic wall with a plastic girder. Very flimsy but very easy to move or remove with just a crowbar. /turf/simulated/wall/plastic/facade - girder_material = /decl/material/solid/plastic + girder_material = /decl/material/solid/organic/plastic /turf/simulated/wall/sandstone color = COLOR_GOLD @@ -74,12 +74,12 @@ /turf/simulated/wall/wood color = COLOR_BROWN icon_state = "wood" - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /turf/simulated/wall/walnut color = COLOR_BROWN_ORANGE icon_state = "wood" - material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut /turf/simulated/wall/raidershuttle color = COLOR_GREEN_GRAY diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index f5636a13108..29d376df442 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -27,7 +27,6 @@ var/global/list/wall_fullblend_objects = list( heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall explosion_resistance = 10 color = COLOR_STEEL - atom_flags = ATOM_FLAG_CAN_BE_PAINTED turf_flags = TURF_IS_HOLOMAP_OBSTACLE var/damage = 0 @@ -67,7 +66,7 @@ var/global/list/wall_fullblend_objects = list( girder_material = GET_DECL(girder_material) . = INITIALIZE_HINT_LATELOAD - set_extension(src, /datum/extension/penetration/proc_call, .proc/CheckPenetration) + set_extension(src, /datum/extension/penetration/proc_call, PROC_REF(CheckPenetration)) START_PROCESSING(SSturf, src) //Used for radiation. /turf/simulated/wall/LateInitialize(var/ml) @@ -148,7 +147,7 @@ var/global/list/wall_fullblend_objects = list( plant.update_icon() plant.reset_offsets(0) -/turf/simulated/wall/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE) +/turf/simulated/wall/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/keep_air_below = FALSE, var/update_open_turfs_above = TRUE) clear_plants() . = ..() @@ -205,6 +204,7 @@ var/global/list/wall_fullblend_objects = list( /turf/simulated/wall/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)//Doesn't fucking work because walls don't interact with air :( burn(exposed_temperature) + return ..() /turf/simulated/wall/adjacent_fire_act(turf/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) burn(adj_temp) @@ -273,7 +273,7 @@ var/global/list/wall_fullblend_objects = list( if(!QDELETED(src) && istype(material) && material.combustion_effect(src, temperature, 0.7)) for(var/turf/simulated/wall/W in range(3,src)) if(W != src) - addtimer(CALLBACK(W, /turf/simulated/wall/proc/burn, temperature/4), 2) + addtimer(CALLBACK(W, TYPE_PROC_REF(/turf/simulated/wall, burn), temperature/4), 2) dismantle_wall(TRUE) /turf/simulated/wall/get_color() diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index fde96995a2d..176e90b46ca 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -11,6 +11,8 @@ z_eventually_space = TRUE turf_flags = TURF_FLAG_BACKGROUND + open_turf_type = /turf/space + /// If we're an edge. var/edge = 0 /// Force this one to pretend it's an overedge turf. @@ -80,13 +82,14 @@ var/turf/T = src while ((T = GetAbove(T))) T.z_eventually_space = FALSE + return ..() /turf/space/LateInitialize() if(SSmapping.base_floor_area) var/area/new_area = locate(SSmapping.base_floor_area) || new SSmapping.base_floor_area ChangeArea(src, new_area) - ChangeTurf(SSmapping.base_floor_type) + ChangeTurf(SSmapping.base_floor_type, keep_air_below = TRUE) // override for space turfs, since they should never hide anything /turf/space/levelupdate() @@ -241,8 +244,8 @@ A.loc.Entered(A) return -/turf/space/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE) - return ..(N, tell_universe, TRUE, keep_air) +/turf/space/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/keep_air_below = FALSE, var/update_open_turfs_above = TRUE) + return ..(N, tell_universe, TRUE, keep_air, keep_air_below, update_open_turfs_above) /turf/space/is_open() return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3ed31a7098e..eae3c37205d 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,6 +1,6 @@ /turf icon = 'icons/turf/floors.dmi' - level = 1 + level = LEVEL_BELOW_PLATING abstract_type = /turf is_spawnable_type = TRUE layer = TURF_LAYER @@ -36,7 +36,7 @@ var/fluid_blocked_dirs = 0 var/flooded // Whether or not this turf is absolutely flooded ie. a water source. var/footstep_type - var/open_turf_type // Which turf to use when this turf is destroyed or replaced in a multiz context. Overridden by area. + var/open_turf_type // Which open turf type to use by default above this turf in a multiz context. Overridden by area. var/tmp/changing_turf var/tmp/prev_type // Previous type of the turf, prior to turf translation. @@ -166,7 +166,8 @@ /turf/explosion_act(severity) SHOULD_CALL_PARENT(FALSE) - return + if(severity == 1 || (severity == 2 && prob(70))) + drop_diggable_resources() /turf/proc/is_solid_structure() return !(turf_flags & TURF_FLAG_BACKGROUND) || locate(/obj/structure/lattice, src) @@ -197,6 +198,23 @@ /turf/attackby(obj/item/W, mob/user) + if(is_floor()) + + if(istype(W, /obj/item/stack/tile)) + var/obj/item/stack/tile/T = W + T.try_build_turf(user, src) + return TRUE + + if(IS_SHOVEL(W) && can_be_dug()) + if(get_diggable_resources()) + if(W.do_tool_interaction(TOOL_SHOVEL, user, src, 4 SECONDS)) + drop_diggable_resources() + else if(can_dig_pit()) + try_dig_pit(user, W) + else + to_chat(user, SPAN_WARNING("There is nothing to be dug out of \the [src].")) + return TRUE + if(ATOM_IS_OPEN_CONTAINER(W) && W.reagents) var/obj/effect/fluid/F = locate() in src if(F && F.reagents?.total_volume >= FLUID_PUDDLE) @@ -330,14 +348,14 @@ // Called when turf is hit by a thrown object /turf/hitby(atom/movable/AM, var/datum/thrownthing/TT) - ..() + SHOULD_CALL_PARENT(FALSE) // /atom/hitby() applies damage to AM if it's a living mob. if(density) if(isliving(AM)) var/mob/living/M = AM M.turf_collision(src, TT.speed) if(LAZYLEN(M.pinned)) return - addtimer(CALLBACK(src, /turf/proc/bounce_off, AM, TT.init_dir), 2) + addtimer(CALLBACK(src, TYPE_PROC_REF(/turf, bounce_off), AM, TT.init_dir), 2) else if(isobj(AM)) var/obj/structure/ladder/L = locate() in contents if(L) @@ -401,7 +419,7 @@ /turf/proc/update_weather(var/obj/abstract/weather_system/new_weather, var/force_update_below = FALSE) if(isnull(new_weather)) - new_weather = SSweather.get_weather_for_level(z) + new_weather = SSweather.weather_by_z[z] // We have a weather system and we are exposed to it; update our vis contents. if(istype(new_weather) && is_outside()) @@ -424,6 +442,29 @@ if(below) below.update_weather(new_weather) +// Updates turf participation in ZAS according to outside status. Must be called whenever the outside status of a turf may change. +/turf/proc/update_external_atmos_participation(overwrite_air = TRUE) + if(is_outside()) + if(zone && external_atmosphere_participation) + if(can_safely_remove_from_zone()) + #ifdef MULTIZAS + var/dirs = global.cardinalz + #else + var/dirs = global.cardinal + #endif + zone.remove(src) + // Update neighbors to create edges between zones and exterior + for(var/dir in dirs) + var/turf/neighbor = get_step(src, dir) + SSair.mark_for_update(neighbor) + else + zone.rebuild() + else if(zone_membership_candidate) + // Set the turf's air to the external atmosphere to add to its new zone. + if(overwrite_air) + air = get_external_air(FALSE) + SSair.mark_for_update(src) + /turf/proc/is_outside() // Can't rain inside or through solid walls. @@ -445,7 +486,7 @@ // If we are in a multiz volume and not already inside, we return // the outside value of the highest unenclosed turf in the stack. - if((. != OUTSIDE_NO) && HasAbove(z)) + if(HasAbove(z)) . = OUTSIDE_YES // assume for the moment we're unroofed until we learn otherwise. var/turf/top_of_stack = src while(HasAbove(top_of_stack.z)) @@ -467,14 +508,7 @@ SSambience.queued += src last_outside_check = OUTSIDE_UNCERTAIN - if(is_outside()) - if(zone && external_atmosphere_participation) - if(can_safely_remove_from_zone()) - zone.remove(src) - else - zone.rebuild() - else if(zone_membership_candidate) - SSair.mark_for_update(src) + update_external_atmos_participation() if(!HasBelow(z)) return TRUE @@ -541,3 +575,63 @@ /turf/proc/is_defiled() return (locate(/obj/effect/narsie_footstep) in src) + +/turf/proc/resolve_to_actual_turf() + return src + +/// Return an assoc list of resource item type to a base and a random component +/// ex. return list(/obj/item/stack/material/ore/sand = list(3, 2)) +/turf/proc/get_diggable_resources() + return null + +/turf/proc/clear_diggable_resources() + SHOULD_CALL_PARENT(TRUE) + update_icon() + +/turf/proc/can_be_dug() + return FALSE + +/turf/proc/drop_diggable_resources() + SHOULD_CALL_PARENT(TRUE) + var/list/diggable_resources = get_diggable_resources() + if(!length(diggable_resources)) + return + for(var/resource_type in diggable_resources) + var/list/resource_amounts = diggable_resources[resource_type] + LAZYADD(., new resource_type(src, resource_amounts[1] + rand(resource_amounts[2]))) + clear_diggable_resources() + + +/turf/proc/can_dig_pit() + return can_be_dug() && !(locate(/obj/structure/pit) in src) + +/turf/proc/try_dig_pit(var/mob/user, var/obj/item/tool) + if(!user || !tool || tool.do_tool_interaction(TOOL_SHOVEL, user, src, 4 SECONDS)) + return dig_pit() + return null + +/turf/proc/dig_pit() + return can_dig_pit() && new /obj/structure/pit(src) + +// Largely copied from stairs. +/turf/proc/can_move_up_ramp(atom/movable/AM, turf/above_wall, turf/under_atom, turf/above_atom) + if(!istype(AM) || !istype(above_wall) || !istype(under_atom) || !istype(above_atom)) + return FALSE + return under_atom.CanZPass(AM, UP) && above_atom.CanZPass(AM, DOWN) && above_wall.Enter(AM) + +/turf/Bumped(var/atom/movable/AM) + if(!istype(AM) || !HasAbove(z)) + return ..() + var/turf/exterior/wall/slope = AM.loc + if(!istype(slope) || !slope.ramp_slope_direction || get_dir(src, slope) != slope.ramp_slope_direction) + return ..() + var/turf/above_wall = GetAbove(src) + if(can_move_up_ramp(AM, above_wall, get_turf(AM), GetAbove(AM))) + AM.forceMove(above_wall) + if(isliving(AM)) + var/mob/living/L = AM + for(var/obj/item/grab/G in L.get_active_grabs()) + G.affecting.forceMove(above_wall) + else + to_chat(AM, SPAN_WARNING("Something blocks the path.")) + return TRUE diff --git a/code/game/turfs/turf_ao.dm b/code/game/turfs/turf_ao.dm index 26574caea0f..06c28405852 100644 --- a/code/game/turfs/turf_ao.dm +++ b/code/game/turfs/turf_ao.dm @@ -88,7 +88,7 @@ PROCESS_AO_CORNER(AO_LIST, NEIGHBORS, 4, SOUTHWEST); \ } \ UNSETEMPTY(AO_LIST); \ - if (AO_LIST) { \ + if (AO_LIST && TARGET) { \ TARGET.add_overlay(AO_LIST, TRUE); \ } diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 6d4a385f8e8..6cab56ac288 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -22,7 +22,22 @@ SHOULD_CALL_PARENT(FALSE) . = TRUE -/turf/proc/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE) +// Updates open turfs above this one to use its open_turf_type +/turf/proc/update_open_above(var/restrict_type, var/respect_area = TRUE) + if(!HasAbove(src.z)) + return + var/turf/above = src + while ((above = GetAbove(above))) + if(!above.is_open()) + break + if(!restrict_type || istype(above, restrict_type)) + if(respect_area) + var/area/A = get_area(above) + above.ChangeTurf(A?.open_turf || open_turf_type, update_open_turfs_above = FALSE) + else + above.ChangeTurf(open_turf_type, update_open_turfs_above = FALSE) + +/turf/proc/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/keep_air_below = FALSE, var/update_open_turfs_above = TRUE) if (!N) return @@ -51,6 +66,7 @@ var/old_flooded = flooded var/old_outside = is_outside var/old_is_open = is_open() + var/old_open_turf_type = open_turf_type var/old_affecting_heat_sources = affecting_heat_sources var/old_ambience = ambient_light @@ -129,8 +145,21 @@ W.last_outside_check = OUTSIDE_UNCERTAIN if(W.is_outside != old_outside) W.set_outside(old_outside, skip_weather_update = TRUE) + + var/turf/below = GetBelow(src) + if(below) + below.last_outside_check = OUTSIDE_UNCERTAIN + + // If the turf is at the top of the Z-stack and changed its outside status, or if it's changed its open status, let the turf below check if + // it should change its ZAS participation + if((!HasAbove(z) && (W.is_outside != old_outside)) || W.is_open() != old_is_open) + below.update_external_atmos_participation(!keep_air_below) + W.update_weather(force_update_below = W.is_open() != old_is_open) + if(update_open_turfs_above) + update_open_above(old_open_turf_type) + /turf/proc/transport_properties_from(turf/other) if(other.zone) if(!air) @@ -168,7 +197,7 @@ stripe_color = other.stripe_color material = other.material - reinf_material = other.material + reinf_material = other.reinf_material girder_material = other.girder_material floor_type = other.floor_type diff --git a/code/game/turfs/turf_enter.dm b/code/game/turfs/turf_enter.dm index 107b9aa1018..cf613050118 100644 --- a/code/game/turfs/turf_enter.dm +++ b/code/game/turfs/turf_enter.dm @@ -48,3 +48,6 @@ if((mat.gas_flags & XGM_GAS_CONTAMINANT) && env.gas[g] > mat.gas_overlay_limit + 1) I.contaminate() break + + // Handle non-listener proximity triggers. + handle_proximity_update(A) diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 2e109063ff1..e19bc3f493a 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -1,6 +1,11 @@ /turf/unsimulated name = "command" - initial_gas = list(/decl/material/gas/oxygen = MOLES_O2STANDARD, /decl/material/gas/nitrogen = MOLES_N2STANDARD) + initial_gas = list( + /decl/material/gas/oxygen = MOLES_O2STANDARD, + /decl/material/gas/nitrogen = MOLES_N2STANDARD + ) + abstract_type = /turf/unsimulated + simulated = FALSE /turf/unsimulated/get_lumcount(var/minlum = 0, var/maxlum = 1) return 0.8 diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index ff0d491cad6..a9036165b90 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -2,6 +2,7 @@ name = "Beach" icon = 'icons/misc/beach.dmi' turf_flags = TURF_FLAG_BACKGROUND + abstract_type = /turf/unsimulated/beach /turf/unsimulated/beach/sand name = "Sand" diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index f58e41ddca6..0a4a40d6a69 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -1,7 +1,7 @@ /turf/unsimulated/floor name = "floor" icon = 'icons/turf/floors.dmi' - icon_state = "Floor3" + icon_state = "shuttle" turf_flags = TURF_IS_HOLOMAP_PATH /turf/unsimulated/floor/can_climb_from_below(var/mob/climber) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index baa0e3da4b9..18f3eede702 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -104,7 +104,7 @@ else msg += line - if(config.admin_irc) + if(get_config_value(/decl/config/text/admin_irc)) to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.") to_chat(src, "Current Staff ([active_staff]/[total_staff]):") to_chat(src, jointext(msg,"\n")) diff --git a/code/game/world.dm b/code/game/world.dm index 53f928c044b..d1ab093adf0 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -72,17 +72,14 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) /world/New() //set window title - name = "[config.server_name] - [global.using_map.full_name]" + + name = "[get_config_value(/decl/config/text/server_name) || "Nebula Station 13"] - [global.using_map.full_name]" //logs SetupLogs() changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently - if(config && config.server_name != null && config.server_suffix && world.port > 0) - // dumb and hardcoded but I don't care~ - config.server_name += " #[(world.port % 1000) / 100]" - if(byond_version < REQUIRED_DM_VERSION) to_world_log("Your server's BYOND version does not meet the minimum DM version for this server. Please update BYOND.") @@ -95,7 +92,6 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) #ifdef UNIT_TEST log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") - load_unit_test_changes() #endif Master.Initialize(10, FALSE) @@ -106,7 +102,7 @@ var/global/world_topic_last = world.timeofday var/list/throttle = global.world_topic_throttle[addr] if (!global.world_topic_throttle[addr]) global.world_topic_throttle[addr] = throttle = list(0, null) - else if ((!config.no_throttle_localhost || !global.localhost_addresses[addr]) && throttle[1] && throttle[1] > world.timeofday + 15 SECONDS) + else if ((!get_config_value(/decl/config/toggle/no_throttle_localhost) || !global.localhost_addresses[addr]) && throttle[1] && throttle[1] > world.timeofday + 15 SECONDS) return throttle[2] ? "Throttled ([throttle[2]])" : "Throttled" throttle[1] = max(throttle[1], world.timeofday) + time @@ -137,11 +133,12 @@ var/global/world_topic_last = world.timeofday Master.Shutdown() - if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite + var/serverurl = get_config_value(/decl/config/text/server) + if(serverurl) //if you set a server location in configuration, it sends you there instead of trying to reconnect to the same world address. -- NeoFite for(var/client/C in global.clients) - to_chat(C, link("byond://[config.server]")) + to_chat(C, link("byond://[serverurl]")) - if(config.wait_for_sigusr1_reboot && reason != 3) + if(get_config_value(/decl/config/toggle/wait_for_sigusr1_reboot) && reason != 3) text2file("foo", "reboot_called") to_world("World reboot waiting for external scripts. Please be patient.") return @@ -183,19 +180,12 @@ var/global/world_topic_last = world.timeofday /world/proc/load_motd() join_motd = safe_file2text("config/motd.txt", FALSE) -/proc/load_configuration() - config = new /datum/configuration() - config.load("config/config.txt") - config.load("config/game_options.txt","game_options") - config.loadsql("config/dbconfig.txt") - config.load_event("config/custom_event.txt") - /hook/startup/proc/loadMods() world.load_mods() return 1 /world/proc/load_mods() - if(config.admin_legacy_system) + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) var/text = safe_file2text("config/moderators.txt", FALSE) if (!text) error("Failed to load config/mods.txt") @@ -218,11 +208,13 @@ var/global/world_topic_last = world.timeofday /world/proc/update_status() var/s = "[station_name()]" - if(config && config.discordurl) - s += " (Discord)" + var/discordurl = get_config_value(/decl/config/text/discordurl) + if(discordurl) + s += " (Discord)" - if(config && config.server_name) - s = "[config.server_name] — [s]" + var/config_server_name = get_config_value(/decl/config/text/server_name) + if(config_server_name) + s = "[config_server_name] — [s]" var/list/features = list() @@ -231,15 +223,15 @@ var/global/world_topic_last = world.timeofday else features += "STARTING" - if (!config.enter_allowed) + if (!get_config_value(/decl/config/toggle/on/enter_allowed)) features += "closed" - features += config.abandon_allowed ? "respawn" : "no respawn" + features += get_config_value(/decl/config/toggle/on/abandon_allowed) ? "respawn" : "no respawn" - if (config && config.allow_vote_mode) + if (get_config_value(/decl/config/toggle/vote_mode)) features += "vote" - if (config && config.allow_ai) + if (get_config_value(/decl/config/toggle/on/allow_ai)) features += "AI allowed" var/n = 0 @@ -253,8 +245,9 @@ var/global/world_topic_last = world.timeofday features += "~[n] player" - if (config && config.hostedby) - features += "hosted by [config.hostedby]" + var/hosted_by = get_config_value(/decl/config/text/hosted_by) + if (hosted_by) + features += "hosted by [hosted_by]" if (features) s += ": [jointext(features, ", ")]" @@ -277,7 +270,7 @@ var/global/world_topic_last = world.timeofday diary = file("[global.log_directory]/main.log") // This is the primary log, containing attack, admin, and game logs. to_file(diary, "[log_end]\n[log_end]\nStarting up. (ID: [game_id]) [time2text(world.timeofday, "hh:mm.ss")][log_end]\n---------------------[log_end]") - if(config && config.log_runtime) + if(get_config_value(/decl/config/toggle/log_runtime)) var/runtime_log = file("[global.log_directory]/runtime.log") to_file(runtime_log, "Game [game_id] starting up at [time2text(world.timeofday, "hh:mm.ss")]") log = runtime_log // runtimes and some other output is logged directly to world.log, which is redirected here. diff --git a/code/game/world_topic_commands.dm b/code/game/world_topic_commands.dm index a5d4adc28dc..b0cb23613b4 100644 --- a/code/game/world_topic_commands.dm +++ b/code/game/world_topic_commands.dm @@ -44,10 +44,11 @@ var/global/list/decl/topic_command/topic_commands = list() if (!can_use(T, addr, master, key)) return FALSE var/list/params = params2list(T) - if (!config.comms_password) + var/comms_password = get_config_value(/decl/config/text/comms_password) + if (!comms_password) set_throttle(addr, 10 SECONDS, "Comms Not Enabled") return "Not Enabled" - if (params["key"] != config.comms_password) + if (params["key"] != comms_password) set_throttle(addr, 30 SECONDS, "Bad Comms Key") return "Bad Key" return use(params) @@ -79,12 +80,12 @@ var/global/list/decl/topic_command/topic_commands = list() /decl/topic_command/status/use(var/list/params) var/list/s = list() s["version"] = game_version - s["mode"] = PUBLIC_GAME_MODE - s["respawn"] = config.abandon_allowed - s["enter"] = config.enter_allowed - s["vote"] = config.allow_vote_mode - s["ai"] = !!length(empty_playable_ai_cores) - s["host"] = host || null + s["mode"] = PUBLIC_GAME_MODE + s["respawn"] = get_config_value(/decl/config/toggle/on/abandon_allowed) + s["enter"] = get_config_value(/decl/config/toggle/on/enter_allowed) + s["vote"] = get_config_value(/decl/config/toggle/vote_mode) + s["ai"] = !!length(empty_playable_ai_cores) + s["host"] = host || null // This is dumb, but spacestation13.com's banners break if player count isn't the 8th field of the reply, so... this has to go here. s["players"] = 0 @@ -167,10 +168,11 @@ var/global/list/decl/topic_command/topic_commands = list() if (!can_use(T, addr, master, key)) return FALSE var/list/params = params2list(T) - if(!config.ban_comms_password) + var/ban_comms_password = get_config_value(/decl/config/text/ban_comms_password) + if(!ban_comms_password) set_throttle(addr, 10 SECONDS, "Bans Not Enabled") return "Not Enabled" - if(params["bankey"] != config.ban_comms_password) + if(params["bankey"] != ban_comms_password) set_throttle(addr, 30 SECONDS, "Bad Bans Key") return "Bad Key" return use(params) diff --git a/code/hub.dm b/code/hub.dm index d7b884d57e8..7749a33fd9d 100644 --- a/code/hub.dm +++ b/code/hub.dm @@ -1,5 +1,3 @@ -var/global/visibility_pref = FALSE - /world /* This page contains info for the hub. To allow your server to be visible on the hub, update the entry in the config. * You can also toggle visibility from in-game with toggle-hub-visibility; be aware that it takes a few minutes for the hub go @@ -8,5 +6,7 @@ var/global/visibility_pref = FALSE name = "Space Station 13 - Nebula13" /world/proc/update_hub_visibility() - global.visibility_pref = !global.visibility_pref - hub_password = global.visibility_pref ? "kMZy3U5jJHSiBQjr" : "SORRYNOPASSWORD" + if(get_config_value(/decl/config/toggle/hub_visibility)) + hub_password = "kMZy3U5jJHSiBQjr" + else + hub_password = "SORRYNOPASSWORD" diff --git a/code/modules/ZAS/ConnectionGroup.dm b/code/modules/ZAS/ConnectionGroup.dm index fc98d50f419..51502dbe002 100644 --- a/code/modules/ZAS/ConnectionGroup.dm +++ b/code/modules/ZAS/ConnectionGroup.dm @@ -55,6 +55,10 @@ Class Procs: Helper proc that allows getting the other zone of an edge given one of them. Only on /connection_edge/zone, otherwise use A. + update_post_merge() + Called after the edge's owner is merged into another zone. + Marks the relevant connecting turfs for update. + */ @@ -114,6 +118,10 @@ Class Procs: //If they're already being tossed, don't do it again. M.handle_airflow(differential, connecting_turfs, repelled) +/connection_edge/proc/update_post_merge() + for(var/turf/T in connecting_turfs) + SSair.mark_for_update(T) + /connection_edge/zone/var/zone/B /connection_edge/zone/New(zone/A, zone/B) @@ -189,6 +197,7 @@ Class Procs: /connection_edge/unsimulated/var/turf/B /connection_edge/unsimulated/var/datum/gas_mixture/air +/connection_edge/unsimulated/var/list/inner_turfs = list() /connection_edge/unsimulated/New(zone/A, turf/B) src.A = A @@ -204,10 +213,12 @@ Class Procs: /connection_edge/unsimulated/add_connection(connection/c) . = ..() connecting_turfs.Add(c.B) + inner_turfs |= c.A air.group_multiplier = coefficient /connection_edge/unsimulated/remove_connection(connection/c) connecting_turfs.Remove(c.B) + inner_turfs.Remove(c.A) air.group_multiplier = coefficient . = ..() @@ -242,6 +253,10 @@ Class Procs: if(!A.air.compare(air, vacuum_exception = 1)) SSair.mark_edge_active(src) +/connection_edge/unsimulated/update_post_merge() + for(var/turf/T in inner_turfs) + SSair.mark_for_update(T) + /proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 diff --git a/code/modules/ZAS/Contaminants.dm b/code/modules/ZAS/Contaminants.dm index 4d99a5c6c09..362f59c1fef 100644 --- a/code/modules/ZAS/Contaminants.dm +++ b/code/modules/ZAS/Contaminants.dm @@ -78,9 +78,9 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' //Burn skin if exposed. if(vsc.contaminant_control.SKIN_BURNS) if(!contaminant_head_protected() || !contaminant_suit_protected()) + if(prob(20)) + to_chat(src, "Your skin burns!") take_overall_damage(0, 0.75) - if(prob(20)) to_chat(src, "Your skin burns!") - updatehealth() //Burn eyes if exposed. if(vsc.contaminant_control.EYE_BURNS) @@ -114,13 +114,14 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' /mob/living/carbon/human/proc/contaminant_head_protected() //Checks if the head is adequately sealed. var/obj/item/head = get_equipped_item(slot_head_str) - if(head) - if(vsc.contaminant_control.STRICT_PROTECTION_ONLY) - if(head.item_flags & ITEM_FLAG_NO_CONTAMINATION) - return 1 - else if(head.body_parts_covered & SLOT_EYES) - return 1 - return 0 + if(!head) + return FALSE + // If strict protection is on, you must have a head item with ITEM_FLAG_NO_CONTAMINATION. + if(vsc.contaminant_control.STRICT_PROTECTION_ONLY) + if(!(head.item_flags & ITEM_FLAG_NO_CONTAMINATION)) + return FALSE + // Regardless, the head item must cover the face and head. Eyes are checked seperately above. + return BIT_TEST_ALL(head.body_parts_covered, SLOT_HEAD|SLOT_FACE) /mob/living/carbon/human/proc/contaminant_suit_protected() //Checks if the suit is adequately sealed. @@ -130,11 +131,11 @@ var/global/image/contamination_overlay = image('icons/effects/contamination.dmi' if(!istype(protection)) continue if(vsc.contaminant_control.STRICT_PROTECTION_ONLY && !(protection.item_flags & ITEM_FLAG_NO_CONTAMINATION)) - return 0 + return FALSE coverage |= protection.body_parts_covered if(vsc.contaminant_control.STRICT_PROTECTION_ONLY) - return 1 + return TRUE return BIT_TEST_ALL(coverage, SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS) diff --git a/code/modules/ZAS/Diagnostic.dm b/code/modules/ZAS/Diagnostic.dm index 2dc589ec930..369eec4f9ec 100644 --- a/code/modules/ZAS/Diagnostic.dm +++ b/code/modules/ZAS/Diagnostic.dm @@ -13,7 +13,7 @@ for(var/g in mix.gas) to_chat(mob, "ZONE GASES: [g]: [mix.gas[g]]\n") -/client/proc/Test_ZAS_Connection(var/turf/simulated/T) +/client/proc/Test_ZAS_Connection(var/turf/T) set category = "Debug" if(!istype(T)) return @@ -40,7 +40,7 @@ to_chat(mob, "No air passage :x") return - var/turf/simulated/other_turf = get_step(T, direction_list[direction]) + var/turf/other_turf = get_step(T, direction_list[direction]) if(!istype(other_turf)) return diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index 89da19f68ff..ab9bba78485 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -254,8 +254,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/datum/gas_mixture/burned_fuel = remove_by_flag(XGM_GAS_FUEL, used_fuel) for(var/g in burned_fuel.gas) var/decl/material/mat = GET_DECL(g) - if(mat.burn_product) - adjust_gas(mat.burn_product, burned_fuel.gas[g]) + mat.add_burn_product(src, burned_fuel.gas[g]) //calculate the energy produced by the reaction and then set the new temperature of the mix temperature = (starting_energy + vsc.fire_fuel_energy_release * used_fuel) / heat_capacity() diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index c951dbdb991..b9ceac69dad 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -74,7 +74,7 @@ airflow_open_directions |= d - if(unsim.zone_membership_candidate) + if(SHOULD_PARTICIPATE_IN_ZONES(unsim)) unsim.airflow_open_directions |= global.reverse_dir[d] @@ -214,6 +214,7 @@ return FALSE /turf/return_air() + RETURN_TYPE(/datum/gas_mixture) // ZAS participation if(zone && !zone.invalid) @@ -222,22 +223,13 @@ // Exterior turf global atmosphere if((!air && isnull(initial_gas)) || (external_atmosphere_participation && is_outside())) - var/datum/level_data/level = SSmapping.levels_by_z[z] - var/datum/gas_mixture/gas = level.get_exterior_atmosphere() - var/initial_temperature = weather ? weather.adjust_temperature(gas.temperature) : gas.temperature - if(length(affecting_heat_sources)) - for(var/obj/structure/fire_source/heat_source as anything in affecting_heat_sources) - gas.temperature = gas.temperature + heat_source.exterior_temperature / max(1, get_dist(src, get_turf(heat_source))) - if(abs(gas.temperature - initial_temperature) >= 100) - break - return gas + return get_external_air() // Base behavior - . = air - if(!.) - . = make_air() - if(zone) - c_copy_air() + . = air || make_air() + if(zone) + c_copy_air() + zone = null /turf/remove_air(amount as num) var/datum/gas_mixture/GM = return_air() @@ -261,6 +253,21 @@ air.update_values() return air +// Returns the external air if this turf is outside, modified by weather and heat sources. Outside checks do not occur in this proc! +/turf/proc/get_external_air(include_heat_sources = TRUE) + var/datum/level_data/level = SSmapping.levels_by_z[z] + var/datum/gas_mixture/gas = level.get_exterior_atmosphere() + if(!include_heat_sources) + return gas + + var/initial_temperature = weather ? weather.adjust_temperature(gas.temperature) : gas.temperature + if(length(affecting_heat_sources)) + for(var/obj/structure/fire_source/heat_source as anything in affecting_heat_sources) + gas.temperature = gas.temperature + heat_source.exterior_temperature / max(1, get_dist(src, get_turf(heat_source))) + if(abs(gas.temperature - initial_temperature) >= 100) + break + return gas + /turf/proc/c_copy_air() if(!air) air = new/datum/gas_mixture diff --git a/code/modules/ZAS/Zone.dm b/code/modules/ZAS/Zone.dm index 4f72191d231..4a55772a48f 100644 --- a/code/modules/ZAS/Zone.dm +++ b/code/modules/ZAS/Zone.dm @@ -84,6 +84,7 @@ Class Procs: ASSERT(T.zone == src) soft_assert(T in contents, "Lists are weird broseph") #endif + T.c_copy_air() // to avoid losing contents contents.Remove(T) fire_tiles.Remove(T) T.zone = null @@ -114,8 +115,7 @@ Class Procs: for(var/connection_edge/E in edges) if(E.contains_zone(into)) continue //don't need to rebuild this edge - for(var/turf/T in E.connecting_turfs) - SSair.mark_for_update(T) + E.update_post_merge() /zone/proc/c_invalidate() invalid = 1 @@ -173,10 +173,8 @@ Class Procs: if(abs(air.temperature - last_air_temperature) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) last_air_temperature = air.temperature for(var/turf/T as anything in contents) - for(var/check_atom in T.contents) - var/atom/checking = check_atom - if(checking.simulated) - queue_temperature_atoms(checking) + for(var/atom/check_atom as anything in T.contents) + QUEUE_TEMPERATURE_ATOM(check_atom) CHECK_TICK /zone/proc/handle_condensation() diff --git a/code/modules/abstract/_abstract.dm b/code/modules/abstract/_abstract.dm index d6efa015383..11d081248ec 100644 --- a/code/modules/abstract/_abstract.dm +++ b/code/modules/abstract/_abstract.dm @@ -1,12 +1,12 @@ /obj/abstract - name = "" - icon = 'icons/effects/landmarks.dmi' - icon_state = "x2" - simulated = FALSE - density = FALSE - anchored = TRUE - unacidable = TRUE + name = "" + icon = 'icons/effects/landmarks.dmi' + icon_state = "x2" + simulated = FALSE + density = FALSE + anchored = TRUE abstract_type = /obj/abstract + invisibility = INVISIBILITY_ABSTRACT /obj/abstract/Initialize() . = ..() @@ -15,7 +15,6 @@ opacity = FALSE alpha = 0 mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - invisibility = INVISIBILITY_MAXIMUM+1 /obj/abstract/explosion_act() SHOULD_CALL_PARENT(FALSE) diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index 09716bfcb86..672e773675a 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -12,7 +12,7 @@ user.show_message("You push a button and watch patiently as the machine begins to hum.") if(active) active = FALSE - addtimer(CALLBACK(src, .proc/dispense), 3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(dispense)), 3 SECONDS) return TRUE /obj/machinery/acting/wardrobe/proc/dispense() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 686443a1b04..a780eadc0f5 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -15,7 +15,7 @@ return ..() //Guest Checking - if(!config.guests_allowed && IsGuestKey(key)) + if(!get_config_value(/decl/config/toggle/guests_allowed) && IsGuestKey(key)) log_access("Failed Login: [key] - Guests not allowed") message_admins("Failed Login: [key] - Guests not allowed") key_cache[key] = 0 @@ -27,7 +27,7 @@ key_cache[key] = 0 return - if(config.ban_legacy_system) + if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) //Ban Checking . = CheckBan(ckeytext, computer_id, address) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index c3d514be9a3..7f4ea462f4a 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -10,8 +10,9 @@ var/global/savefile/Banlist . = list() var/appeal - if(config && config.banappeals) - appeal = "\nFor more information on your ban, or to appeal, head to [config.banappeals]" + var/appealurl = get_config_value(/decl/config/text/banappeals) + if(appealurl) + appeal = "\nFor more information on your ban, or to appeal, head to [appealurl]" Banlist.cd = "/base" if( "[ckey][id]" in Banlist.dir ) Banlist.cd = "[ckey][id]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1621ad56c67..efd56eae900 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -721,12 +721,9 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Globally Toggles OOC" set name="Toggle OOC" - if(!check_rights(R_ADMIN)) return - - config.ooc_allowed = !(config.ooc_allowed) - if (config.ooc_allowed) + if (toggle_config_value(/decl/config/toggle/on/ooc_allowed)) to_world("The OOC channel has been globally enabled!") else to_world("The OOC channel has been globally disabled!") @@ -737,12 +734,9 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Globally Toggles AOOC" set name="Toggle AOOC" - if(!check_rights(R_ADMIN)) return - - config.aooc_allowed = !(config.aooc_allowed) - if (config.aooc_allowed) + if (toggle_config_value(/decl/config/toggle/on/aooc_allowed)) communicate_broadcast(/decl/communication_channel/aooc, "The AOOC channel has been globally enabled!", TRUE) else communicate_broadcast(/decl/communication_channel/aooc, "The AOOC channel has been globally disabled!", TRUE) @@ -756,9 +750,7 @@ var/global/floorIsLava = 0 if(!check_rights(R_ADMIN)) return - - config.looc_allowed = !(config.looc_allowed) - if (config.looc_allowed) + if (toggle_config_value(/decl/config/toggle/on/looc_allowed)) to_world("The LOOC channel has been globally enabled!") else to_world("The LOOC channel has been globally disabled!") @@ -773,9 +765,7 @@ var/global/floorIsLava = 0 if(!check_rights(R_ADMIN)) return - - config.dsay_allowed = !(config.dsay_allowed) - if (config.dsay_allowed) + if (toggle_config_value(/decl/config/toggle/on/dsay_allowed)) to_world("Deadchat has been globally enabled!") else to_world("Deadchat has been globally disabled!") @@ -786,11 +776,9 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Toggle Dead OOC." set name="Toggle Dead OOC" - if(!check_rights(R_ADMIN)) return - - config.dooc_allowed = !( config.dooc_allowed ) + toggle_config_value(/decl/config/toggle/on/dooc_allowed) log_admin("[key_name(usr)] toggled Dead OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1) SSstatistics.add_field_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -804,9 +792,10 @@ var/global/floorIsLava = 0 return //BYOND hates actually changing world.visibility at runtime, so let's just change if we give it the hub password. - world.update_hub_visibility() //proc defined in hub.dm - var/long_message = "toggled hub visibility. The server is now [global.visibility_pref ? "visible" : "invisible"] ([global.visibility_pref])." - if (global.visibility_pref && !world.reachable) + toggle_config_value(/decl/config/toggle/hub_visibility) + var/new_vis = get_config_value(/decl/config/toggle/hub_visibility) + var/long_message = "toggled hub visibility. The server is now [new_vis ? "visible" : "invisible"]." + if (new_vis && !world.reachable) message_admins("WARNING: The server will not show up on the hub because byond is detecting that a firewall is blocking incoming connections.") send2adminirc("[key_name(src)]" + long_message) @@ -817,9 +806,12 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Toggle traitor scaling" set name="Toggle Traitor Scaling" - config.traitor_scaling = !config.traitor_scaling - log_admin("[key_name(usr)] toggled Traitor Scaling to [config.traitor_scaling].") - message_admins("[key_name_admin(usr)] toggled Traitor Scaling [config.traitor_scaling ? "on" : "off"].", 1) + if(toggle_config_value(/decl/config/toggle/traitor_scaling)) + log_admin("[key_name(usr)] toggled Traitor Scaling to on.") + message_admins("[key_name_admin(usr)] toggled Traitor Scaling on.", 1) + else + log_admin("[key_name(usr)] toggled Traitor Scaling to off.") + message_admins("[key_name_admin(usr)] toggled Traitor Scaling off.", 1) SSstatistics.add_field_details("admin_verb","TTS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/startnow() @@ -858,7 +850,7 @@ var/global/floorIsLava = 0 if(confirm == "Yes") Master.SetRunLevel(RUNLEVEL_POSTGAME) SSticker.end_game_state = END_GAME_READY_TO_END - INVOKE_ASYNC(SSticker, /datum/controller/subsystem/ticker/proc/declare_completion) + INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, declare_completion)) log_and_message_admins("initiated a game ending.") to_world("Game ending! Initiated by [usr.key]!") SSstatistics.add_field("admin_verb","ER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -867,11 +859,10 @@ var/global/floorIsLava = 0 set category = "Server" set desc="People can't enter" set name="Toggle Entering" - config.enter_allowed = !(config.enter_allowed) - if (!(config.enter_allowed)) - to_world("New players may no longer enter the game.") - else + if (toggle_config_value(/decl/config/toggle/on/enter_allowed)) to_world("New players may now enter the game.") + else + to_world("New players may no longer enter the game.") log_and_message_admins("toggled new player game entering.") world.update_status() SSstatistics.add_field_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -880,11 +871,11 @@ var/global/floorIsLava = 0 set category = "Server" set desc="People can't be AI" set name="Toggle AI" - config.allow_ai = !( config.allow_ai ) - if (!( config.allow_ai )) - to_world("The AI job is no longer chooseable.") - else + + if (toggle_config_value(/decl/config/toggle/on/allow_ai)) to_world("The AI job is chooseable now.") + else + to_world("The AI job is no longer chooseable.") log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() SSstatistics.add_field_details("admin_verb","TAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -893,12 +884,12 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Respawn basically" set name="Toggle Respawn" - config.abandon_allowed = !(config.abandon_allowed) - if(config.abandon_allowed) + if (toggle_config_value(/decl/config/toggle/on/abandon_allowed)) to_world("You may now respawn.") + log_and_message_admins("toggled respawn to On.") else to_world("You may no longer respawn :(") - log_and_message_admins("toggled respawn to [config.abandon_allowed ? "On" : "Off"].") + log_and_message_admins("toggled respawn to Off.") world.update_status() SSstatistics.add_field_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -908,10 +899,12 @@ var/global/floorIsLava = 0 set name="Toggle Aliens" if(!check_rights(R_ADMIN)) return - - config.aliens_allowed = !config.aliens_allowed - log_admin("[key_name(usr)] toggled Aliens to [config.aliens_allowed].") - message_admins("[key_name_admin(usr)] toggled Aliens [config.aliens_allowed ? "on" : "off"].", 1) + if(toggle_config_value(/decl/config/toggle/aliens_allowed)) + log_admin("[key_name(usr)] toggled Aliens to On.") + message_admins("[key_name_admin(usr)] toggled Aliens on.", 1) + else + log_admin("[key_name(usr)] toggled Aliens to Off.") + message_admins("[key_name_admin(usr)] toggled Aliens off.", 1) SSstatistics.add_field_details("admin_verb","TA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggle_space_ninja() @@ -920,9 +913,8 @@ var/global/floorIsLava = 0 set name="Toggle Space Ninjas" if(!check_rights(R_ADMIN)) return - - config.ninjas_allowed = !config.ninjas_allowed - log_and_message_admins("toggled Space Ninjas [config.ninjas_allowed ? "on" : "off"].") + toggle_config_value(/decl/config/toggle/ninjas_allowed) + log_and_message_admins("toggled Space Ninjas [get_config_value(/decl/config/toggle/ninjas_allowed) ? "on" : "off"].") SSstatistics.add_field_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/delay() @@ -948,24 +940,24 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Toggle admin jumping" set name="Toggle Jump" - config.allow_admin_jump = !(config.allow_admin_jump) - log_and_message_admins("toggled admin jumping to [config.allow_admin_jump].") + toggle_config_value(/decl/config/toggle/on/admin_jump) + log_and_message_admins("toggled admin jumping to [get_config_value(/decl/config/toggle/on/admin_jump)].") SSstatistics.add_field_details("admin_verb","TJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adspawn() set category = "Server" set desc="Toggle admin spawning" set name="Toggle Spawn" - config.allow_admin_spawning = !(config.allow_admin_spawning) - log_and_message_admins("toggled admin item spawning to [config.allow_admin_spawning].") + toggle_config_value(/decl/config/toggle/on/admin_spawning) + log_and_message_admins("toggled admin item spawning to [get_config_value(/decl/config/toggle/on/admin_spawning)].") SSstatistics.add_field_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adrev() set category = "Server" set desc="Toggle admin revives" set name="Toggle Revive" - config.allow_admin_rev = !(config.allow_admin_rev) - log_and_message_admins("toggled reviving to [config.allow_admin_rev].") + toggle_config_value(/decl/config/toggle/on/admin_revive) + log_and_message_admins("toggled reviving to [get_config_value(/decl/config/toggle/on/admin_revive)].") SSstatistics.add_field_details("admin_verb","TAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/immreboot() @@ -987,8 +979,8 @@ var/global/floorIsLava = 0 set category = "Admin" set name = "Unprison" if (isAdminLevel(M.z)) - if (config.allow_admin_jump) - M.forceMove(pick(global.latejoin_locations)) + if (get_config_value(/decl/config/toggle/on/admin_jump)) + M.forceMove(get_random_spawn_turf(SPAWN_FLAG_PRISONERS_CAN_SPAWN)) message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]", 1) log_admin("[key_name(usr)] has unprisoned [key_name(M)]") else @@ -1144,7 +1136,9 @@ var/global/floorIsLava = 0 for(var/path in subtypesof(/atom)) var/atom/path_cast = path if(TYPE_IS_SPAWNABLE(path_cast) && findtext(lowertext("[path]"), object)) - matches += path + // We need to keep the type as a string because for some ungodly reason input() compares + // initial invisibility value to mob see_invisible. + matches += "[path]" if(matches.len==0) return @@ -1153,10 +1147,11 @@ var/global/floorIsLava = 0 if(matches.len==1) chosen = matches[1] else - chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches + chosen = input(usr, "Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches if(!chosen) return + chosen = text2path(chosen) // See comment above. if(ispath(chosen,/turf)) var/turf/T = get_turf(usr.loc) T.ChangeTurf(chosen) @@ -1191,7 +1186,7 @@ var/global/floorIsLava = 0 alert("Not before roundstart!", "Alert") return - var/out = "Current mode: [SSticker.mode.name] ([SSticker.mode.config_tag])
    " + var/out = "Current mode: [SSticker.mode.name] ([SSticker.mode.uid])
    " out += "
    " if(SSticker.mode.ert_disabled) @@ -1262,8 +1257,7 @@ var/global/floorIsLava = 0 set category = "Debug" set desc="Reduces view range when wearing welding helmets" set name="Toggle tinted welding helmets." - config.welder_vision = !( config.welder_vision ) - if (config.welder_vision) + if (toggle_config_value(/decl/config/toggle/on/welder_vision)) to_world("Reduced welder vision has been enabled!") else to_world("Reduced welder vision has been disabled!") @@ -1274,13 +1268,14 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Guests can't enter" set name="Toggle guests" - config.guests_allowed = !(config.guests_allowed) - if (!(config.guests_allowed)) - to_world("Guests may no longer enter the game.") - else + if (toggle_config_value(/decl/config/toggle/guests_allowed)) to_world("Guests may now enter the game.") - log_admin("[key_name(usr)] toggled guests game entering [config.guests_allowed?"":"dis"]allowed.") - log_and_message_admins("toggled guests game entering [config.guests_allowed?"":"dis"]allowed.") + log_admin("[key_name(usr)] toggled guests game entering allowed.") + log_and_message_admins("toggled guests game entering allowed.") + else + to_world("Guests may no longer enter the game.") + log_admin("[key_name(usr)] toggled guests game entering disallowed.") + log_and_message_admins("toggled guests game entering disallowed.") SSstatistics.add_field_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/output_ai_laws() @@ -1334,7 +1329,7 @@ var/global/floorIsLava = 0 return if(istype(H)) - H.refresh_visible_overlays() + H.try_refresh_visible_overlays() /proc/get_options_bar(whom, detail = 2, name = 0, link = 1, highlight_special = 1, var/datum/ticket/ticket = null) if(!whom) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index be20c0f0abc..66fe7e8daff 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -39,7 +39,7 @@ show_browser(src, F, "window=investigate[subject];size=800x300") if("hrefs") //persistant logs and stuff - if(config && config.log_hrefs) + if(get_config_value(/decl/config/toggle/log_hrefs)) if(global.world_href_log) show_browser(src, global.world_href_log, "window=investigate[subject];size=800x300") else diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 0a1c04d54f5..5a6a4d7b17a 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -68,7 +68,7 @@ var/global/list/admin_ranks = list() //list of all ranks with associated for (var/admin in world.GetConfig("admin")) world.SetConfig("APP/admin", admin, null) - if(config.admin_legacy_system) + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) load_admin_ranks() //load text from file @@ -108,7 +108,7 @@ var/global/list/admin_ranks = list() //list of all ranks with associated if(!dbcon.IsConnected()) error("Failed to connect to database in load_admins(). Reverting to legacy system.") log_misc("Failed to connect to database in load_admins(). Reverting to legacy system.") - config.admin_legacy_system = 1 + set_config_value(/decl/config/toggle/on/admin_legacy_system, TRUE) load_admins() return @@ -128,7 +128,7 @@ var/global/list/admin_ranks = list() //list of all ranks with associated if(!admin_datums) error("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.") log_misc("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.") - config.admin_legacy_system = 1 + set_config_value(/decl/config/toggle/on/admin_legacy_system, TRUE) load_admins() return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 1210dcbe012..e3192f9c97d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -330,7 +330,8 @@ var/global/list/admin_verbs_mod = list( /client/proc/aooc, /datum/admins/proc/sendFax, /datum/admins/proc/paralyze_mob, - /datum/admins/proc/view_persistent_data + /datum/admins/proc/view_persistent_data, + /datum/admins/proc/dump_configuration ) /client/proc/add_admin_verbs() @@ -343,7 +344,7 @@ var/global/list/admin_verbs_mod = list( if(holder.rights & R_SERVER) verbs += admin_verbs_server if(holder.rights & R_DEBUG) verbs += admin_verbs_debug - if(config.debugparanoid && !(holder.rights & R_ADMIN)) + if(get_config_value(/decl/config/toggle/paranoid) && !(holder.rights & R_ADMIN)) verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. if(holder.rights & R_POSSESS) verbs += admin_verbs_possess if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions @@ -465,7 +466,7 @@ var/global/list/admin_verbs_mod = list( set name = "Display Job bans" set category = "Admin" if(holder) - if(config.ban_legacy_system) + if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) holder.Jobbans() else holder.DB_ban_panel() @@ -476,7 +477,7 @@ var/global/list/admin_verbs_mod = list( set name = "Unban Panel" set category = "Admin" if(holder) - if(config.ban_legacy_system) + if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) holder.unbanpanel() else holder.DB_ban_panel() @@ -577,7 +578,7 @@ var/global/list/admin_verbs_mod = list( explosion(epicenter, 3, 5, 7, 5) if("Custom Bomb") - if(config.use_iterative_explosions) + if(get_config_value(/decl/config/toggle/use_iterative_explosions)) var/power = input(src, "Input power num.", "Power?") as num explosion_iter(get_turf(mob), power, (UP|DOWN)) else @@ -642,13 +643,10 @@ var/global/list/admin_verbs_mod = list( set name = "Toggle href logging" set category = "Server" if(!holder) return - if(config) - if(config.log_hrefs) - config.log_hrefs = 0 - to_chat(src, "Stopped logging hrefs") - else - config.log_hrefs = 1 - to_chat(src, "Started logging hrefs") + if(toggle_config_value(/decl/config/toggle/log_hrefs)) + to_chat(src, "Started logging hrefs") + else + to_chat(src, "Stopped logging hrefs") /client/proc/check_ai_laws() set name = "Check AI Laws" @@ -760,22 +758,25 @@ var/global/list/admin_verbs_mod = list( switch(alert("Are you sure you wish to edit this mob's appearance? This can result in unintended consequences.",,"Yes","No")) if("No") return + + var/update_hair = FALSE var/new_facial = input("Please select facial hair color.", "Character Generation") as color if(new_facial) - M.facial_hair_colour = new_facial + M.set_facial_hair_colour(new_facial, skip_update = TRUE) + update_hair = TRUE var/new_hair = input("Please select hair color.", "Character Generation") as color if(new_hair) - M.hair_colour = new_hair + M.set_hair_colour(new_hair, skip_update = TRUE) + update_hair = TRUE var/new_eyes = input("Please select eye color.", "Character Generation") as color if(new_eyes) - M.eye_colour = new_eyes - M.update_eyes() + M.set_eye_colour(new_eyes) var/new_skin = input("Please select body color.", "Character Generation") as color if(new_skin) - M.skin_colour = new_skin + M.set_skin_colour(new_skin, skip_update = TRUE) var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text @@ -784,14 +785,16 @@ var/global/list/admin_verbs_mod = list( M.skin_tone = -M.skin_tone + 35 // hair - var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/hair) - if(new_hstyle) - M.h_style = new_hstyle + var/new_hairstyle = input(usr, "Select a hair style", "Grooming") as null|anything in decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/hair) + if(new_hairstyle) + M.set_hairstyle(new_hairstyle, skip_update = TRUE) + update_hair = TRUE // facial hair var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in decls_repository.get_decl_paths_of_subtype(/decl/sprite_accessory/facial_hair) if(new_fstyle) - M.f_style = new_fstyle + M.set_facial_hairstyle(new_fstyle, skip_update = TRUE) + update_hair = TRUE var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter") if (new_gender) @@ -802,7 +805,8 @@ var/global/list/admin_verbs_mod = list( else M.set_gender(NEUTER) - M.update_hair() + if(update_hair) + M.update_hair() M.update_body() M.check_dna(M) @@ -858,30 +862,25 @@ var/global/list/admin_verbs_mod = list( /client/proc/toggleghostwriters() set name = "Toggle ghost writers" set category = "Server" - if(!holder) return - if(config) - if(config.cult_ghostwriter) - config.cult_ghostwriter = 0 - to_chat(src, "Disallowed ghost writers.") - message_admins("Admin [key_name_admin(usr)] has disabled ghost writers.", 1) - else - config.cult_ghostwriter = 1 - to_chat(src, "Enabled ghost writers.") - message_admins("Admin [key_name_admin(usr)] has enabled ghost writers.", 1) + if(!holder) + return + if(toggle_config_value(/decl/config/toggle/on/cult_ghostwriter)) + to_chat(src, "Enabled ghost writers.") + message_admins("Admin [key_name_admin(usr)] has enabled ghost writers.", 1) + else + to_chat(src, "Disallowed ghost writers.") + message_admins("Admin [key_name_admin(usr)] has disabled ghost writers.", 1) /client/proc/toggledrones() set name = "Toggle maintenance drones" set category = "Server" if(!holder) return - if(config) - if(config.allow_drone_spawn) - config.allow_drone_spawn = 0 - to_chat(src, "Disallowed maint drones.") - message_admins("Admin [key_name_admin(usr)] has disabled maint drones.", 1) - else - config.allow_drone_spawn = 1 - to_chat(src, "Enabled maint drones.") - message_admins("Admin [key_name_admin(usr)] has enabled maint drones.", 1) + if(toggle_config_value(/decl/config/toggle/on/allow_drone_spawn)) + to_chat(src, "Enabled maint drones.") + message_admins("Admin [key_name_admin(usr)] has enabled maint drones.", 1) + else + to_chat(src, "Disallowed maint drones.") + message_admins("Admin [key_name_admin(usr)] has disabled maint drones.", 1) /client/proc/man_up(mob/T as mob in SSmobs.mob_list) set category = "Fun" diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 0b697a418dc..6d8057e82c4 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -24,9 +24,9 @@ var/global/jobban_keylist[0] //to store the keys & ranks var/decl/special_role/antag = GET_DECL(rank) rank = antag.name if (SSjobs.guest_jobbans(rank)) - if(config.guest_jobban && IsGuestKey(M.key)) + if(get_config_value(/decl/config/toggle/on/guest_jobban) && IsGuestKey(M.key)) return "Guest Job-ban" - if(config.usewhitelist && !check_whitelist(M)) + if(get_config_value(/decl/config/toggle/usewhitelist) && !check_whitelist(M)) return "Whitelisted Job" return ckey_is_jobbanned(M.ckey, rank) return 0 @@ -47,7 +47,7 @@ var/global/jobban_keylist[0] //to store the keys & ranks return 1 /proc/jobban_loadbanfile() - if(config.ban_legacy_system) + if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) var/savefile/S=new("data/job_full.ban") from_savefile(S, "keys[0]", jobban_keylist) log_admin("Loading jobban_rank") @@ -60,7 +60,7 @@ var/global/jobban_keylist[0] //to store the keys & ranks if(!establish_db_connection()) error("Database connection failed. Reverting to the legacy ban system.") log_misc("Database connection failed. Reverting to the legacy ban system.") - config.ban_legacy_system = 1 + set_config_value(/decl/config/toggle/on/ban_legacy_system, TRUE) jobban_loadbanfile() return diff --git a/code/modules/admin/buildmode/areas.dm b/code/modules/admin/buildmode/areas.dm index 88ba2c22f5c..6b76fdba3b2 100644 --- a/code/modules/admin/buildmode/areas.dm +++ b/code/modules/admin/buildmode/areas.dm @@ -97,12 +97,12 @@ Right Click - List/Create Area return UnselectArea() selected_area = A - events_repository.register(/decl/observ/destroyed, selected_area, src, .proc/UnselectArea) + events_repository.register(/decl/observ/destroyed, selected_area, src, PROC_REF(UnselectArea)) /datum/build_mode/areas/proc/UnselectArea() if(!selected_area) return - events_repository.unregister(/decl/observ/destroyed, selected_area, src, .proc/UnselectArea) + events_repository.unregister(/decl/observ/destroyed, selected_area, src, PROC_REF(UnselectArea)) var/has_turf = FALSE for(var/turf/T in selected_area) diff --git a/code/modules/admin/buildmode/click_handler.dm b/code/modules/admin/buildmode/click_handler.dm index 15e20226ed0..fcb7bb91f8b 100644 --- a/code/modules/admin/buildmode/click_handler.dm +++ b/code/modules/admin/buildmode/click_handler.dm @@ -36,7 +36,7 @@ . = ..() /datum/click_handler/build_mode/proc/StartTimer() - timer_handle = addtimer(CALLBACK(src, .proc/TimerEvent), 1 SECOND, TIMER_UNIQUE | TIMER_STOPPABLE | TIMER_LOOP) + timer_handle = addtimer(CALLBACK(src, PROC_REF(TimerEvent)), 1 SECOND, TIMER_UNIQUE | TIMER_STOPPABLE | TIMER_LOOP) /datum/click_handler/build_mode/proc/StopTimer() deltimer(timer_handle) diff --git a/code/modules/admin/buildmode/edit.dm b/code/modules/admin/buildmode/edit.dm index a0505f46678..23bcdc47596 100644 --- a/code/modules/admin/buildmode/edit.dm +++ b/code/modules/admin/buildmode/edit.dm @@ -63,13 +63,13 @@ ClearValue() value_to_set = new_value if(istype(value_to_set, /datum)) - events_repository.register(/decl/observ/destroyed, value_to_set, src, /datum/build_mode/edit/proc/ClearValue) + events_repository.register(/decl/observ/destroyed, value_to_set, src, TYPE_PROC_REF(/datum/build_mode/edit, ClearValue)) /datum/build_mode/edit/proc/ClearValue(var/feedback) if(!istype(value_to_set, /datum)) return - events_repository.unregister(/decl/observ/destroyed, value_to_set, src, /datum/build_mode/edit/proc/ClearValue) + events_repository.unregister(/decl/observ/destroyed, value_to_set, src, TYPE_PROC_REF(/datum/build_mode/edit, ClearValue)) value_to_set = initial(value_to_set) if(feedback) Warn("The selected reference value was deleted. Default value restored.") diff --git a/code/modules/admin/buildmode/move_into.dm b/code/modules/admin/buildmode/move_into.dm index 75dba96f501..ce045fb7f39 100644 --- a/code/modules/admin/buildmode/move_into.dm +++ b/code/modules/admin/buildmode/move_into.dm @@ -33,14 +33,14 @@ ClearDestination() destination = A - events_repository.register(/decl/observ/destroyed, destination, src, /datum/build_mode/move_into/proc/ClearDestination) + events_repository.register(/decl/observ/destroyed, destination, src, TYPE_PROC_REF(/datum/build_mode/move_into, ClearDestination)) to_chat(user, "Will now move targets into \the [destination].") /datum/build_mode/move_into/proc/ClearDestination(var/feedback) if(!destination) return - events_repository.unregister(/decl/observ/destroyed, destination, src, /datum/build_mode/move_into/proc/ClearDestination) + events_repository.unregister(/decl/observ/destroyed, destination, src, TYPE_PROC_REF(/datum/build_mode/move_into, ClearDestination)) destination = null if(feedback) Warn("The selected destination was deleted.") diff --git a/code/modules/admin/buildmode/relocate_to.dm b/code/modules/admin/buildmode/relocate_to.dm index 1a2e77340c7..e0c3680993d 100644 --- a/code/modules/admin/buildmode/relocate_to.dm +++ b/code/modules/admin/buildmode/relocate_to.dm @@ -34,14 +34,14 @@ ClearRelocator() to_relocate = new_relocator - events_repository.register(/decl/observ/destroyed, to_relocate, src, /datum/build_mode/relocate_to/proc/ClearRelocator) + events_repository.register(/decl/observ/destroyed, to_relocate, src, TYPE_PROC_REF(/datum/build_mode/relocate_to, ClearRelocator)) to_chat(user, "Will now be relocating \the [to_relocate].") /datum/build_mode/relocate_to/proc/ClearRelocator(var/feedback) if(!to_relocate) return - events_repository.unregister(/decl/observ/destroyed, to_relocate, src, /datum/build_mode/relocate_to/proc/ClearRelocator) + events_repository.unregister(/decl/observ/destroyed, to_relocate, src, TYPE_PROC_REF(/datum/build_mode/relocate_to, ClearRelocator)) to_relocate = null if(feedback) Warn("The selected relocation object was deleted.") diff --git a/code/modules/admin/buildmode/throw_at.dm b/code/modules/admin/buildmode/throw_at.dm index 068a89a1d1c..581e2077757 100644 --- a/code/modules/admin/buildmode/throw_at.dm +++ b/code/modules/admin/buildmode/throw_at.dm @@ -33,14 +33,14 @@ ClearThrowable() to_throw = new_throwable - events_repository.register(/decl/observ/destroyed, to_throw, src, /datum/build_mode/throw_at/proc/ClearThrowable) + events_repository.register(/decl/observ/destroyed, to_throw, src, TYPE_PROC_REF(/datum/build_mode/throw_at, ClearThrowable)) to_chat(user, "Will now be throwing \the [to_throw].") /datum/build_mode/throw_at/proc/ClearThrowable(var/feedback) if(!to_throw) return - events_repository.unregister(/decl/observ/destroyed, to_throw, src, /datum/build_mode/throw_at/proc/ClearThrowable) + events_repository.unregister(/decl/observ/destroyed, to_throw, src, TYPE_PROC_REF(/datum/build_mode/throw_at, ClearThrowable)) to_throw = null if(feedback) Warn("The selected throwing object was deleted.") diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index bf013e00126..4cdf5e8c089 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -6,7 +6,7 @@ set name = "Advanced ProcCall" if(!check_rights(R_DEBUG)) return - if(config.debugparanoid && !check_rights(R_ADMIN)) return + if(get_config_value(/decl/config/toggle/paranoid) && !check_rights(R_ADMIN)) return var/target = null var/targetselected = 0 @@ -41,7 +41,7 @@ set name = "Advanced ProcCall Target" if(!check_rights(R_DEBUG)) return - if(config.debugparanoid && !check_rights(R_ADMIN)) return + if(get_config_value(/decl/config/toggle/paranoid) && !check_rights(R_ADMIN)) return callproc_targetpicked(1, A) @@ -51,7 +51,7 @@ /client/proc/callproc_targetpicked(hastarget, datum/target) // this needs checking again here because VV's 'Call Proc' option directly calls this proc with the target datum if(!check_rights(R_DEBUG)) return - if(config.debugparanoid && !check_rights(R_ADMIN)) return + if(get_config_value(/decl/config/toggle/paranoid) && !check_rights(R_ADMIN)) return if(!holder.callproc) holder.callproc = new(src) @@ -183,7 +183,7 @@ return CANCEL if("marked datum") - current = C.holder.marked_datum() + current = C.holder?.marked_datum() if(!current) switch(alert("You do not currently have a marked datum; do you want to pass null instead?",, "Yes", "Cancel")) if("Yes") diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index af9881d7406..4b05b4d2538 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -121,7 +121,8 @@ NOTE: It checks usr by default. Supply the "user" argument if you wish to check if(!holder) return FALSE - var/auto_stealth = (inactivity >= world.time) || (config.autostealth && (inactivity >= MinutesToTicks(config.autostealth))) + var/config_autostealth = get_config_value(/decl/config/num/autostealth) + var/auto_stealth = (inactivity >= world.time) || (config_autostealth && (inactivity >= config_autostealth MINUTES)) // If someone has been AFK since round-start or longer, stealth them // BYOND keeps track of inactivity between rounds as long as it's not a full stop/start. if(holder.stealthy_ == STEALTH_OFF && auto_stealth) diff --git a/code/modules/admin/panicbunker.dm b/code/modules/admin/panicbunker.dm index 8ca0b8fae53..bd215380d72 100644 --- a/code/modules/admin/panicbunker.dm +++ b/code/modules/admin/panicbunker.dm @@ -6,11 +6,9 @@ var/global/list/panic_bunker_bypass = list() if(!check_rights(R_SERVER)) return - - config.panic_bunker = !config.panic_bunker - - log_and_message_admins("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker ? "on" : "off")]") - if (config.panic_bunker && (!dbcon || !dbcon.IsConnected())) + toggle_config_value(/decl/config/toggle/panic_bunker) + log_and_message_admins("[key_name(usr)] has toggled the Panic Bunker, it is now [(get_config_value(/decl/config/toggle/panic_bunker) ? "on" : "off")]") + if (get_config_value(/decl/config/toggle/panic_bunker) && (!dbcon || !dbcon.IsConnected())) message_admins("The SQL database is not connected, player age cannot be checked and the panic bunker will not function until the database connection is restored.") /datum/admins/proc/addbunkerbypass(ckeytobypass as text) diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index eb81b27a463..add6b917af5 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -45,7 +45,8 @@ show_browser(usr, output, "window=editrights;size=600x500") /datum/admins/proc/log_admin_rank_modification(var/adm_ckey, var/new_rank) - if(config.admin_legacy_system) return + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) + return if(!usr.client) return @@ -95,7 +96,8 @@ to_chat(usr, "Admin rank changed.") /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) - if(config.admin_legacy_system) return + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) + return if(!usr.client) return diff --git a/code/modules/admin/quantum_mechanic.dm b/code/modules/admin/quantum_mechanic.dm index e9eda23b451..67a1296ba62 100644 --- a/code/modules/admin/quantum_mechanic.dm +++ b/code/modules/admin/quantum_mechanic.dm @@ -15,6 +15,10 @@ if(!check_rights(R_ADMIN|R_DEBUG)) return + if(GAME_STATE < RUNLEVEL_GAME) + to_chat(src, SPAN_WARNING("Please wait for the round to start...")) + return + var/T = get_turf(mob) var/mob/living/carbon/human/quantum/Q = new (T) @@ -24,7 +28,7 @@ Q.ckey = ckey var/decl/hierarchy/outfit/outfit = outfit_by_type(/decl/hierarchy/outfit/quantum) - outfit.equip(Q) + outfit.equip_outfit(Q) //Sort out ID var/obj/item/card/id/quantum/id = new (Q) @@ -187,8 +191,6 @@ icon = 'icons/clothing/under/uniform_quantum.dmi' cold_protection = SLOT_FULL_BODY heat_protection = SLOT_FULL_BODY - sensor_mode = SUIT_SENSOR_OFF - has_sensor = FALSE siemens_coefficient = 0 /obj/item/clothing/under/color/quantum/attack_hand(mob/user) diff --git a/code/modules/admin/secrets/fun_secrets/waddle.dm b/code/modules/admin/secrets/fun_secrets/waddle.dm index f1cfc8b6e7b..f4d7e86e251 100644 --- a/code/modules/admin/secrets/fun_secrets/waddle.dm +++ b/code/modules/admin/secrets/fun_secrets/waddle.dm @@ -7,8 +7,8 @@ if(waddling) for(var/mob/living/living_mob in global.living_mob_list_) set_extension(living_mob, /datum/extension/waddle) - events_repository.register_global(/decl/observ/life, src, .proc/enroll_in_waddling) - events_repository.register_global(/decl/observ/death, src, .proc/cure_waddling) + events_repository.register_global(/decl/observ/life, src, PROC_REF(enroll_in_waddling)) + events_repository.register_global(/decl/observ/death, src, PROC_REF(cure_waddling)) else for(var/mob/living/living_mob in global.living_mob_list_) cure_waddling(living_mob) @@ -32,8 +32,8 @@ /datum/extension/waddle/New(datum/holder) . = ..() - events_repository.register(/decl/observ/moved, holder, src, .proc/waddle) - events_repository.register(/decl/observ/destroyed, holder, src, .proc/qdel_self) + events_repository.register(/decl/observ/moved, holder, src, PROC_REF(waddle)) + events_repository.register(/decl/observ/destroyed, holder, src, PROC_REF(qdel_self)) /datum/extension/event_registration/Destroy() events_repository.unregister(/decl/observ/destroyed, holder, src) diff --git a/code/modules/admin/spam_prevention.dm b/code/modules/admin/spam_prevention.dm index 98875e57cee..10d9adab7fe 100644 --- a/code/modules/admin/spam_prevention.dm +++ b/code/modules/admin/spam_prevention.dm @@ -7,14 +7,14 @@ var/global/list/ckey_punished_for_spam = list() // this round; to avoid redundan var/ckey = C && C.ckey if(!ckey) return FALSE - if (config.do_not_prevent_spam) + if(get_config_value(/decl/config/toggle/do_not_prevent_spam)) return TRUE var/time = world.time - if(global.ckey_to_act_time[ckey] + config.act_interval < time) + if(global.ckey_to_act_time[ckey] + (get_config_value(/decl/config/num/act_interval) SECONDS) < time) global.ckey_to_act_time[ckey] = time global.ckey_to_actions[ckey] = 1 return TRUE - if(global.ckey_to_actions[ckey] <= config.max_acts_per_interval) + if(global.ckey_to_actions[ckey] <= get_config_value(/decl/config/num/max_acts_per_interval)) global.ckey_to_actions[ckey]++ return TRUE @@ -41,5 +41,5 @@ var/global/list/ckey_punished_for_spam = list() // this round; to avoid redundan return return ..() -/client/MouseDrop() +/client/MouseDrop(src_object, over_object, src_location, over_location, src_control, over_control, params) . = user_acted(src) && ..() diff --git a/code/modules/admin/ticket.dm b/code/modules/admin/ticket.dm index 694d8524929..d394a86cd0c 100644 --- a/code/modules/admin/ticket.dm +++ b/code/modules/admin/ticket.dm @@ -20,7 +20,7 @@ var/global/list/ticket_panels = list() var/sql_ckey = sanitize_sql(owner.ckey) var/DBQuery/ticket_query = dbcon.NewQuery("INSERT INTO `erro_admin_tickets`(`ckey`, `round`, `inround_id`, `status`, `open_date`) VALUES ('[sql_ckey]', '[game_id]', [src.id], 'OPEN', NOW());") ticket_query.Execute() - addtimer(CALLBACK(src, .proc/timeoutcheck), 5 MINUTES) + addtimer(CALLBACK(src, PROC_REF(timeoutcheck)), 5 MINUTES) /datum/ticket/proc/timeoutcheck() if(status == TICKET_OPEN) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 85aa0b7a70d..e2e0a2f356b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -140,19 +140,19 @@ if(null,"") return if("*New Rank*") new_rank = input("Please input a new rank", "New custom rank", null, null) as null|text - if(config.admin_legacy_system) + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) new_rank = ckeyEx(new_rank) if(!new_rank) to_chat(usr, SPAN_WARNING("Error: Topic 'editrights': Invalid rank")) return - if(config.admin_legacy_system) + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) if(admin_ranks.len) if(new_rank in admin_ranks) rights = admin_ranks[new_rank] //we typed a rank which already exists, use its rights else admin_ranks[new_rank] = 0 //add the new rank to admin_ranks else - if(config.admin_legacy_system) + if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) new_rank = ckeyEx(new_rank) rights = admin_ranks[new_rank] //we input an existing rank, use its rights @@ -418,7 +418,7 @@ to_chat(usr, "You do not have the appropriate permissions to add job bans!") return - if(check_rights(R_MOD,0) && !check_rights(R_ADMIN,0) && !config.mods_can_job_tempban) // If mod and tempban disabled + if(check_rights(R_MOD,0) && !check_rights(R_ADMIN,0) && !get_config_value(/decl/config/toggle/mods_can_job_tempban)) // If mod and tempban disabled to_chat(usr, "Mod jobbanning is disabled!") return @@ -464,14 +464,15 @@ if(!check_rights(R_MOD,0) && !check_rights(R_BAN, 0)) to_chat(usr, " You cannot issue temporary job-bans!") return - if(config.ban_legacy_system) + if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) to_chat(usr, "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.") return var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) return - if(check_rights(R_MOD, 0) && !check_rights(R_BAN, 0) && mins > config.mod_job_tempban_max) - to_chat(usr, " Moderators can only job tempban up to [config.mod_job_tempban_max] minutes!") + var/mod_job_tempban_max = get_config_value(/decl/config/num/mod_job_tempban_max) + if(check_rights(R_MOD, 0) && !check_rights(R_BAN, 0) && mins > mod_job_tempban_max) + to_chat(usr, " Moderators can only job tempban up to [mod_job_tempban_max] minutes!") return var/reason = sanitize(input(usr,"Reason?","Please State Reason","") as text|null) if(!reason) @@ -524,7 +525,7 @@ //Unbanning job list //all jobs in job list are banned already OR we didn't give a reason (implying they shouldn't be banned) if(LAZYLEN(SSjobs.titles_to_datums)) //at least 1 banned job exists in job list so we have stuff to unban. - if(!config.ban_legacy_system) + if(!get_config_value(/decl/config/toggle/on/ban_legacy_system)) to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel") DB_ban_panel(M.ckey) return @@ -584,7 +585,7 @@ to_chat(usr, "You do not have the appropriate permissions to add bans!") return - if(check_rights(R_MOD,0) && !check_rights(R_ADMIN, 0) && !config.mods_can_job_tempban) // If mod and tempban disabled + if(check_rights(R_MOD,0) && !check_rights(R_ADMIN, 0) && !get_config_value(/decl/config/toggle/mods_can_job_tempban)) // If mod and tempban disabled to_chat(usr, "Mod jobbanning is disabled!") return @@ -603,8 +604,9 @@ var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) return - if(check_rights(R_MOD, 0) && !check_rights(R_BAN, 0) && mins > config.mod_tempban_max) - to_chat(usr, "Moderators can only job tempban up to [config.mod_tempban_max] minutes!") + var/mod_tempban_max = get_config_value(/decl/config/num/mod_tempban_max) + if(check_rights(R_MOD, 0) && !check_rights(R_BAN, 0) && mins > mod_tempban_max) + to_chat(usr, "Moderators can only job tempban up to [mod_tempban_max] minutes!") return if(mins >= 525600) mins = 525599 var/reason = sanitize(input(usr,"Reason?","reason","Griefer") as text|null) @@ -624,8 +626,9 @@ SSstatistics.add_field("ban_tmp",1) DB_ban_record(BANTYPE_TEMP, M, mins, reason) SSstatistics.add_field("ban_tmp_mins",mins) - if(config.banappeals) - to_chat(M, "To try to resolve this matter head to [config.banappeals]") + var/banappeals = get_config_value(/decl/config/text/banappeals) + if(banappeals) + to_chat(M, "To try to resolve this matter head to [banappeals]") else to_chat(M, "No ban appeals URL has been set.") log_and_message_admins("has banned [mob_key].\nReason: [reason]\nThis will be removed in [mins_readable].") @@ -650,8 +653,9 @@ AddBan(mob_key, M.computer_id, reason, usr.ckey, 0, 0) to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].") to_chat(M, "This is a ban until appeal.") - if(config.banappeals) - to_chat(M, "To try to resolve this matter head to [config.banappeals]") + var/banappeals = get_config_value(/decl/config/text/banappeals) + if(banappeals) + to_chat(M, "To try to resolve this matter head to [banappeals]") else to_chat(M, "No ban appeals URL has been set.") ban_unban_log_save("[usr.client.ckey] has permabanned [mob_key]. - Reason: [reason] - This is a ban until appeal.") @@ -684,8 +688,9 @@ if(SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) var/dat = {"What mode do you wish to play?
    "} - for(var/mode in config.modes) - dat += {"[config.mode_names[mode]]
    "} + var/list/mode_names = get_config_value(/decl/config/lists/mode_names) + for(var/mode in get_config_value(/decl/config/lists/mode_allowed)) + dat += {"[mode_names[mode]]
    "} dat += {"Secret
    "} dat += {"Random
    "} dat += {"Now: [SSticker.master_mode]"} @@ -699,8 +704,9 @@ if(SSticker.master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) var/dat = {"What game mode do you want to force secret to be? Use this if you want to change the game mode, but want the players to believe it's secret. This will only work if the current game mode is secret.
    "} - for(var/mode in config.modes) - dat += {"[config.mode_names[mode]]
    "} + var/list/mode_names = get_config_value(/decl/config/lists/mode_names) + for(var/mode in get_config_value(/decl/config/lists/mode_allowed)) + dat += {"[mode_names[mode]]
    "} dat += {"Random (default)
    "} dat += {"Now: [secret_force_mode]"} show_browser(usr, dat, "window=f_secret") @@ -773,7 +779,7 @@ to_chat(usr, "This can only be used on instances of type /mob/living") return - if(config.allow_admin_rev) + if(get_config_value(/decl/config/toggle/on/admin_revive)) L.revive() log_and_message_admins("healed/revived [key_name(L)]") else @@ -992,10 +998,10 @@ if(prob(80)) T.break_tile_to_plating() else T.break_tile() - if(M.health == 1) + if(M.current_health == 1) M.gib() else - M.adjustBruteLoss( min( 99 , (M.health - 1) ) ) + M.adjustBruteLoss(min(99, M.current_health - 1)) SET_STATUS_MAX(M, STAT_STUN, 20) SET_STATUS_MAX(M, STAT_WEAK, 20) M.set_status(STAT_STUTTER, 20) @@ -1157,7 +1163,7 @@ else if(href_list["object_list"]) //this is the laggiest thing ever if(!check_rights(R_SPAWN)) return - if(!config.allow_admin_spawning) + if(!get_config_value(/decl/config/toggle/on/admin_spawning)) to_chat(usr, "Spawning of items is not allowed.") return diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index a44fae79380..f1f4d7130d9 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -11,7 +11,7 @@ set category = "Admin" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(!config.allow_admin_jump) + if(!get_config_value(/decl/config/toggle/on/admin_jump)) return alert("Admin jumping disabled") var/list/areas = area_repository.get_areas_by_z_level() @@ -25,7 +25,7 @@ set category = "Admin" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(!config.allow_admin_jump) + if(!get_config_value(/decl/config/toggle/on/admin_jump)) return alert("Admin jumping disabled") log_and_message_admins("jumped to [T.x],[T.y],[T.z] in [T.loc]") @@ -39,7 +39,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(config.allow_admin_jump) + if(get_config_value(/decl/config/toggle/on/admin_jump)) log_and_message_admins("jumped to [key_name(M)]") if(mob) var/turf/T = get_turf(M) @@ -58,7 +58,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(!config.allow_admin_jump) + if(!get_config_value(/decl/config/toggle/on/admin_jump)) alert("Admin jumping disabled") return if(!mob) @@ -82,7 +82,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(config.allow_admin_jump) + if(get_config_value(/decl/config/toggle/on/admin_jump)) if(!istype(C)) to_chat(usr, "[C] is not a client, somehow.") return @@ -100,7 +100,7 @@ set desc = "Mob to teleport" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(config.allow_admin_jump) + if(get_config_value(/decl/config/toggle/on/admin_jump)) log_and_message_admins("teleported [key_name(M)] to self.") M.jumpTo(get_turf(mob)) SSstatistics.add_field_details("admin_verb","GM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -115,7 +115,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(config.allow_admin_jump) + if(get_config_value(/decl/config/toggle/on/admin_jump)) var/list/keys = list() for(var/mob/M in global.player_list) keys += M.client @@ -138,7 +138,7 @@ set name = "Send Mob" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return - if(!config.allow_admin_jump) + if(!get_config_value(/decl/config/toggle/on/admin_jump)) alert("Admin jumping disabled") return diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index da9195800ca..9d9b1e0b6b1 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -109,8 +109,8 @@ to_chat(C, recieve_message) C.adminhelped = 0 - //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn - if(config.popup_admin_pm) + //AdminPM popup for ApocStation and anybody else who wants to use it. + if(get_config_value(/decl/config/toggle/popup_admin_pm)) spawn(0) //so we don't hold the caller proc up var/sender = src var/sendername = key diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index c53880292d5..af80595dccb 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -13,11 +13,11 @@ if(alert("The game will be over. Are you really sure?", "Confirmation" ,"Continue", "Cancel") == "Cancel") return var/parameter = input(src,"station_missed = ? (0 for hit, 1 for near miss, 2 for not close)","Enter Parameter",0) as num - var/datum/game_mode/override - var/name = input(src,"Override mode = ?","Enter Parameter",null) as null|anything in gamemode_cache - override = gamemode_cache[name] - if(!istype(override)) - override = null - global.cinematic.station_explosion_cinematic(parameter,override) + var/list/gamemodes = list() + var/list/all_modes = decls_repository.get_decls_of_subtype(/decl/game_mode) + for(var/mode_type in all_modes) + gamemodes += all_modes[mode_type] + var/decl/game_mode/override = input(src,"Override mode = ?","Enter Parameter",null) as null|anything in gamemodes + global.cinematic.station_explosion_cinematic(parameter, override) log_and_message_admins("launched cinematic \"[cinematic]\"", src) \ No newline at end of file diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index dc7b8e732a0..4574117732c 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -7,11 +7,11 @@ to_chat(src, "Only administrators may use this command.") return - var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_BOOK_MESSAGE_LEN, extra = 0) + var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", global.custom_event_msg) as message|null, MAX_BOOK_MESSAGE_LEN, extra = 0) if(isnull(input)) return if(input == "") - custom_event_msg = null + global.custom_event_msg = null log_admin("[usr.key] has cleared the custom event text.") message_admins("[key_name_admin(usr)] has cleared the custom event text.") return @@ -19,26 +19,26 @@ log_admin("[usr.key] has changed the custom event text.") message_admins("[key_name_admin(usr)] has changed the custom event text.") - custom_event_msg = input + global.custom_event_msg = input to_world("

    Custom Event

    ") to_world("

    A custom event is starting. OOC Info:

    ") - to_world("[custom_event_msg]") + to_world("[global.custom_event_msg]") to_world("
    ") - SSwebhooks.send(WEBHOOK_CUSTOM_EVENT, list("text" = custom_event_msg)) + SSwebhooks.send(WEBHOOK_CUSTOM_EVENT, list("text" = global.custom_event_msg)) // normal verb for players to view info /client/verb/cmd_view_custom_event() set category = "OOC" set name = "Custom Event Info" - if(!custom_event_msg || custom_event_msg == "") + if(!global.custom_event_msg) to_chat(src, "There currently is no known custom event taking place.") to_chat(src, "Keep in mind: it is possible that an admin has not properly set this.") return to_chat(src, "

    Custom Event

    ") to_chat(src, "

    A custom event is taking place. OOC Info:

    ") - to_chat(src, "[custom_event_msg]") + to_chat(src, "[global.custom_event_msg]") to_chat(src, "
    ") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 775343d05d2..80fb84e1909 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -128,10 +128,13 @@ /client/proc/cmd_debug_tog_aliens() set category = "Server" set name = "Toggle Aliens" + if(toggle_config_value(/decl/config/toggle/aliens_allowed)) + log_admin("[key_name(src)] has turned aliens on.") + message_admins("[key_name_admin(src)] has turned aliens on.", 0) + else + log_admin("[key_name(src)] has turned aliens off.") + message_admins("[key_name_admin(src)] has turned aliens off.", 0) - config.aliens_allowed = !config.aliens_allowed - log_admin("[key_name(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].") - message_admins("[key_name_admin(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].", 0) SSstatistics.add_field_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_grantfullaccess(var/mob/M in SSmobs.mob_list) @@ -287,7 +290,7 @@ if(!outfit) return - var/reset_equipment = (outfit.flags&OUTFIT_RESET_EQUIPMENT) + var/reset_equipment = (outfit.outfit_flags & OUTFIT_RESET_EQUIPMENT) if(!reset_equipment) reset_equipment = alert("Do you wish to delete all current equipment first?", "Delete Equipment?","Yes", "No") == "Yes" @@ -299,7 +302,7 @@ return if(undress) H.delete_inventory(TRUE) - outfit.equip(H) + outfit.equip_outfit(H) log_and_message_admins("changed the equipment of [key_name(H)] to [outfit.name].") /client/proc/startSinglo() diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index cccbc4dfd41..603633ae184 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -3,7 +3,7 @@ set category = "Object" if(istype(O,/obj/effect/singularity)) - if(config.forbid_singulo_possession) + if(get_config_value(/decl/config/toggle/forbid_singulo_possession)) to_chat(usr, "It is forbidden to possess singularities.") return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1af63b2da66..2f98125100b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -83,7 +83,7 @@ return if (style == "unsafe") - if (!config.allow_unsafe_narrates) + if (!get_config_value(/decl/config/toggle/allow_unsafe_narrates)) to_chat(user, SPAN_WARNING("Unsafe narrates are not permitted by the server configuration.")) return @@ -291,8 +291,7 @@ Allow admins to set players to be able to respawn/bypass 30 min wait, without the admin having to edit variables directly Ccomp's first proc. */ - -/client/proc/get_ghosts(var/notify = 0,var/what = 2) +/proc/get_ghosts(var/notify, var/what = 2) // what = 1, return ghosts ass list. // what = 2, return mob list @@ -305,16 +304,14 @@ Ccomp's first proc. any = 1 //if no ghosts show up, any will just be 0 if(!any) if(notify) - to_chat(src, "There doesn't appear to be any ghosts for you to select.") + to_chat(notify, "There doesn't appear to be any ghosts for you to select.") return - for(var/mob/M in mobs) var/name = M.name ghosts[name] = M //get the name of the mob for the popup list - if(what==1) + if(what == 1) return ghosts - else - return mobs + return mobs /client/proc/get_ghosts_by_key() . = list() @@ -336,7 +333,7 @@ Ccomp's first proc. to_chat(src, "[selection] no longer has an associated ghost.") return - if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + if(G.has_enabled_antagHUD == 1 && get_config_value(/decl/config/toggle/antag_hud_restricted)) var/response = alert(src, "[selection] has enabled antagHUD. Are you sure you wish to allow them to respawn?","Ghost has used AntagHUD","No","Yes") if(response == "No") return else @@ -351,7 +348,7 @@ Ccomp's first proc. G.can_reenter_corpse = CORPSE_CAN_REENTER_AND_RESPAWN G.show_message("You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead.", 1) - log_and_message_admins("has allowed [key_name(G)] to bypass the [config.respawn_delay] minute respawn limit.") + log_and_message_admins("has allowed [key_name(G)] to bypass the [get_config_value(/decl/config/num/respawn_delay)] minute respawn limit.") /client/proc/toggle_antagHUD_use() set category = "Server" @@ -360,34 +357,13 @@ Ccomp's first proc. if(!holder) to_chat(src, "Only administrators may use this command.") - var/action="" - if(config.antag_hud_allowed) - for(var/mob/observer/ghost/g in get_ghosts()) - if(!g.client.holder) //Remove the verb from non-admin ghosts - g.verbs -= /mob/observer/ghost/verb/toggle_antagHUD - if(g.antagHUD) - g.antagHUD = 0 // Disable it on those that have it enabled - g.has_enabled_antagHUD = 2 // We'll allow them to respawn - to_chat(g, "The Administrator has disabled AntagHUD") - config.antag_hud_allowed = 0 - to_chat(src, "AntagHUD usage has been disabled") - action = "disabled" - else - for(var/mob/observer/ghost/g in get_ghosts()) - if(!g.client.holder) // Add the verb back for all non-admin ghosts - g.verbs += /mob/observer/ghost/verb/toggle_antagHUD - to_chat(g, "The Administrator has enabled AntagHUD ")// Notify all observers they can now use AntagHUD - - config.antag_hud_allowed = 1 + var/action = "disabled" + if(toggle_config_value(/decl/config/toggle/antag_hud_allowed)) action = "enabled" - to_chat(src, "AntagHUD usage has been enabled") - - + to_chat(src, "AntagHUD usage has been [action]") log_admin("[key_name(usr)] has [action] antagHUD usage for observers") message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1) - - /client/proc/toggle_antagHUD_restrictions() set category = "Server" set name = "Toggle antagHUD Restrictions" @@ -395,22 +371,19 @@ Ccomp's first proc. if(!holder) to_chat(src, "Only administrators may use this command.") var/action="" - if(config.antag_hud_restricted) - for(var/mob/observer/ghost/g in get_ghosts()) - to_chat(g, "The administrator has lifted restrictions on joining the round if you use AntagHUD") - action = "lifted restrictions" - config.antag_hud_restricted = 0 - to_chat(src, "AntagHUD restrictions have been lifted") - else - for(var/mob/observer/ghost/g in get_ghosts()) + if(toggle_config_value(/decl/config/toggle/antag_hud_restricted)) + for(var/mob/observer/ghost/g in get_ghosts(src)) to_chat(g, "The administrator has placed restrictions on joining the round if you use AntagHUD") to_chat(g, "Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions") g.antagHUD = 0 g.has_enabled_antagHUD = 0 action = "placed restrictions" - config.antag_hud_restricted = 1 to_chat(src, "AntagHUD restrictions have been enabled") - + else + for(var/mob/observer/ghost/g in get_ghosts(src)) + to_chat(g, "The administrator has lifted restrictions on joining the round if you use AntagHUD") + action = "lifted restrictions" + to_chat(src, "AntagHUD restrictions have been lifted") log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) @@ -440,8 +413,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, SPAN_WARNING("There is no active key like that in the game or the person is not currently a ghost.")) return - var/mob/living/carbon/human/new_character = new(pick(global.latejoin_locations))//The mob being spawned. - + var/mob/living/carbon/human/new_character = new(get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) //The mob being spawned. var/datum/computer_file/report/crew_record/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) record_found = get_crewmember_record(G_found.real_name) @@ -488,12 +460,12 @@ Traitors and the like can also be revived with the previous role mostly intact. var/player_key = G_found.key //Now for special roles and equipment. - var/decl/special_role/antag_data = ispath(new_character.mind.assigned_special_role, /decl/special_role) && GET_DECL(new_character.mind.assigned_special_role) - if(antag_data) + var/decl/special_role/antag_data = GET_DECL(new_character.mind.assigned_special_role) + if(istype(antag_data)) antag_data.add_antagonist(new_character.mind) antag_data.place_mob(new_character) else - SSjobs.equip_rank(new_character, new_character.mind.assigned_role, 1) + SSjobs.equip_job_title(new_character, new_character.mind.assigned_role, 1) //Announces the character on all the systems, based on the record. if(!issilicon(new_character))//If they are not a cyborg/AI. @@ -546,7 +518,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!istype(M)) alert("Cannot revive a ghost") return - if(config.allow_admin_rev) + if(get_config_value(/decl/config/toggle/on/admin_revive)) M.revive() log_and_message_admins("healed / revived [key_name_admin(M)]!") @@ -829,12 +801,11 @@ Traitors and the like can also be revived with the previous role mostly intact. set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off" if(!check_rights(R_SERVER)) return - if(!config.allow_random_events) - config.allow_random_events = 1 + toggle_config_value(/decl/config/toggle/allow_random_events) + if(get_config_value(/decl/config/toggle/allow_random_events)) to_chat(usr, "Random events enabled") message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1) else - config.allow_random_events = 0 to_chat(usr, "Random events disabled") message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1) SSstatistics.add_field_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index b2a1ebfc8ef..8e3350b0407 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -142,9 +142,6 @@ /datum/proc/VV_secluded() return list() -/datum/configuration/VV_secluded() - return vars - // The following vars cannot be edited by anyone /datum/proc/VV_static() return list("parent_type", "gc_destroyed", "is_processing") @@ -191,7 +188,7 @@ if(!(var_to_edit in VV_get_variables())) to_chat(user, "\The [src] does not have a var '[var_to_edit]'") return FALSE - if(var_to_edit in VV_static()) + if((var_to_edit in VV_static()) || (var_to_edit in VV_hidden())) return FALSE if((var_to_edit in VV_secluded()) && !check_rights(R_ADMIN|R_DEBUG, FALSE, C = user)) return FALSE diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 06a60dee9c5..9b7f36146fb 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -564,7 +564,7 @@ if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") return - H.refresh_visible_overlays() + H.try_refresh_visible_overlays() else if(href_list["adjustDamage"] && href_list["mobToDamage"]) if(!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return diff --git a/code/modules/aspects/aspects.dm b/code/modules/aspects/aspects.dm index be9036b2e73..64621e2726d 100644 --- a/code/modules/aspects/aspects.dm +++ b/code/modules/aspects/aspects.dm @@ -103,7 +103,7 @@ var/global/list/aspect_categories = list() // Containers for ease of printing da incompatible_aspect_taken = TRUE break - if(istype(caller) && (ticked || caller.get_aspect_total() + aspect_cost <= config.max_character_aspects) && !incompatible_aspect_taken) + if(istype(caller) && (ticked || caller.get_aspect_total() + aspect_cost <= get_config_value(/decl/config/num/max_character_aspects)) && !incompatible_aspect_taken) result += "[ticked ? "[name]" : "[name]"] ([aspect_cost])" else result += ticked ? "[name]" : "[name]" @@ -130,7 +130,7 @@ var/global/list/aspect_categories = list() // Containers for ease of printing da for(var/decl/aspect/A as anything in personal_aspects) aspect_cost += A.aspect_cost - var/dat = list("[aspect_cost]/[config.max_character_aspects] points spent.") + var/dat = list("[aspect_cost]/[get_config_value(/decl/config/num/max_character_aspects)] points spent.") for(var/aspect_category in global.aspect_categories) var/datum/aspect_category/AC = global.aspect_categories[aspect_category] if(!istype(AC)) diff --git a/code/modules/aspects/aspects_prosthetic_limbs.dm b/code/modules/aspects/aspects_prosthetic_limbs.dm index 5afcf6978c6..40c97f9b2c4 100644 --- a/code/modules/aspects/aspects_prosthetic_limbs.dm +++ b/code/modules/aspects/aspects_prosthetic_limbs.dm @@ -5,6 +5,8 @@ sort_value = 2 aspect_flags = ASPECTS_PHYSICAL abstract_type = /decl/aspect/prosthetic_limb + var/fullbody_synthetic_only = FALSE + var/replace_children = TRUE var/check_bodytype var/bodypart_name var/apply_to_limb = BP_L_HAND @@ -63,6 +65,10 @@ /decl/aspect/prosthetic_limb/is_available_to(datum/preferences/pref) . = ..() if(.) + if(fullbody_synthetic_only) + var/decl/bodytype/bodytype = pref.get_bodytype_decl() + if(!bodytype?.is_robotic) + return FALSE if(model) var/decl/bodytype/prosthetic/R = GET_DECL(model) if(!istype(R)) @@ -89,15 +95,19 @@ // Robotize the selected limb. if(. && apply_to_limb) + var/use_model = model || get_base_model(holder.get_species_name()) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(holder, apply_to_limb) if(!istype(E)) - var/list/organ_data = holder.get_bodytype().has_limbs[apply_to_limb] + var/list/organ_data = holder.should_have_limb(apply_to_limb) var/limb_path = organ_data["path"] if("path" in organ_data) - E = new limb_path(holder, null, model || get_base_model(holder.get_species_name())) + E = new limb_path(holder, null, use_model) if(istype(E) && E.bodytype != model) // sometimes in the last line we save ourselves some work here // this should be pre-validated by is_available_to() - E.set_bodytype_with_children(model || get_base_model(holder.get_species_name())) + if(replace_children) + E.set_bodytype_with_children(use_model) + else + E.set_bodytype(use_model) /decl/aspect/prosthetic_limb/left_hand bodypart_name = "Left Hand" @@ -142,3 +152,27 @@ aspect_cost = 2 apply_to_limb = BP_R_LEG incompatible_with_limbs = list(BP_R_FOOT, BP_R_LEG) + +/decl/aspect/prosthetic_limb/head + bodypart_name = "Head" + aspect_cost = 1 + apply_to_limb = BP_HEAD + incompatible_with_limbs = list(BP_HEAD) + fullbody_synthetic_only = TRUE + replace_children = FALSE + +/decl/aspect/prosthetic_limb/chest + bodypart_name = "Upper Body" + aspect_cost = 1 + apply_to_limb = BP_CHEST + incompatible_with_limbs = list(BP_CHEST) + fullbody_synthetic_only = TRUE + replace_children = FALSE + +/decl/aspect/prosthetic_limb/groin + bodypart_name = "Lower Body" + aspect_cost = 1 + apply_to_limb = BP_GROIN + incompatible_with_limbs = list(BP_GROIN) + fullbody_synthetic_only = TRUE + replace_children = FALSE diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index eea98925985..0a91771b32c 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -9,7 +9,7 @@ throwforce = 2 throw_speed = 3 throw_range = 10 - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' var/secured = 1 var/list/attached_overlays = null diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 632e1de00e4..42b0d147459 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -108,7 +108,6 @@ if(special_assembly) special_assembly.Crossed(AM) - /obj/item/assembly_holder/on_found(mob/finder as mob) if(a_left) a_left.on_found(finder) diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index ba7055647f9..f692cd70b9d 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -2,7 +2,7 @@ name = "igniter" desc = "A small electronic device able to ignite combustible substances." icon_state = "igniter" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index d54d203d973..c472eacbe06 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -10,7 +10,7 @@ name = "infrared emitter" desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." icon_state = "infrared" - origin_tech = "{'magnets':2}" + origin_tech = @'{"magnets":2}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, @@ -30,7 +30,7 @@ . = ..() beams = list() seen_turfs = list() - proximity_trigger = new(src, /obj/item/assembly/infra/proc/on_beam_entered, /obj/item/assembly/infra/proc/on_visibility_change, world.view, proximity_flags = PROXIMITY_EXCLUDE_HOLDER_TURF) + proximity_trigger = new(src, TYPE_PROC_REF(/obj/item/assembly/infra, on_beam_entered), TYPE_PROC_REF(/obj/item/assembly/infra, on_visibility_change), world.view, proximity_flags = PROXIMITY_EXCLUDE_HOLDER_TURF) /obj/item/assembly/infra/Destroy() qdel(proximity_trigger) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 6864cec8b70..dca5cfcd0a3 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -2,8 +2,8 @@ name = "rat trap" desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" - origin_tech = "{'combat':1}" - material = /decl/material/solid/wood + origin_tech = @'{"combat":1}' + material = /decl/material/solid/organic/wood matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) var/armed = 0 @@ -42,7 +42,7 @@ SET_STATUS_MAX(H, STAT_STUN, 3) if(affecting) affecting.take_external_damage(1, 0) - H.updatehealth() + else if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target visible_message("SPLAT!") @@ -74,17 +74,16 @@ . = toggle_arming(user) || ..() /obj/item/assembly/mousetrap/Crossed(atom/movable/AM) - if(armed) - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(!MOVING_DELIBERATELY(H)) - triggered(H) - H.visible_message("[H] accidentally steps on [src].", \ - "You accidentally step on [src]") - if(ismouse(AM)) - triggered(AM) ..() - + if(!armed || !isliving(AM)) + return + var/mob/living/M = AM + if(MOVING_DELIBERATELY(M)) + return + M.visible_message( + SPAN_DANGER("\The [M] steps on \the [src]!"), + SPAN_DANGER("You step on \the [src]!")) + triggered(M) /obj/item/assembly/mousetrap/on_found(mob/finder) if(armed) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 8eb8469b3eb..0436515fc73 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -2,7 +2,7 @@ name = "proximity sensor" desc = "Used for scanning and alerting when someone enters a certain proximity." icon_state = "prox" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, @@ -78,7 +78,7 @@ /obj/item/assembly/prox_sensor/dropped() . = ..() - addtimer(CALLBACK(src, .proc/sense), 0) + addtimer(CALLBACK(src, PROC_REF(sense)), 0) /obj/item/assembly/prox_sensor/toggle_scan() if(!secured) return 0 diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index ea40cc935ff..6a40a7f3b1c 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -3,7 +3,7 @@ desc = "Used to remotely activate devices." icon_state = "signaller" item_state = "signaler" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index b5fec4b4cc4..9c4fee0d1fc 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -2,7 +2,7 @@ name = "timer" desc = "Used to time things. Works well with contraptions which have to count down. Tick tock." icon_state = "timer" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 20dc2332956..a291267414c 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -2,7 +2,7 @@ name = "voice analyzer" desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." icon_state = "voice" - origin_tech = "{'magnets':1}" + origin_tech = @'{"magnets":1}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/atmospherics/atmospherics.dm b/code/modules/atmospherics/atmospherics.dm index 8434df0ddcb..4c56d36ff30 100644 --- a/code/modules/atmospherics/atmospherics.dm +++ b/code/modules/atmospherics/atmospherics.dm @@ -79,7 +79,7 @@ Pipelines + Other Objects -> Pipe network return nodes_to_networks[node] /obj/machinery/atmospherics/hide(var/do_hide) - if(do_hide && level == 1) + if(do_hide && level == LEVEL_BELOW_PLATING) layer = PIPE_LAYER else reset_plane_and_layer() @@ -87,7 +87,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type, var/default_state = "exposed") var/state = default_state if(node) - if(!T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node.level == LEVEL_BELOW_PLATING && istype(node, /obj/machinery/atmospherics/pipe)) state = "down" else state = "intact" @@ -107,7 +107,7 @@ Pipelines + Other Objects -> Pipe network for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) var/node_dir = get_dir(src, node) disconnected_directions &= ~node_dir - if(hide_hidden_pipes && !T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(hide_hidden_pipes && !T.is_plating() && node.level == LEVEL_BELOW_PLATING && istype(node, /obj/machinery/atmospherics/pipe)) continue else add_underlay(T, node, node_dir, node.icon_connect_type) @@ -237,7 +237,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/proc/set_initial_level() var/turf/T = get_turf(src) if(T) - level = (!T.is_plating() ? 2 : 1) + level = (T.is_plating() ? LEVEL_BELOW_PLATING : LEVEL_ABOVE_PLATING) /obj/machinery/atmospherics/proc/deconstruction_pressure_check() return TRUE diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index e850fa4d63e..ec6e5526b77 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -5,7 +5,7 @@ /obj/machinery/atmospherics/binary/passive_gate icon = 'icons/atmos/passive_gate.dmi' icon_state = "map_off" - level = 1 + level = LEVEL_BELOW_PLATING name = "pressure regulator" desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power." diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index 7fe22f17712..6867e4c8a74 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -15,7 +15,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump icon = 'icons/atmos/pump.dmi' icon_state = "map_off" - level = 1 + level = LEVEL_BELOW_PLATING name = "gas pump" desc = "A pump." diff --git a/code/modules/atmospherics/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/components/binary_devices/volume_pump.dm index 3119c68889d..88dfdd3675e 100644 --- a/code/modules/atmospherics/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/components/binary_devices/volume_pump.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/binary/pump/high_power icon = 'icons/atmos/volume_pump.dmi' icon_state = "map_off" - level = 1 + level = LEVEL_BELOW_PLATING name = "high power gas pump" desc = "A pump. Has double the power rating of the standard gas pump." diff --git a/code/modules/atmospherics/components/omni_devices/omni_base.dm b/code/modules/atmospherics/components/omni_devices/omni_base.dm index 651e37e5812..c280b0fe1c9 100644 --- a/code/modules/atmospherics/components/omni_devices/omni_base.dm +++ b/code/modules/atmospherics/components/omni_devices/omni_base.dm @@ -6,7 +6,7 @@ icon = 'icons/atmos/omni_devices.dmi' icon_state = "base" initialize_directions = 0 - level = 1 + level = LEVEL_BELOW_PLATING var/core_icon var/configuring = 0 @@ -213,7 +213,7 @@ if(!istype(T)) return var/obj/machinery/atmospherics/node = LAZYACCESS(P.nodes, 1) - if(!T.is_plating() && istype(node, /obj/machinery/atmospherics/pipe) && node.level == 1 ) + if(!T.is_plating() && istype(node, /obj/machinery/atmospherics/pipe) && node.level == LEVEL_BELOW_PLATING) pipe_state_key = "down" else pipe_state_key = "intact" diff --git a/code/modules/atmospherics/components/portables_connector.dm b/code/modules/atmospherics/components/portables_connector.dm index 714781b1ba1..d0260640403 100644 --- a/code/modules/atmospherics/components/portables_connector.dm +++ b/code/modules/atmospherics/components/portables_connector.dm @@ -17,7 +17,7 @@ frame_type = /obj/item/pipe construct_state = /decl/machine_construction/pipe - level = 1 + level = LEVEL_BELOW_PLATING connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_FUEL build_icon_state = "connector" diff --git a/code/modules/atmospherics/components/shutoff.dm b/code/modules/atmospherics/components/shutoff.dm index 867066b9224..4cefcb52bc4 100644 --- a/code/modules/atmospherics/components/shutoff.dm +++ b/code/modules/atmospherics/components/shutoff.dm @@ -7,7 +7,7 @@ var/global/list/shutoff_valves = list() name = "automatic shutoff valve" desc = "An automatic valve with control circuitry and pipe integrity sensor, capable of automatically isolating damaged segments of the pipe network." var/close_on_leaks = TRUE // If false it will be always open - level = 1 + level = LEVEL_BELOW_PLATING connect_types = CONNECT_TYPE_SCRUBBER | CONNECT_TYPE_SUPPLY | CONNECT_TYPE_REGULAR | CONNECT_TYPE_FUEL build_icon_state = "svalve" base_type = /obj/machinery/atmospherics/valve/shutoff/buildable @@ -41,9 +41,9 @@ var/global/list/shutoff_valves = list() /obj/machinery/atmospherics/valve/shutoff/hide(var/do_hide) if(do_hide) - if(level == 1) + if(level == LEVEL_BELOW_PLATING) layer = PIPE_LAYER - else if(level == 2) + else if(level == LEVEL_ABOVE_PLATING) ..() else reset_plane_and_layer() diff --git a/code/modules/atmospherics/components/tvalve.dm b/code/modules/atmospherics/components/tvalve.dm index 386fceab351..8f9ab481aba 100644 --- a/code/modules/atmospherics/components/tvalve.dm +++ b/code/modules/atmospherics/components/tvalve.dm @@ -6,7 +6,7 @@ name = "manual switching valve" desc = "A pipe valve." - level = 1 + level = LEVEL_BELOW_PLATING dir = SOUTH initialize_directions = SOUTH|NORTH|WEST diff --git a/code/modules/atmospherics/components/unary/heat_exchanger.dm b/code/modules/atmospherics/components/unary/heat_exchanger.dm index 08f92fdeb07..30849bc53b9 100644 --- a/code/modules/atmospherics/components/unary/heat_exchanger.dm +++ b/code/modules/atmospherics/components/unary/heat_exchanger.dm @@ -86,6 +86,6 @@ /obj/machinery/atmospherics/unary/heat_exchanger/cannot_transition_to(state_path, mob/user) if(state_path == /decl/machine_construction/default/deconstructed) var/turf/T = get_turf(src) - if (level==1 && isturf(T) && !T.is_plating()) + if (level == LEVEL_BELOW_PLATING && isturf(T) && !T.is_plating()) return SPAN_WARNING("You must remove the plating first.") return ..() \ No newline at end of file diff --git a/code/modules/atmospherics/components/unary/outlet_injector.dm b/code/modules/atmospherics/components/unary/outlet_injector.dm index 0040030b370..9aa2f389619 100644 --- a/code/modules/atmospherics/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/components/unary/outlet_injector.dm @@ -17,7 +17,7 @@ var/volume_rate = 50 //flow rate limit - level = 1 + level = LEVEL_BELOW_PLATING connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_FUEL diff --git a/code/modules/atmospherics/components/unary/tank.dm b/code/modules/atmospherics/components/unary/tank.dm index 84badc5dfad..29968bd9445 100644 --- a/code/modules/atmospherics/components/unary/tank.dm +++ b/code/modules/atmospherics/components/unary/tank.dm @@ -9,7 +9,7 @@ var/start_pressure = 25 ATM var/filling // list of gas ratios to use. - level = 1 + level = LEVEL_BELOW_PLATING dir = SOUTH initialize_directions = 2 density = TRUE @@ -37,7 +37,9 @@ update_icon() /obj/machinery/atmospherics/unary/tank/set_initial_level() - level = 1 // Always on top, apparently. + // This effectively does nothing, it's ignored due to hide() being overwritten + // and probably needs to be reworked. + level = LEVEL_BELOW_PLATING /obj/machinery/atmospherics/unary/tank/on_update_icon() build_device_underlays(FALSE) @@ -92,7 +94,7 @@ connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_REGULAR|CONNECT_TYPE_SCRUBBER|CONNECT_TYPE_FUEL w_class = ITEM_SIZE_STRUCTURE density = TRUE - level = 1 + level = LEVEL_BELOW_PLATING dir = SOUTH constructed_path = /obj/machinery/atmospherics/unary/tank pipe_class = PIPE_CLASS_UNARY \ No newline at end of file diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index c22fd2b3d2b..4f9a74967c0 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -18,7 +18,7 @@ power_rating = 30000 // 30000 W ~ 40 HP connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_FUEL //connects to regular, supply pipes, and fuel pipes - level = 1 + level = LEVEL_BELOW_PLATING identifier = "AVP" var/hibernate = 0 //Do we even process? @@ -83,7 +83,7 @@ var/area/A = get_area(src) if(A && !A.air_vent_names[id_tag]) update_name() - events_repository.register(/decl/observ/name_set, A, src, .proc/change_area_name) + events_repository.register(/decl/observ/name_set, A, src, PROC_REF(change_area_name)) . = ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP update_sound() @@ -148,11 +148,11 @@ if(old_area == new_area) return if(old_area) - events_repository.unregister(/decl/observ/name_set, old_area, src, .proc/change_area_name) + events_repository.unregister(/decl/observ/name_set, old_area, src, PROC_REF(change_area_name)) old_area.air_vent_info -= id_tag old_area.air_vent_names -= id_tag if(new_area && new_area == get_area(src)) - events_repository.register(/decl/observ/name_set, new_area, src, .proc/change_area_name) + events_repository.register(/decl/observ/name_set, new_area, src, PROC_REF(change_area_name)) if(!new_area.air_vent_names[id_tag]) var/new_name = "[new_area.proper_name] Vent Pump #[new_area.air_vent_names.len+1]" new_area.air_vent_names[id_tag] = new_name @@ -222,10 +222,7 @@ power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) else //external -> internal var/datum/pipe_network/network = network_in_dir(dir) - transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, network?.volume) - - //limit flow rate from turfs - transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here + transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, network?.volume) / environment.group_multiplier // limit it to just one turf's worth of gas per tick power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) else @@ -338,7 +335,7 @@ var/turf/T = src.loc var/hidden_pipe_check = FALSE for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) - if(node.level) + if(node.level == LEVEL_BELOW_PLATING) hidden_pipe_check = TRUE break if (hidden_pipe_check && isturf(T) && !T.is_plating()) diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index 1c58fa3a756..ce64f9b0458 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -11,7 +11,7 @@ connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SCRUBBER //connects to regular and scrubber pipes identifier = "AScr" - level = 1 + level = LEVEL_BELOW_PLATING var/hibernate = 0 //Do we even process? var/scrubbing = SCRUBBER_EXCHANGE @@ -77,11 +77,11 @@ if(old_area == new_area) return if(old_area) - events_repository.unregister(/decl/observ/name_set, old_area, src, .proc/change_area_name) + events_repository.unregister(/decl/observ/name_set, old_area, src, PROC_REF(change_area_name)) old_area.air_scrub_info -= id_tag old_area.air_scrub_names -= id_tag if(new_area && new_area == get_area(src)) - events_repository.register(/decl/observ/name_set, new_area, src, .proc/change_area_name) + events_repository.register(/decl/observ/name_set, new_area, src, PROC_REF(change_area_name)) if(!new_area.air_scrub_names[id_tag]) var/new_name = "[new_area.proper_name] Vent Scrubber #[new_area.air_scrub_names.len+1]" new_area.air_scrub_names[id_tag] = new_name @@ -93,10 +93,10 @@ icon_state = "weld" else if((stat & NOPOWER) || !use_power) icon_state = "off" - else if(scrubbing == SCRUBBER_EXCHANGE) - icon_state = "on" - else + else if(scrubbing == SCRUBBER_SIPHON) icon_state = "in" + else + icon_state = "on" build_device_underlays() @@ -193,7 +193,7 @@ var/turf/T = get_turf(src) var/hidden_pipe_check = FALSE for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) - if(node.level) + if(node.level == LEVEL_BELOW_PLATING) hidden_pipe_check = TRUE break if (hidden_pipe_check && isturf(T) && !T.is_plating()) diff --git a/code/modules/atmospherics/components/valve.dm b/code/modules/atmospherics/components/valve.dm index 75f182bd1d4..72dcf25b096 100644 --- a/code/modules/atmospherics/components/valve.dm +++ b/code/modules/atmospherics/components/valve.dm @@ -5,7 +5,7 @@ name = "manual valve" desc = "A pipe valve." - level = 1 + level = LEVEL_BELOW_PLATING dir = SOUTH initialize_directions = SOUTH|NORTH diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index f0edba20253..cedb053c260 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -3,7 +3,7 @@ icon = 'icons/atmos/heat.dmi' icon_state = "11" color = "#404040" - level = 2 + level = LEVEL_ABOVE_PLATING connect_types = CONNECT_TYPE_HE interact_offline = TRUE //Needs to be set so that pipes don't say they lack power in their description var/initialize_directions_he @@ -28,8 +28,8 @@ add_filter("glow",1, list(type="drop_shadow", x = 0, y = 0, offset = 0, size = 4)) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_dir(new_dir) - ..() - initialize_directions_he = initialize_directions // all directions are HE + . = ..() + initialize_directions_he = get_initialize_directions() // all directions are HE /obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmos_init() atmos_initalized = TRUE @@ -79,7 +79,7 @@ var/mob/living/carbon/human/H = buckled_mob if(istype(H) && H.species) - heat_limit = H.get_temperature_threshold(HEAT_LEVEL_3) + heat_limit = H.get_mob_temperature_threshold(HEAT_LEVEL_3) if(pipe_air.temperature > heat_limit + 1) buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_CHEST, used_weapon = "Excessive Heat") @@ -111,7 +111,7 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction icon = 'icons/atmos/junction.dmi' icon_state = "11" - level = 2 + level = LEVEL_ABOVE_PLATING connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_HE|CONNECT_TYPE_FUEL build_icon_state = "junction" rotate_class = PIPE_ROTATE_STANDARD diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index 6919ff57054..ba5d7385546 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -14,7 +14,7 @@ build_icon_state = "simple" build_icon = 'icons/obj/pipe-item.dmi' pipe_class = PIPE_CLASS_BINARY - atom_flags = ATOM_FLAG_CAN_BE_PAINTED | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_CAN_BE_PAINTED | ATOM_FLAG_NO_CHEM_CHANGE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED frame_type = /obj/item/pipe @@ -37,12 +37,12 @@ /obj/machinery/atmospherics/pipe/Initialize() if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/simulated/shuttle/wall) || istype(get_turf(src), /turf/unsimulated/wall)) - level = 1 + level = LEVEL_BELOW_PLATING alpha = 255 // for mapping hidden pipes . = ..() /obj/machinery/atmospherics/pipe/hides_under_flooring() - return level != 2 + return level == LEVEL_BELOW_PLATING /obj/machinery/atmospherics/pipe/proc/set_leaking(var/new_leaking) if(new_leaking && !leaking) @@ -81,7 +81,7 @@ qdel(parent) ..() var/turf/T = loc - if(level == 1 && isturf(T) && !T.is_plating()) + if(level == LEVEL_BELOW_PLATING && isturf(T) && !T.is_plating()) hide(1) /obj/machinery/atmospherics/pipe/return_air() @@ -137,7 +137,7 @@ /obj/machinery/atmospherics/pipe/cannot_transition_to(state_path, mob/user) if(state_path == /decl/machine_construction/default/deconstructed) var/turf/T = get_turf(src) - if (level==1 && isturf(T) && !T.is_plating()) + if (level == LEVEL_BELOW_PLATING && isturf(T) && !T.is_plating()) return SPAN_WARNING("You must remove the plating first.") return ..() @@ -221,7 +221,7 @@ dir = SOUTH initialize_directions = SOUTH|NORTH - level = 1 + level = LEVEL_BELOW_PLATING rotate_class = PIPE_ROTATE_TWODIR connect_dir_type = SOUTH | NORTH // Overridden if dir is not a cardinal for bent pipes. For straight pipes this is correct. @@ -272,7 +272,7 @@ try_leak() /obj/machinery/atmospherics/pipe/simple/visible - level = 2 + level = LEVEL_ABOVE_PLATING /obj/machinery/atmospherics/pipe/simple/visible/scrubbers name = "scrubbers pipe" @@ -319,7 +319,7 @@ connect_types = CONNECT_TYPE_FUEL /obj/machinery/atmospherics/pipe/simple/hidden - level = 1 + level = LEVEL_BELOW_PLATING alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers @@ -377,7 +377,7 @@ initialize_directions = EAST|NORTH|WEST build_icon_state = "manifold" - level = 1 + level = LEVEL_BELOW_PLATING pipe_class = PIPE_CLASS_TRINARY connect_dir_type = NORTH | EAST | WEST @@ -404,7 +404,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible icon_state = "map" - level = 2 + level = LEVEL_ABOVE_PLATING /obj/machinery/atmospherics/pipe/manifold/visible/scrubbers name="Scrubbers pipe manifold" @@ -450,7 +450,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden icon_state = "map" - level = 1 + level = LEVEL_BELOW_PLATING alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers @@ -506,7 +506,7 @@ initialize_directions = NORTH|SOUTH|EAST|WEST build_icon_state = "manifold4w" - level = 1 + level = LEVEL_BELOW_PLATING pipe_class = PIPE_CLASS_QUATERNARY rotate_class = PIPE_ROTATE_ONEDIR @@ -534,7 +534,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible icon_state = "map_4way" - level = 2 + level = LEVEL_ABOVE_PLATING /obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers name="4-way scrubbers pipe manifold" @@ -577,7 +577,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden icon_state = "map_4way" - level = 1 + level = LEVEL_BELOW_PLATING alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers @@ -624,7 +624,7 @@ desc = "An endcap for pipes." icon = 'icons/atmos/pipes.dmi' icon_state = "cap" - level = 2 + level = LEVEL_ABOVE_PLATING volume = 35 pipe_class = PIPE_CLASS_UNARY @@ -637,7 +637,7 @@ color = pipe_color /obj/machinery/atmospherics/pipe/cap/visible - level = 2 + level = LEVEL_ABOVE_PLATING icon_state = "cap" /obj/machinery/atmospherics/pipe/cap/visible/scrubbers @@ -663,7 +663,7 @@ connect_types = CONNECT_TYPE_FUEL /obj/machinery/atmospherics/pipe/cap/hidden - level = 1 + level = LEVEL_BELOW_PLATING icon_state = "cap" alpha = 128 diff --git a/code/modules/augment/active.dm b/code/modules/augment/active.dm index c50b461f282..2315938235f 100644 --- a/code/modules/augment/active.dm +++ b/code/modules/augment/active.dm @@ -30,7 +30,7 @@ . = ..() if(.) action.button_icon_state = icon_state - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/internal/augment/active/Destroy() diff --git a/code/modules/augment/active/armblades.dm b/code/modules/augment/active/armblades.dm index da2c30fc8a4..d0df629cdc1 100644 --- a/code/modules/augment/active/armblades.dm +++ b/code/modules/augment/active/armblades.dm @@ -9,7 +9,7 @@ sharp = 1 edge = 1 attack_verb = list("stabbed", "sliced", "cut") - origin_tech = "{'materials':1,'engineering':1,'combat':2}" + origin_tech = @'{"materials":1,"engineering":1,"combat":2}' material = /decl/material/solid/metal/steel /obj/item/armblade/can_take_wear_damage() @@ -21,19 +21,19 @@ action_button_name = "Deploy blade" icon_state = "armblade" allowed_organs = list(BP_AUGMENT_R_ARM, BP_AUGMENT_L_ARM) - holding_type = /obj/item/armblade + holding = /obj/item/armblade //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - + /obj/item/armblade/claws icon_state = "wolverine" name = "combat claws" desc = "These do not grow back." base_parry_chance = 40 material_force_multiplier = 0.3 - origin_tech = "{'materials':2,'engineering':2,'combat':3}" + origin_tech = @'{"materials":2,"engineering":2,"combat":3}' //Alternate look /obj/item/organ/internal/augment/active/simple/wolverine @@ -42,7 +42,7 @@ action_button_name = "Deploy claws" icon_state = "wolverine" allowed_organs = list(BP_AUGMENT_R_HAND, BP_AUGMENT_L_HAND) - holding_type = /obj/item/armblade/claws + holding = /obj/item/armblade/claws //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel diff --git a/code/modules/augment/active/circuit.dm b/code/modules/augment/active/circuit.dm index b8ea39ab9e0..6fe25252764 100644 --- a/code/modules/augment/active/circuit.dm +++ b/code/modules/augment/active/circuit.dm @@ -3,12 +3,12 @@ action_button_name = "Activate Circuit" icon_state = "circuit" allowed_organs = list(BP_AUGMENT_R_ARM, BP_AUGMENT_L_ARM) - holding_type = null //We must get the holding item externally + holding = null //We must get the holding item externally //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC desc = "A DIY modular assembly. Circuitry not included" material = /decl/material/solid/metal/steel - origin_tech = "{'materials':1,'magnets':1,'engineering':1,'programming':2}" + origin_tech = @'{"materials":1,"magnets":1,"engineering":1,"programming":2}' /obj/item/organ/internal/augment/active/simple/circuit/attackby(obj/item/W, mob/user) if(IS_CROWBAR(W)) diff --git a/code/modules/augment/active/cyberbrain.dm b/code/modules/augment/active/cyberbrain.dm index 70abdcb0494..f8fc92ecca1 100644 --- a/code/modules/augment/active/cyberbrain.dm +++ b/code/modules/augment/active/cyberbrain.dm @@ -4,7 +4,7 @@ icon_state = "cyberbrain" allowed_organs = list(BP_AUGMENT_HEAD) augment_flags = AUGMENTATION_MECHANIC - origin_tech = "{'materials':2,'magnets':3,'engineering':3,'biotech':2,'programming':4}" + origin_tech = @'{"materials":2,"magnets":3,"engineering":3,"biotech":2,"programming":4}' var/list/default_hardware = list( /obj/item/stock_parts/computer/processor_unit/small, @@ -60,7 +60,7 @@ return return ..() -/obj/item/organ/internal/augment/active/cyberbrain/handle_mouse_drop(atom/over, mob/user) +/obj/item/organ/internal/augment/active/cyberbrain/handle_mouse_drop(atom/over, mob/user, params) if(!istype(over, /obj/screen)) attack_self(user) return TRUE diff --git a/code/modules/augment/active/polytool.dm b/code/modules/augment/active/polytool.dm index d9592be10b2..eedb1239675 100644 --- a/code/modules/augment/active/polytool.dm +++ b/code/modules/augment/active/polytool.dm @@ -4,7 +4,7 @@ icon_state = "multitool" allowed_organs = list(BP_AUGMENT_R_HAND, BP_AUGMENT_L_HAND) augment_flags = AUGMENTATION_MECHANIC - origin_tech = "{'materials':2,'magnets':2,'engineering':4}" + origin_tech = @'{"materials":2,"magnets":2,"engineering":4}' var/list/items = list() var/list/paths = list() //We may lose them @@ -58,7 +58,7 @@ if(owner.equip_to_slot_if_possible(item, slot)) items -= item //Keep track of it, make sure it returns - events_repository.register(/decl/observ/item_unequipped, item, src, /obj/item/organ/internal/augment/active/simple/proc/holding_dropped ) + events_repository.register(/decl/observ/item_unequipped, item, src, TYPE_PROC_REF(/obj/item/organ/internal/augment/active/simple, holding_dropped) ) var/decl/pronouns/G = owner.get_pronouns() owner.visible_message( SPAN_NOTICE("\The [owner] extends [G.his] [item.name] from [G.his] [limb.name]."), diff --git a/code/modules/augment/active/tool/engineering.dm b/code/modules/augment/active/tool/engineering.dm index f733602225e..0b3416aaf7c 100644 --- a/code/modules/augment/active/tool/engineering.dm +++ b/code/modules/augment/active/tool/engineering.dm @@ -14,7 +14,7 @@ /obj/item/wirecutters/finger, /obj/item/multitool/finger ) - origin_tech = "{'materials':4,'magnets':3,'engineering':3}" + origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' /obj/item/weldingtool/finger name = "digital welder" diff --git a/code/modules/augment/active/tool/surgical.dm b/code/modules/augment/active/tool/surgical.dm index ba7b03dd20f..808d0c5c24c 100644 --- a/code/modules/augment/active/tool/surgical.dm +++ b/code/modules/augment/active/tool/surgical.dm @@ -16,4 +16,4 @@ /obj/item/scalpel, /obj/item/surgicaldrill ) - origin_tech = "{'materials':4,'magnets':3,'engineering':3}" + origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm index 5b017593016..82b1b100ffb 100644 --- a/code/modules/augment/augment.dm +++ b/code/modules/augment/augment.dm @@ -6,7 +6,7 @@ organ_properties = ORGAN_PROP_PROSTHETIC default_action_type = /datum/action/item_action/organ/augment material = /decl/material/solid/metal/steel - origin_tech = "{'materials':1,'magnets':2,'engineering':2,'biotech':1}" + origin_tech = @'{"materials":1,"magnets":2,"engineering":2,"biotech":1}' var/descriptor = "" var/known = TRUE diff --git a/code/modules/augment/helping_hands.dm b/code/modules/augment/helping_hands.dm new file mode 100644 index 00000000000..38b3be5033d --- /dev/null +++ b/code/modules/augment/helping_hands.dm @@ -0,0 +1,49 @@ +/obj/item/helpinghands + name = "back-mounted arms" + desc = "A pair of arms with an included harness worn on the back, controlled by a noninvasive spinal prosthesis." + icon = 'icons/mecha/mech_parts_held.dmi' + icon_state = "light_arms" + material = /decl/material/solid/metal/steel + slot_flags = SLOT_BACK + var/list/slot_types = list( + /datum/inventory_slot/gripper/left_hand/no_organ/helping, + /datum/inventory_slot/gripper/right_hand/no_organ/helping + ) + +/obj/item/helpinghands/proc/add_hands(mob/user) + for (var/gripper_type in slot_types) + user.add_held_item_slot(new gripper_type) + +/obj/item/helpinghands/proc/remove_hands(mob/user) + for (var/datum/inventory_slot/gripper_type as anything in slot_types) + user.remove_held_item_slot(initial(gripper_type.slot_id)) + +/obj/item/helpinghands/equipped(mob/user, slot) + . = ..() + if(!user) + return + switch(slot) + if(slot_back_str) + add_hands(user) + else + remove_hands(user) + +/obj/item/helpinghands/dropped(mob/user) + . = ..() + if(user) + remove_hands(user) + +/datum/inventory_slot/gripper/left_hand/no_organ + requires_organ_tag = null +/datum/inventory_slot/gripper/right_hand/no_organ + requires_organ_tag = null + +/datum/inventory_slot/gripper/left_hand/no_organ/helping + slot_id = "helping_hand_l" + hand_overlay = BP_L_HAND + hand_sort_priority = 4 + +/datum/inventory_slot/gripper/right_hand/no_organ/helping + slot_id = "helping_hand_r" + hand_overlay = BP_R_HAND + hand_sort_priority = 5 \ No newline at end of file diff --git a/code/modules/augment/passive/armor.dm b/code/modules/augment/passive/armor.dm index 1c5d2c4e751..738e6c278c7 100644 --- a/code/modules/augment/passive/armor.dm +++ b/code/modules/augment/passive/armor.dm @@ -5,6 +5,6 @@ desc = "A flexible composite mesh designed to prevent tearing and puncturing of underlying tissue." material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':4,'engineering':2,'biotech':3}" + origin_tech = @'{"materials":4,"engineering":2,"biotech":3}' var/brute_mult = 0.8 var/burn_mult = 1 \ No newline at end of file diff --git a/code/modules/augment/passive/boost.dm b/code/modules/augment/passive/boost.dm index c06f8c7ce6f..0881f8736ec 100644 --- a/code/modules/augment/passive/boost.dm +++ b/code/modules/augment/passive/boost.dm @@ -4,7 +4,7 @@ /obj/item/organ/internal/augment/boost icon_state = "booster" allowed_organs = list(BP_AUGMENT_HEAD) - origin_tech = "{'materials':2,'magnets':2,'engineering':2,'biotech':3}" + origin_tech = @'{"materials":2,"magnets":2,"engineering":2,"biotech":3}' var/list/buffs = list()//Which abilities does this impact? var/list/injury_debuffs = list()//If organ is damaged, should we reduce anything? var/buffpath = /datum/skill_buff/augment //if you use something else it should be a subtype or it will runtime diff --git a/code/modules/augment/passive/boost/muscle.dm b/code/modules/augment/passive/boost/muscle.dm index faab18be427..55d1df0a1a7 100644 --- a/code/modules/augment/passive/boost/muscle.dm +++ b/code/modules/augment/passive/boost/muscle.dm @@ -10,7 +10,7 @@ desc = "Nanofiber tendons powered by an array of actuators to help the wearer mantain speed even while encumbered. You may want to install these in pairs to see a result." material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':4,'magnets':3,'biotech':3}" + origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' var/obj/item/organ/internal/augment/boost/muscle/other //we need two for these diff --git a/code/modules/augment/passive/boost/reflex.dm b/code/modules/augment/passive/boost/reflex.dm index 1644f490514..d249075c429 100644 --- a/code/modules/augment/passive/boost/reflex.dm +++ b/code/modules/augment/passive/boost/reflex.dm @@ -8,7 +8,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':2,'magnets':3,'programming':5,'biotech':2}" + origin_tech = @'{"materials":2,"magnets":3,"programming":5,"biotech":2}' /obj/item/organ/internal/augment/boost/reflex/buff() if((. = ..())) diff --git a/code/modules/augment/passive/boost/shooting.dm b/code/modules/augment/passive/boost/shooting.dm index bbc92ec6107..d29a67a21be 100644 --- a/code/modules/augment/passive/boost/shooting.dm +++ b/code/modules/augment/passive/boost/shooting.dm @@ -8,7 +8,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':4,'magnets':3,'biotech':3}" + origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' /obj/item/organ/internal/augment/boost/reflex/buff() if((. = ..())) diff --git a/code/modules/augment/passive/nanoaura.dm b/code/modules/augment/passive/nanoaura.dm index 662be61f8eb..3bf4bf43d00 100644 --- a/code/modules/augment/passive/nanoaura.dm +++ b/code/modules/augment/passive/nanoaura.dm @@ -20,7 +20,7 @@ /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':4,'magnets':4,'engineering':5,'biotech':3}" + origin_tech = @'{"materials":4,"magnets":4,"engineering":5,"biotech":3}' var/obj/aura/nanoaura/aura = null var/charges = 4 diff --git a/code/modules/augment/simple.dm b/code/modules/augment/simple.dm index 20283eedbe7..23a9e2d4dfa 100644 --- a/code/modules/augment/simple.dm +++ b/code/modules/augment/simple.dm @@ -1,13 +1,12 @@ //Simple toggleabse module. Just put holding in hands or get it back /obj/item/organ/internal/augment/active/simple origin_tech = null - var/obj/item/holding = null - var/holding_type = null + var/obj/item/holding /obj/item/organ/internal/augment/active/simple/Initialize() . = ..() - if(holding_type) - holding = new holding_type(src) + if(ispath(holding)) + holding = new holding(src) holding.canremove = 0 if(!origin_tech) origin_tech = holding.get_origin_tech() @@ -19,7 +18,6 @@ QDEL_NULL(holding) return ..() - /obj/item/organ/internal/augment/active/simple/proc/holding_dropped() //Stop caring @@ -37,7 +35,7 @@ else if(limb.organ_tag in list(BP_R_ARM, BP_R_HAND)) slot = BP_R_HAND if(owner.equip_to_slot_if_possible(holding, slot)) - events_repository.register(/decl/observ/item_unequipped, holding, src, /obj/item/organ/internal/augment/active/simple/proc/holding_dropped) + events_repository.register(/decl/observ/item_unequipped, holding, src, TYPE_PROC_REF(/obj/item/organ/internal/augment/active/simple, holding_dropped)) var/decl/pronouns/G = owner.get_pronouns() owner.visible_message( SPAN_NOTICE("\The [owner] extends [G.his] [holding.name] from [G.his] [limb.name]."), diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 93a313012e5..77ce2c0c676 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -37,7 +37,7 @@ ..() if(!species) species = global.using_map.default_species var/species_choice = islist(species) ? pickweight(species) : species - new /mob/living/carbon/human/corpse(loc, species_choice, src) + new /mob/living/carbon/human/corpse(loc, species_choice, null, null, src) return INITIALIZE_HINT_QDEL /obj/abstract/landmark/corpse/proc/randomize_appearance(var/mob/living/carbon/human/M, species_choice) @@ -55,32 +55,32 @@ if((spawn_flags & CORPSE_SPAWNER_RANDOM_SKIN_COLOR)) if(species_choice in skin_colors_per_species) - M.change_skin_color(pick(skin_colors_per_species[species_choice])) + M.set_skin_colour(pick(skin_colors_per_species[species_choice])) else M.randomize_skin_color() if((spawn_flags & CORPSE_SPAWNER_RANDOM_HAIR_COLOR)) if(species_choice in hair_colors_per_species) - M.change_hair_color(pick(hair_colors_per_species[species_choice])) + M.set_hair_colour(pick(hair_colors_per_species[species_choice])) else M.randomize_hair_color() - M.change_facial_hair_color(M.hair_colour) + M.set_facial_hair_colour(M.get_hair_colour()) if((spawn_flags & CORPSE_SPAWNER_RANDOM_HAIR_STYLE)) if(species_choice in hair_styles_per_species) - M.change_hair(pick(hair_styles_per_species[species_choice])) + M.set_hairstyle(pick(hair_styles_per_species[species_choice])) else M.randomize_hair_style() if((spawn_flags & CORPSE_SPAWNER_RANDOM_FACIAL_STYLE)) if(species_choice in facial_styles_per_species) - M.change_facial_hair(pick(facial_styles_per_species[species_choice])) + M.set_facial_hairstyle(pick(facial_styles_per_species[species_choice])) else M.randomize_facial_hair_style() if((spawn_flags & CORPSE_SPAWNER_RANDOM_EYE_COLOR)) if(species_choice in eye_colors_per_species) - M.change_eye_color(pick(eye_colors_per_species[species_choice])) + M.set_eye_colour(pick(eye_colors_per_species[species_choice])) else M.randomize_eye_color() @@ -91,14 +91,14 @@ M.SetName(name) M.real_name = M.name -/obj/abstract/landmark/corpse/proc/equip_outfit(var/mob/living/carbon/human/M) +/obj/abstract/landmark/corpse/proc/equip_corpse_outfit(var/mob/living/carbon/human/M) var/adjustments = 0 adjustments = (spawn_flags & CORPSE_SPAWNER_CUT_SURVIVAL) ? (adjustments|OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR) : adjustments adjustments = (spawn_flags & CORPSE_SPAWNER_CUT_ID_PDA) ? (adjustments|OUTFIT_ADJUSTMENT_SKIP_ID_PDA) : adjustments adjustments = (spawn_flags & CORPSE_SPAWNER_PLAIN_HEADSET) ? (adjustments|OUTFIT_ADJUSTMENT_PLAIN_HEADSET) : adjustments var/decl/hierarchy/outfit/corpse_outfit = outfit_by_type(pickweight(corpse_outfits)) - corpse_outfit.equip(M, equip_adjustments = adjustments) + corpse_outfit.equip_outfit(M, equip_adjustments = adjustments) /obj/abstract/landmark/corpse/pirate name = "Pirate" diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index b416212991d..67ed0c183cd 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -35,7 +35,7 @@ /obj/machinery/gateway/centerstation/Initialize() update_icon() - wait = world.time + config.gateway_delay //+ thirty minutes default + wait = world.time + get_config_value(/decl/config/num/gateway_delay) //+ thirty minutes default awaygate = locate(/obj/machinery/gateway/centeraway) . = ..() diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 36732968a20..24c98a41859 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -12,8 +12,8 @@ layer = BLOB_SHIELD_LAYER - var/maxHealth = 30 - var/health + max_health = 30 + var/regen_rate = 5 var/brute_resist = 4.3 var/fire_resist = 0.8 @@ -28,7 +28,6 @@ /obj/effect/blob/Initialize() . = ..() - health = maxHealth update_icon() START_PROCESSING(SSblob, src) @@ -46,7 +45,7 @@ take_damage(rand(140 - (severity * 40), 140 - (severity * 20)) / brute_resist) /obj/effect/blob/on_update_icon() - if(health > maxHealth / 2) + if(health > max_health / 2) icon_state = "blob" else icon_state = "blob_damaged" @@ -66,7 +65,7 @@ update_icon() /obj/effect/blob/proc/regen() - health = min(health + regen_rate, maxHealth) + health = min(health + regen_rate, max_health) update_icon() /obj/effect/blob/proc/expand(var/turf/T) @@ -196,7 +195,7 @@ name = "master nucleus" desc = "A massive, fragile nucleus guarded by a shield of thick tendrils." icon_state = "blob_core" - maxHealth = 450 + max_health = 450 damage_min = 30 damage_max = 40 expandType = /obj/effect/blob/shield @@ -210,7 +209,7 @@ var/times_to_pulse = 0 /obj/effect/blob/core/proc/get_health_percent() - return ((health / maxHealth) * 100) + return ((health / max_health) * 100) /* the master core becomes more vulnereable to damage as it weakens, @@ -282,7 +281,7 @@ regen() will cover update_icon() for this proc name = "auxiliary nucleus" desc = "An interwoven mass of tendrils. A glowing nucleus pulses at its center." icon_state = "blob_node" - maxHealth = 125 + max_health = 125 regen_rate = 1 damage_min = 15 damage_max = 20 @@ -294,13 +293,13 @@ regen() will cover update_icon() for this proc return /obj/effect/blob/core/secondary/on_update_icon() - icon_state = (health / maxHealth >= 0.5) ? "blob_node" : "blob_factory" + icon_state = (health / max_health >= 0.5) ? "blob_node" : "blob_factory" /obj/effect/blob/shield name = "shielding mass" desc = "A pulsating mass of interwoven tendrils. These seem particularly robust, but not quite as active." icon_state = "blob_idle" - maxHealth = 120 + max_health = 120 damage_min = 13 damage_max = 25 attack_freq = 7 @@ -318,9 +317,9 @@ regen() will cover update_icon() for this proc return ..() /obj/effect/blob/shield/on_update_icon() - if(health > maxHealth * 2 / 3) + if(health > max_health * 2 / 3) icon_state = "blob_idle" - else if(health > maxHealth / 3) + else if(health > max_health / 3) icon_state = "blob" else icon_state = "blob_damaged" @@ -331,7 +330,7 @@ regen() will cover update_icon() for this proc /obj/effect/blob/ravaging name = "ravaging mass" desc = "A mass of interwoven tendrils. They thrash around haphazardly at anything in reach." - maxHealth = 20 + max_health = 20 damage_min = 27 damage_max = 36 attack_freq = 3 @@ -347,7 +346,7 @@ regen() will cover update_icon() for this proc item_state = "blob_tendril" w_class = ITEM_SIZE_LARGE attack_verb = list("smacked", "smashed", "whipped") - material = /decl/material/solid/plantmatter + material = /decl/material/solid/organic/plantmatter var/is_tendril = TRUE var/types_of_tendril = list("solid", "fire") @@ -364,13 +363,13 @@ regen() will cover update_icon() for this proc desc = "An incredibly dense, yet flexible, tendril, removed from an asteroclast." force = 10 color = COLOR_BRONZE - origin_tech = "{'materials':2}" + origin_tech = @'{"materials":2}' if("fire") desc = "A tendril removed from an asteroclast. It's hot to the touch." damtype = BURN force = 15 color = COLOR_AMBER - origin_tech = "{'powerstorage':2}" + origin_tech = @'{"powerstorage":2}' /obj/item/blob_tendril/afterattack(obj/O, mob/user, proximity) if(!proximity) @@ -389,11 +388,11 @@ regen() will cover update_icon() for this proc icon_state = "core_sample" item_state = "blob_core" w_class = ITEM_SIZE_NORMAL - origin_tech = "{'materials':4,'wormholes':5,'biotech':7}" + origin_tech = @'{"materials":4,"wormholes":5,"biotech":7}' is_tendril = FALSE /obj/item/blob_tendril/core/aux name = "asteroclast auxiliary nucleus sample" desc = "A sample taken from an asteroclast's auxiliary nucleus." icon_state = "core_sample_2" - origin_tech = "{'materials':2,'wormholes':3,'biotech':4}" + origin_tech = @'{"materials":2,"wormholes":3,"biotech":4}' diff --git a/code/modules/brain_interface/_brain_interface.dm b/code/modules/brain_interface/_brain_interface.dm new file mode 100644 index 00000000000..4b96d8f9f24 --- /dev/null +++ b/code/modules/brain_interface/_brain_interface.dm @@ -0,0 +1,153 @@ +// Many values copied from brains. Not inheriting to avoid redundant brainmob creation. +/obj/item/organ/internal/brain_interface + name = "neural interface" + desc = "A complex life support shell that interfaces between a brain and an electronic device." + organ_tag = BP_BRAIN + parent_organ = BP_HEAD + origin_tech = @'{"biotech":3}' + icon = 'icons/obj/items/brain_interface_organic.dmi' + icon_state = ICON_STATE_WORLD + req_access = list(access_robotics) + material = /decl/material/solid/metal/steel + matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) + w_class = ITEM_SIZE_SMALL + throwforce = 1 + throw_speed = 3 + throw_range = 5 + attack_verb = list("attacked", "slapped", "whacked") + relative_size = 85 + damage_reduction = 0 + scale_max_damage_to_species_health = FALSE + transfer_brainmob_with_organ = TRUE + var/locked = FALSE + var/obj/item/organ/internal/brain/holding_brain = /obj/item/organ/internal/brain + +/obj/item/organ/internal/brain_interface/is_preserved() + return TRUE + +/obj/item/organ/internal/brain_interface/empty + holding_brain = null + +/obj/item/organ/internal/brain_interface/Initialize() + set_bodytype(/decl/bodytype/prosthetic/basic_human) + if(ispath(holding_brain)) + holding_brain = new holding_brain(src) + if(get_radio()) + verbs |= /obj/item/organ/internal/brain_interface/proc/toggle_radio_listening + verbs |= /obj/item/organ/internal/brain_interface/proc/toggle_radio_broadcasting + . = ..() + update_icon() + +/obj/item/organ/internal/brain_interface/get_brainmob(var/create_if_missing = FALSE) + return holding_brain?.get_brainmob(create_if_missing) + +/obj/item/organ/internal/brain_interface/on_update_icon() + icon_state = get_world_inventory_state() + if(holding_brain) + var/mob/living/brainmob = get_brainmob() + if(!brainmob || brainmob.stat == DEAD) + icon_state = "[icon_state]-dead" + else + icon_state = "[icon_state]-full" + +/obj/item/organ/internal/brain_interface/examine(mob/user, distance) + . = ..() + if(distance <= 1) + var/mob/living/brain/brainmob = get_brainmob() + if(istype(brainmob)) + if(brainmob.emp_damage) + to_chat(user, SPAN_WARNING("The neural interface socket is damaged.")) + else + to_chat(user, SPAN_NOTICE("It is undamaged.")) + +/obj/item/organ/internal/brain_interface/attackby(var/obj/item/O, var/mob/user) + + if(istype(O, /obj/item/stack/nanopaste)) + var/mob/living/brain/brainmob = get_brainmob() + if(!istype(brainmob) || !brainmob.emp_damage) + to_chat(user, SPAN_WARNING("\The [src] has no damage to repair.")) + return TRUE + var/obj/item/stack/nanopaste/pasta = O + pasta.use(1) + to_chat(user, SPAN_NOTICE("You repair some of the damage to \the [src]'s electronics with the nanopaste.")) + brainmob.emp_damage = max(brainmob.emp_damage - rand(5,10), 0) + return TRUE + + if(istype(O, /obj/item/organ/internal/brain)) + + if(holding_brain) + to_chat(user, SPAN_WARNING("\The [src] already has a brain in it.")) + return TRUE + + var/obj/item/organ/internal/brain/inserting_brain = O + if(BP_IS_PROSTHETIC(inserting_brain)) + to_chat(user, SPAN_WARNING("You don't need to put a robotic brain into an interface.")) + return TRUE + + if(inserting_brain.damage >= inserting_brain.max_damage) + to_chat(user, SPAN_WARNING("That brain is well and truly dead.")) + return TRUE + + if(!inserting_brain.get_brainmob() || !inserting_brain.can_use_brain_interface) + to_chat(user, SPAN_WARNING("\The [inserting_brain] is completely useless.")) + return TRUE + + if(user.try_unequip(O, src)) + user.visible_message(SPAN_NOTICE("\The [user] sticks \the [inserting_brain] into \the [src].")) + SetName("[initial(name)] (\the [inserting_brain])") + holding_brain = inserting_brain + update_icon() + locked = TRUE + SSstatistics.add_field("cyborg_mmis_filled",1) + return TRUE + + if(istype(O,/obj/item/card/id) || istype(O,/obj/item/modular_computer)) + if(allowed(user)) + locked = !locked + to_chat(user, SPAN_NOTICE("You [locked ? "lock" : "unlock"] \the [src].")) + else + to_chat(user, SPAN_WARNING("Access denied.")) + return TRUE + + if(holding_brain) + return holding_brain.attackby(O, user) + + . = ..() + +/obj/item/organ/internal/brain_interface/relaymove(var/mob/user, var/direction) + if(user.incapacitated()) + return + var/obj/item/rig/rig = src.get_rig() + if(rig) + rig.forced_move(direction, user) + +/obj/item/organ/internal/brain_interface/Destroy() + STOP_PROCESSING(SSprocessing, src) + if(isrobot(loc)) + var/mob/living/silicon/robot/borg = loc + if(borg.central_processor == src) + borg.central_processor = null + if(holding_brain) + if(!QDELETED(holding_brain)) + qdel(holding_brain) + holding_brain = null + for(var/obj/item/thing in contents) + qdel(thing) + . = ..() + +/obj/item/organ/internal/brain_interface/attack_self(mob/user) + + if(locked) + to_chat(user, SPAN_WARNING("You upend \the [src], but the case is locked shut.")) + return TRUE + + if(!holding_brain) + to_chat(user, SPAN_WARNING("You upend \the [src], but there's nothing in it.")) + return TRUE + + to_chat(user, SPAN_NOTICE("You upend \the [src], spilling \the [holding_brain] onto \the [get_turf(src)].")) + + holding_brain.dropInto(user.loc) + holding_brain = null + update_icon() + SetName(initial(name)) diff --git a/code/modules/brain_interface/interface_radio.dm b/code/modules/brain_interface/interface_radio.dm new file mode 100644 index 00000000000..a793f944ce7 --- /dev/null +++ b/code/modules/brain_interface/interface_radio.dm @@ -0,0 +1,61 @@ +/obj/item/organ/internal/brain_interface/radio_enabled + name = "radio-enabled neural interface" + desc = "A complex life support shell that interfaces between a brain and an electronic device. This one comes with a built-in radio." + origin_tech = @'{"biotech":4}' + var/VAR_PRIVATE/weakref/_radio + +/obj/item/organ/internal/brain_interface/radio_enabled/empty + holding_brain = null + +/obj/item/organ/internal/brain_interface/radio_enabled/get_radio() + var/obj/item/radio/radio_instance = _radio?.resolve() + if(radio_instance && (!istype(radio_instance) || QDELETED(radio_instance) || radio_instance.loc != src)) + radio_instance = null + _radio = null + return radio_instance?.get_radio() + +/obj/item/organ/internal/brain_interface/radio_enabled/Initialize() + _radio = weakref(new /obj/item/radio(src)) + . = ..() + +/obj/item/organ/internal/brain_interface/radio_enabled/Destroy() + var/obj/item/radio/radio_instance = get_radio() + if(radio_instance) + qdel(radio_instance) + _radio = null + return ..() + +/obj/item/organ/internal/brain_interface/proc/toggle_radio_broadcasting() + set name = "Toggle Broadcasting" + set desc = "Toggle broadcasting channel on or off." + set category = "Brain Interface" + set src in view(1) + set popup_menu = 0 + + if(usr.incapacitated()) + to_chat(usr, SPAN_WARNING("You must be alive and conscious to interact with \the [src].")) + return + + var/obj/item/radio/radio_instance = get_radio() + if(istype(radio_instance)) + radio_instance.broadcasting = !radio_instance.broadcasting + to_chat(usr, SPAN_NOTICE("You adjust the radio on \the [src]. It is [radio_instance.broadcasting ? "now broadcasting" : "no longer broadcasting"].")) + else + verbs -= /obj/item/organ/internal/brain_interface/proc/toggle_radio_broadcasting + +/obj/item/organ/internal/brain_interface/proc/toggle_radio_listening() + set name = "Toggle Listening" + set desc = "Toggle listening channel on or off." + set category = "Brain Interface" + set src in view(1) + + set popup_menu = 0 + if(usr.incapacitated()) + to_chat(usr, SPAN_WARNING("You must be alive and conscious to interact with \the [src].")) + return + var/obj/item/radio/radio_instance = get_radio() + if(radio_instance) + radio_instance.listening = !radio_instance.listening + to_chat(usr, SPAN_NOTICE("You adjust the radio on \the [src]. It is [radio_instance.listening ? "now receiving broadcasts" : "no longer receiving broadcasts"].")) + else + verbs -= /obj/item/organ/internal/brain_interface/proc/toggle_radio_listening diff --git a/code/modules/butchery/butchery.dm b/code/modules/butchery/butchery.dm index 20b508846bc..b06d0ed83c5 100644 --- a/code/modules/butchery/butchery.dm +++ b/code/modules/butchery/butchery.dm @@ -6,9 +6,9 @@ /mob/living var/meat_type = /obj/item/chems/food/meat var/meat_amount = 3 - var/skin_material = /decl/material/solid/skin + var/skin_material = /decl/material/solid/organic/skin var/skin_amount = 3 - var/bone_material = /decl/material/solid/bone + var/bone_material = /decl/material/solid/organic/bone var/bone_amount = 3 var/skull_type var/butchery_rotation = 90 @@ -104,7 +104,7 @@ to_chat(user, SPAN_WARNING("\The [occupant] is so badly mangled that removing them from \the [src] would be pointless.")) return TRUE -/obj/structure/kitchenspike/receive_mouse_drop(var/atom/dropping, var/mob/user) +/obj/structure/kitchenspike/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && ismob(dropping)) try_spike(dropping, user) diff --git a/code/modules/butchery/remains.dm b/code/modules/butchery/remains.dm index 6ba9bf3b288..3202dfbe165 100644 --- a/code/modules/butchery/remains.dm +++ b/code/modules/butchery/remains.dm @@ -1,6 +1,6 @@ /obj/item/bone icon = 'icons/obj/items/bone.dmi' - material = /decl/material/solid/bone + material = /decl/material/solid/organic/bone /obj/item/bone/skull name = "skull" @@ -10,4 +10,5 @@ /obj/item/bone/skull/deer name = "deer skull" + icon = 'icons/obj/items/bone.dmi' icon_state = "deer_skull" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 616ce0399ab..756975d0814 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -84,7 +84,7 @@ var/global/list/localhost_addresses = list( ticket.close(client_repository.get_lite_client(usr.client)) //Logs all hrefs - if(config && config.log_hrefs && global.world_href_log) + if(get_config_value(/decl/config/toggle/log_hrefs) && global.world_href_log) to_file(global.world_href_log, "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
    ") switch(href_list["_src_"]) @@ -130,14 +130,15 @@ var/global/list/localhost_addresses = list( deactivate_darkmode(clear_chat = FALSE) // Overwritten if the pref is set later. #if DM_VERSION >= 512 - var/bad_version = config.minimum_byond_version && byond_version < config.minimum_byond_version - var/bad_build = config.minimum_byond_build && byond_build < config.minimum_byond_build + var/bad_version = byond_version < get_config_value(/decl/config/num/minimum_byond_version) + var/bad_build = byond_build < get_config_value(/decl/config/num/minimum_byond_build) + if (bad_build || bad_version) to_chat(src, "You are attempting to connect with an out-of-date version of BYOND. Please update to the latest version at http://www.byond.com/ before trying again.") qdel(src) return - if("[byond_version].[byond_build]" in config.forbidden_versions) + if("[byond_version].[byond_build]" in get_config_value(/decl/config/lists/forbidden_versions)) _DB_staffwarn_record(ckey, "Tried to connect with broken and possibly exploitable BYOND build.") to_chat(src, "You are attempting to connect with a broken and possibly exploitable BYOND build. Please update to the latest version at http://www.byond.com/ before trying again.") qdel(src) @@ -145,23 +146,24 @@ var/global/list/localhost_addresses = list( #endif - var/local_connection = (config.auto_local_admin && (isnull(address) || global.localhost_addresses[address])) + var/local_connection = (get_config_value(/decl/config/toggle/on/auto_local_admin) && (isnull(address) || global.localhost_addresses[address])) if(!local_connection) - if(!config.guests_allowed && IsGuestKey(key)) + if(!get_config_value(/decl/config/toggle/guests_allowed) && IsGuestKey(key)) alert(src,"This server doesn't allow guest accounts to play. Please go to http://www.byond.com/ and register for a key.","Guest","OK") qdel(src) return - if(config.player_limit != 0) - if((global.clients.len >= config.player_limit) && !(ckey in admin_datums)) - alert(src,"This server is currently full and not accepting new connections.","Server Full","OK") - log_admin("[ckey] tried to join and was turned away due to the server being full (player_limit=[config.player_limit])") - qdel(src) - return + var/player_limit = get_config_value(/decl/config/num/player_limit) + if(player_limit != 0 && global.clients.len >= player_limit && !(ckey in admin_datums)) + alert(src,"This server is currently full and not accepting new connections.","Server Full","OK") + log_admin("[ckey] tried to join and was turned away due to the server being full (player_limit=[player_limit])") + qdel(src) + return // Change the way they should download resources. - if(config.resource_urls && config.resource_urls.len) - src.preload_rsc = pick(config.resource_urls) - else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal. + var/list/resource_urls = get_config_value(/decl/config/lists/resource_urls) + if(length(resource_urls)) + src.preload_rsc = pick(resource_urls) + else src.preload_rsc = 1 // If resource_urls is not set, preload like normal. global.clients += src global.ckey_directory[ckey] = src @@ -199,17 +201,19 @@ var/global/list/localhost_addresses = list( prefs.last_id = computer_id apply_fps(prefs.clientfps) - if(!isnull(config.lock_client_view_x) && !isnull(config.lock_client_view_y)) - view = "[config.lock_client_view_x]x[config.lock_client_view_y]" + var/lock_x = get_config_value(/decl/config/num/clients/lock_client_view_x) + var/lock_y = get_config_value(/decl/config/num/clients/lock_client_view_y) + if(lock_x > 0 && lock_y > 0) + view = "[lock_x]x[lock_y]" . = ..() //calls mob.Login() global.using_map.map_info(src) - if(custom_event_msg && custom_event_msg != "") + if(global.custom_event_msg) to_chat(src, "

    Custom Event

    ") to_chat(src, "

    A custom event is taking place. OOC Info:

    ") - to_chat(src, "[custom_event_msg]") + to_chat(src, "[global.custom_event_msg]") to_chat(src, "
    ") if(holder) @@ -344,10 +348,10 @@ var/global/list/localhost_addresses = list( var/sql_admin_rank = sql_sanitize_text(admin_rank) if ((player_age <= 0) && !(ckey in global.panic_bunker_bypass)) //first connection - if (config.panic_bunker && !holder && !deadmin_holder) + if (get_config_value(/decl/config/toggle/panic_bunker) && !holder && !deadmin_holder) log_adminwarn("Failed Login: [key] - New account attempting to connect during panic bunker") message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") - to_chat(src, config.panic_bunker_message) + to_chat(src, get_config_value(/decl/config/text/panic_bunker_message)) qdel(src) return 0 @@ -377,9 +381,9 @@ var/global/list/localhost_addresses = list( message_staff("\[[holder.rank]\] [key_name(src)] logged out.") if(!global.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. send2adminirc("[key_name(src)] logged out - no more staff online.") - if(config.delist_when_no_admins && global.visibility_pref) - world.update_hub_visibility() - send2adminirc("Toggled hub visibility. The server is now invisible ([global.visibility_pref]).") + if(get_config_value(/decl/config/toggle/delist_when_no_admins) && get_config_value(/decl/config/toggle/hub_visibility)) + toggle_config_value(/decl/config/toggle/hub_visibility) + send2adminirc("Toggled hub visibility. The server is now invisible.") //checks if a client is afk //3000 frames = 5 minutes @@ -499,9 +503,9 @@ var/global/const/MAX_VIEW = 41 return // Some kind of malformed winget(), do not proceed. // Rescale as needed. - var/res_x = config.lock_client_view_x || CEILING(text2num(view_components[1]) / divisor) - var/res_y = config.lock_client_view_y || CEILING(text2num(view_components[2]) / divisor) - var/max_view = config.max_client_view_x || MAX_VIEW + var/res_x = get_config_value(/decl/config/num/clients/lock_client_view_x) || CEILING(text2num(view_components[1]) / divisor) + var/res_y = get_config_value(/decl/config/num/clients/lock_client_view_y) || CEILING(text2num(view_components[2]) / divisor) + var/max_view = get_config_value(/decl/config/num/clients/max_client_view_x) || MAX_VIEW last_view_x_dim = clamp(res_x, MIN_VIEW, max_view) last_view_y_dim = clamp(res_y, MIN_VIEW, max_view) @@ -696,3 +700,18 @@ var/global/const/MAX_VIEW = 41 var/obj/item/I = mob.get_active_hand() if(I && I.can_be_dropped_by_client(mob)) mob.drop_item() + +/client/verb/activate_ability(var/slot as num) + set name = ".activate_ability" +// set hidden = 1 + if(!mob) + return // Paranoid. + if(isnull(slot) || !isnum(slot)) + to_chat(src,".activate_ability requires a number as input, corrisponding to the slot you wish to use.") + return // Bad input. + if(!mob.ability_master) + return // No abilities. + if(slot > mob.ability_master.ability_objects.len || slot <= 0) + return // Out of bounds. + var/obj/screen/ability/A = mob.ability_master.ability_objects[slot] + A.activate() diff --git a/code/modules/client/preference_setup/background/01_species.dm b/code/modules/client/preference_setup/background/01_species.dm index c75d436d5d8..8823b103aa4 100644 --- a/code/modules/client/preference_setup/background/01_species.dm +++ b/code/modules/client/preference_setup/background/01_species.dm @@ -35,7 +35,7 @@ var/list/playables = list() for(var/s in prefilter) - if(!check_rights(R_ADMIN, 0) && config.usealienwhitelist) + if(!check_rights(R_ADMIN, 0) && get_config_value(/decl/config/toggle/use_alien_whitelist)) var/decl/species/checking_species = get_species_by_key(s) if(!(checking_species.spawn_flags & SPECIES_CAN_JOIN)) continue diff --git a/code/modules/client/preference_setup/background/02_culture.dm b/code/modules/client/preference_setup/background/02_culture.dm index 852a634db24..43b7cb5180c 100644 --- a/code/modules/client/preference_setup/background/02_culture.dm +++ b/code/modules/client/preference_setup/background/02_culture.dm @@ -118,7 +118,7 @@ if(href_list["toggle_verbose_[token]"]) hidden[token] = !hidden[token] return TOPIC_REFRESH - + var/decl/cultural_info/new_token = href_list["set_token_entry_[token]"] if(!isnull(new_token)) new_token = locate(new_token) diff --git a/code/modules/client/preference_setup/controls/01_keybindings.dm b/code/modules/client/preference_setup/controls/01_keybindings.dm index 22a21e13a1a..32df0057281 100644 --- a/code/modules/client/preference_setup/controls/01_keybindings.dm +++ b/code/modules/client/preference_setup/controls/01_keybindings.dm @@ -38,7 +38,7 @@ notadded += kb if(length(notadded)) - addtimer(CALLBACK(src, .proc/announce_conflict, notadded), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(announce_conflict), notadded), 5 SECONDS) /datum/preferences/proc/announce_conflict(list/notadded) to_chat(client, SPAN_DANGER("There are new keybindings that have defaults that are already bound - the new keybindings will be unbound until updated. You can rebind them in Setup Character or Game Preferences.")) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 2d799b9206d..5bde5e6d9b4 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -24,13 +24,10 @@ pref.bodytype = R.read("bodytype") pref.real_name = R.read("real_name") pref.be_random_name = R.read("name_is_always_random") - - pref.spawnpoint = R.read("spawnpoint") - for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) - if(pref.spawnpoint == spawnpoint.name) - pref.spawnpoint = spawnpoint.type - break - if(!ispath(pref.spawnpoint, /decl/spawnpoint)) + var/decl/spawnpoint/loaded_spawnpoint = decls_repository.get_decl_by_id_or_var(R.read("spawnpoint"), /decl/spawnpoint) + if(istype(loaded_spawnpoint) && (loaded_spawnpoint in global.using_map.allowed_latejoin_spawns)) + pref.spawnpoint = loaded_spawnpoint.type + else pref.spawnpoint = global.using_map.default_spawn /datum/category_item/player_setup_item/physical/basic/save_character(datum/pref_record_writer/W) @@ -38,14 +35,13 @@ W.write("bodytype", pref.bodytype) W.write("real_name", pref.real_name) W.write("name_is_always_random", pref.be_random_name) - var/decl/spawnpoint/spawnpoint = GET_DECL(pref.spawnpoint) - W.write("spawnpoint", spawnpoint.name) + W.write("spawnpoint", spawnpoint.uid) /datum/category_item/player_setup_item/physical/basic/sanitize_character() var/valid_spawn = FALSE - for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) + for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_latejoin_spawns) if(pref.spawnpoint == spawnpoint.type) valid_spawn = TRUE break @@ -93,8 +89,13 @@ else . += "[G.pronoun_string]" + . += "
    Spawnpoint:" var/decl/spawnpoint/spawnpoint = GET_DECL(pref.spawnpoint) - . += "
    Spawn point: [spawnpoint.name]" + for(var/decl/spawnpoint/allowed_spawnpoint in global.using_map.allowed_latejoin_spawns) + if(spawnpoint == allowed_spawnpoint) + . += "[allowed_spawnpoint.name]" + else + . += "[allowed_spawnpoint.name]" . = jointext(.,null) /datum/category_item/player_setup_item/physical/basic/OnTopic(var/href,var/list/href_list, var/mob/user) @@ -146,8 +147,8 @@ return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["spawnpoint"]) - var/decl/spawnpoint/choice = input(user, "Where would you like to spawn when late-joining?") as null|anything in global.using_map.allowed_spawns - if(!istype(choice) || !CanUseTopic(user)) + var/decl/spawnpoint/choice = locate(href_list["spawnpoint"]) + if(!istype(choice) || !CanUseTopic(user) || !(choice in global.using_map.allowed_latejoin_spawns)) return TOPIC_NOACTION pref.spawnpoint = choice.type return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/general/02_body.dm b/code/modules/client/preference_setup/general/02_body.dm index c12d6c2c35c..2582487bc45 100644 --- a/code/modules/client/preference_setup/general/02_body.dm +++ b/code/modules/client/preference_setup/general/02_body.dm @@ -33,47 +33,18 @@ pref.bgstate = R.read("bgstate") // Get h_style type. - var/list/all_sprite_accessories - var/load_h_style = R.read("hair_style_name") - var/decl/h_style_decl = decls_repository.get_decl_by_id(load_h_style, validate_decl_type = FALSE) - // Grandfather in name-based sprite accessories. - if(!istype(h_style_decl) && load_h_style) - all_sprite_accessories = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/hair) - for(var/accessory in all_sprite_accessories) - var/decl/sprite_accessory/sprite = all_sprite_accessories[accessory] - if(sprite.name == load_h_style) - pref.h_style = accessory - break + var/decl/h_style_decl = decls_repository.get_decl_by_id_or_var(R.read("hair_style_name"), /decl/sprite_accessory/hair) pref.h_style = istype(h_style_decl) ? h_style_decl.type : /decl/sprite_accessory/hair/bald - // Get f_style type. - var/load_f_style = R.read("facial_style_name") - var/decl/f_style_decl = decls_repository.get_decl_by_id(load_f_style, validate_decl_type = FALSE) - // Grandfather in name-based accessories. - if(!istype(f_style_decl) && load_f_style) - all_sprite_accessories = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/facial_hair) - for(var/accessory in all_sprite_accessories) - var/decl/sprite_accessory/sprite = all_sprite_accessories[accessory] - if(sprite.name == load_f_style) - pref.f_style = accessory - break + var/decl/f_style_decl = decls_repository.get_decl_by_id_or_var(R.read("facial_style_name"), /decl/sprite_accessory/facial_hair) pref.f_style = istype(f_style_decl) ? f_style_decl.type : /decl/sprite_accessory/facial_hair/shaved - // Get markings type. var/list/load_markings = R.read("body_markings") pref.body_markings = list() - all_sprite_accessories = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/marking) if(length(load_markings)) for(var/marking in load_markings) - var/decl/sprite_accessory/marking/loaded_marking = decls_repository.get_decl_by_id(marking, validate_decl_type = FALSE) - // Grandfather in name-based accessories. - if(isnull(loaded_marking)) - for(var/accessory in all_sprite_accessories) - var/decl/sprite_accessory/sprite = all_sprite_accessories[accessory] - if(sprite.name == marking) - loaded_marking = pref.body_markings[marking] - break - if(loaded_marking) + var/decl/sprite_accessory/marking/loaded_marking = decls_repository.get_decl_by_id_or_var(marking, /decl/sprite_accessory/marking) + if(istype(loaded_marking)) pref.body_markings[loaded_marking.type] = load_markings[marking] /datum/category_item/player_setup_item/physical/body/save_character(datum/pref_record_writer/W) @@ -178,44 +149,59 @@ . += "
    " . += "

    Colouration

    " - . += "" + . += "
    " . += "" - . += "" - . += "" - . += "" + . += "" + . += "" + . += "" + . += "" . += "" . += "" - . += "" - . += "" - . += "" + . += "" + . += "" + . += "" + . += "" . += "" if(mob_bodytype.appearance_flags & HAS_EYE_COLOR) . += "" - . += "" - . += "" + . += "" + . += "" + . += "" if(mob_bodytype.appearance_flags & HAS_SKIN_COLOR) . += "" - . += "" - . += "" + . += "" + . += "" + . += "" . += "
    Hair[GET_DECL(pref.h_style)]" + . += "Hair" + + var/const/up_arrow = "⇧" + var/const/down_arrow = "⇩" + var/const/left_arrow = "⇦" + var/const/right_arrow = "⇨" + if(mob_bodytype.appearance_flags & HAS_HAIR_COLOR) . += "[COLORED_SQUARE(pref.hair_colour)] Change" . += "[left_arrow][GET_DECL(pref.h_style)][right_arrow]
    Facial[GET_DECL(pref.f_style)]" + . += "Facial" if(mob_bodytype.appearance_flags & HAS_HAIR_COLOR) . += "[COLORED_SQUARE(pref.facial_hair_colour)] Change" . += "[left_arrow][GET_DECL(pref.f_style)][right_arrow]
    Eyes[COLORED_SQUARE(pref.eye_colour)] ChangeEyes[COLORED_SQUARE(pref.eye_colour)] Change" . += "
    Body[COLORED_SQUARE(pref.skin_colour)] ChangeBody[COLORED_SQUARE(pref.skin_colour)] Change" . += "
    " . += "

    Markings

    " - . += "" + . += "
    " for(var/M in pref.body_markings) var/decl/sprite_accessory/mark = GET_DECL(M) . += "" - . += "" - . += "" + . += "" + . += "" + . += "" + . += "" + . += "" . += "" - . += "" + . += "" . += "
    [mark.name]Remove[COLORED_SQUARE(pref.body_markings[M])] ChangeRemove[COLORED_SQUARE(pref.body_markings[M])] Change[up_arrow][mark.name][down_arrow]
    Add marking
    Add marking
    " . = jointext(.,null) @@ -262,14 +248,50 @@ else if(href_list["hair_style"]) - var/decl/bodytype/B = mob_species.get_bodytype_by_name(pref.bodytype) - mob_species = get_species_by_key(pref.species) - var/decl/sprite_accessory/new_h_style = input(user, "Choose your character's hair style:", CHARACTER_PREFERENCE_INPUT_TITLE, pref.h_style) as null|anything in mob_species.get_hair_styles(B) - mob_species = get_species_by_key(pref.species) - if(new_h_style && CanUseTopic(user) && (new_h_style in mob_species.get_hair_styles(B))) + var/decl/sprite_accessory/new_h_style = input(user, "Choose your character's hair style:", CHARACTER_PREFERENCE_INPUT_TITLE, pref.h_style) as null|anything in mob_species.get_hair_styles(mob_bodytype) + mob_species = get_species_by_key(pref.species) + mob_bodytype = mob_species.get_bodytype_by_name(pref.bodytype) || mob_species.default_bodytype + if(new_h_style && CanUseTopic(user) && (new_h_style in mob_species.get_hair_styles(mob_bodytype))) pref.h_style = new_h_style.type return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["hair_next"] || href_list["hair_prev"]) + var/decl/sprite_accessory/current_hair = GET_DECL(pref.h_style) + var/list/available_hair = mob_species.get_hair_styles(mob_bodytype) + if(current_hair in available_hair) + if(href_list["hair_next"]) + current_hair = next_in_list(current_hair, available_hair) + else if(href_list["hair_prev"]) + current_hair = previous_in_list(current_hair, available_hair) + if(istype(current_hair) && pref.h_style != current_hair.type) + pref.h_style = current_hair.type + return TOPIC_REFRESH_UPDATE_PREVIEW + + return TOPIC_NOACTION + else if(href_list["facial_style"]) + + var/decl/sprite_accessory/new_f_style = input(user, "Choose your character's facial-hair style:", CHARACTER_PREFERENCE_INPUT_TITLE, GET_DECL(pref.f_style)) as null|anything in mob_species.get_facial_hair_styles(mob_bodytype) + mob_species = get_species_by_key(pref.species) + mob_bodytype = mob_species.get_bodytype_by_name(pref.bodytype) || mob_species.default_bodytype + if(new_f_style && CanUseTopic(user) && (new_f_style in mob_species.get_facial_hair_styles(mob_bodytype))) + pref.f_style = new_f_style.type + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["facial_next"] || href_list["facial_prev"]) + + var/decl/sprite_accessory/current_facial_hair = GET_DECL(pref.f_style) + var/list/available_facial_hair = mob_species.get_facial_hair_styles(mob_bodytype) + if(current_facial_hair in available_facial_hair) + if(href_list["facial_next"]) + current_facial_hair = next_in_list(current_facial_hair, available_facial_hair) + else if(href_list["facial_prev"]) + current_facial_hair = previous_in_list(current_facial_hair, available_facial_hair) + if(istype(current_facial_hair) && pref.f_style != current_facial_hair.type) + pref.f_style = current_facial_hair.type + return TOPIC_REFRESH_UPDATE_PREVIEW + + return TOPIC_NOACTION + else if(href_list["facial_color"]) if(!(mob_bodytype.appearance_flags & HAS_HAIR_COLOR)) return TOPIC_NOACTION @@ -310,37 +332,15 @@ pref.skin_colour = new_skin return TOPIC_REFRESH_UPDATE_PREVIEW - else if(href_list["facial_style"]) - - var/decl/bodytype/B = mob_species.get_bodytype_by_name(pref.bodytype) - mob_species = get_species_by_key(pref.species) - var/decl/sprite_accessory/new_f_style = input(user, "Choose your character's facial-hair style:", CHARACTER_PREFERENCE_INPUT_TITLE, GET_DECL(pref.f_style)) as null|anything in mob_species.get_facial_hair_styles(B) - mob_species = get_species_by_key(pref.species) - if(new_f_style && CanUseTopic(user) && (new_f_style in mob_species.get_facial_hair_styles(B))) - pref.f_style = new_f_style.type - return TOPIC_REFRESH_UPDATE_PREVIEW - //TODO SPRITE ACCESSORY UPDATE else if(href_list["marking_style"]) - var/list/disallowed_markings = list() - for (var/M in pref.body_markings) - var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) - disallowed_markings |= mark_style.disallows - - var/list/usable_markings = list() - var/list/all_markings = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/marking) - for(var/M in all_markings) - if(M in pref.body_markings) - continue - var/decl/sprite_accessory/accessory = all_markings[M] - mob_bodytype = mob_species.get_bodytype_by_name(pref.bodytype) - if(!is_type_in_list(accessory, disallowed_markings) && accessory.accessory_is_available(preference_mob(), mob_species, mob_bodytype)) - usable_markings += accessory - - var/decl/sprite_accessory/new_marking = input(user, "Choose a body marking:", CHARACTER_PREFERENCE_INPUT_TITLE) as null|anything in usable_markings + var/decl/sprite_accessory/new_marking = input(user, "Choose a body marking:", CHARACTER_PREFERENCE_INPUT_TITLE) as null|anything in get_usable_markings(preference_mob(), mob_species, mob_bodytype, pref.body_markings) if(new_marking && CanUseTopic(user)) - pref.body_markings[new_marking.type] = COLOR_BLACK + mob_species = get_species_by_key(pref.species) + mob_bodytype = mob_species.get_bodytype_by_name(pref.bodytype) || mob_species.default_bodytype + if(new_marking in get_usable_markings(preference_mob(), mob_species, mob_bodytype, pref.body_markings)) + pref.body_markings[new_marking.type] = COLOR_BLACK return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["marking_remove"]) @@ -355,6 +355,44 @@ pref.body_markings[M.type] = "[mark_color]" return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_move_down"]) + var/decl/sprite_accessory/M = locate(href_list["marking_move_down"]) + if(istype(M)) + var/current_index = pref.body_markings.Find(M.type) + if(current_index < length(pref.body_markings)) + var/marking_color = pref.body_markings[M.type] + pref.body_markings -= M.type + pref.body_markings.Insert(current_index+1, M.type) + pref.body_markings[M.type] = marking_color + return TOPIC_REFRESH_UPDATE_PREVIEW + return TOPIC_NOACTION + + else if(href_list["marking_move_up"]) + var/decl/sprite_accessory/M = locate(href_list["marking_move_up"]) + if(istype(M)) + var/current_index = pref.body_markings.Find(M.type) + if(current_index > 1) + var/marking_color = pref.body_markings[M.type] + pref.body_markings -= M.type + pref.body_markings.Insert(current_index-1, M.type) + pref.body_markings[M.type] = marking_color + return TOPIC_REFRESH_UPDATE_PREVIEW + return TOPIC_NOACTION + +/datum/category_item/player_setup_item/physical/body/proc/get_usable_markings(mob/pref_mob, decl/species/mob_species, decl/bodytype/mob_bodytype, list/existing_markings) + var/list/disallowed_markings = list() + for (var/M in existing_markings) + var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) + if(length(mark_style.disallows_accessories)) + disallowed_markings |= mark_style.disallows_accessories + var/list/all_markings = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/marking) + for(var/M in all_markings) + if(M in existing_markings) + continue + var/decl/sprite_accessory/accessory = all_markings[M] + if(!is_type_in_list(accessory, disallowed_markings) && accessory.accessory_is_available(pref_mob, mob_species, mob_bodytype)) + LAZYADD(., accessory) + /datum/category_item/player_setup_item/proc/ResetAllHair() ResetHair() ResetFacialHair() diff --git a/code/modules/client/preference_setup/general/03_aspects.dm b/code/modules/client/preference_setup/general/03_aspects.dm index 6d7448a0b3d..ccebf2a6c27 100644 --- a/code/modules/client/preference_setup/general/03_aspects.dm +++ b/code/modules/client/preference_setup/general/03_aspects.dm @@ -61,7 +61,8 @@ pref.prune_invalid_aspects() var/modified_list = FALSE - while(get_aspect_total() > config.max_character_aspects) + var/max_character_aspects = get_config_value(/decl/config/num/max_character_aspects) + while(get_aspect_total() > max_character_aspects) // Find a costly aspect with no children to drop until our cost is below the threshold. var/can_drop_aspect = FALSE @@ -105,11 +106,12 @@ var/aspect_total = get_aspect_total() // Change our formatting data if needed. var/fcolor = COLOR_CYAN_BLUE - if(aspect_total == config.max_character_aspects) + var/max_character_aspects = get_config_value(/decl/config/num/max_character_aspects) + if(aspect_total == max_character_aspects) fcolor = COLOR_FONT_ORANGE // Build the string. - . = list("
    [aspect_total]/[config.max_character_aspects] points spent.

    ") + . = list("
    [aspect_total]/[max_character_aspects] points spent.

    ") if(!selected_category || !(selected_category in available_categories)) selected_category = available_categories[1] @@ -169,7 +171,7 @@ if(A.children) aspects_to_remove |= A.children // Enable aspect. - else if(get_aspect_total() + A.aspect_cost <= config.max_character_aspects) + else if(get_aspect_total() + A.aspect_cost <= get_config_value(/decl/config/num/max_character_aspects)) pref.aspects |= A.type // Tidy up in case we're in an incoherent state for whatever reason. pref.prune_invalid_aspects() diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm index d6c0e0cabee..150c22bc320 100644 --- a/code/modules/client/preference_setup/global/01_ui.dm +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -151,4 +151,4 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) return ..() /proc/can_select_ooc_color(var/mob/user) - return config.allow_admin_ooccolor && check_rights(R_ADMIN, 0, user) + return get_config_value(/decl/config/toggle/admin_ooccolor) && check_rights(R_ADMIN, 0, user) diff --git a/code/modules/client/preference_setup/global/05_settings.dm b/code/modules/client/preference_setup/global/05_settings.dm index d96ac73e0e9..12e2816db9a 100644 --- a/code/modules/client/preference_setup/global/05_settings.dm +++ b/code/modules/client/preference_setup/global/05_settings.dm @@ -42,7 +42,7 @@ pref.preference_values -= key pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) - pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot)) + pref.default_slot = sanitize_integer(pref.default_slot, 1, get_config_value(/decl/config/num/character_slots), initial(pref.default_slot)) /datum/category_item/player_setup_item/player_global/settings/content(var/mob/user) . = list() diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index 4fad6a41849..9e536f545f3 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -13,7 +13,7 @@ /datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data) return -/datum/gear_tweak/proc/tweak_item(var/user, var/obj/item/I, var/metadata) +/datum/gear_tweak/proc/tweak_item(mob/user, obj/item/gear, metadata) return GEAR_TWEAK_SKIPPED /datum/gear_tweak/proc/tweak_description(var/description, var/metadata) @@ -41,10 +41,10 @@ return input(user, "Choose a color.", title, metadata) as null|anything in valid_colors return input(user, "Choose a color.", title, metadata) as color|null -/datum/gear_tweak/color/tweak_item(var/user, var/obj/item/I, var/metadata) +/datum/gear_tweak/color/tweak_item(mob/user, obj/item/gear, metadata) if(valid_colors && !(metadata in valid_colors)) return GEAR_TWEAK_SKIPPED - I.color = sanitize_hexcolor(metadata, I.color) + gear.color = sanitize_hexcolor(metadata, gear.color) return GEAR_TWEAK_SUCCESS /* @@ -134,7 +134,7 @@ else return metadata -/datum/gear_tweak/contents/tweak_item(var/owner, var/obj/item/I, var/list/metadata) +/datum/gear_tweak/contents/tweak_item(mob/user, obj/item/gear, metadata) if(length(metadata) != length(valid_contents)) return GEAR_TWEAK_SKIPPED for(var/i = 1 to valid_contents.len) @@ -148,7 +148,7 @@ else path = contents[metadata[i]] if(path) - new path(I) + new path(gear) else log_debug("Failed to tweak item: Index [i] in [json_encode(metadata)] did not result in a valid path. Valid contents: [json_encode(valid_contents)]") return GEAR_TWEAK_SUCCESS @@ -175,7 +175,7 @@ if(!.) return metadata -/datum/gear_tweak/reagents/tweak_item(var/user, var/obj/item/I, var/list/metadata) +/datum/gear_tweak/reagents/tweak_item(mob/user, obj/item/gear, metadata) if(metadata == "None") return GEAR_TWEAK_SKIPPED var/reagent @@ -183,8 +183,8 @@ reagent = valid_reagents[pick(valid_reagents)] else reagent = valid_reagents[metadata] - if(reagent) - I.reagents.add_reagent(reagent, REAGENTS_FREE_SPACE(I.reagents)) + if(reagent && gear.reagents) + gear.reagents.add_reagent(reagent, REAGENTS_FREE_SPACE(gear.reagents)) return GEAR_TWEAK_SUCCESS /* @@ -202,11 +202,11 @@ src.additional_arguments = additional_arguments ..() -/datum/gear_tweak/custom_setup/tweak_item(var/user, var/item) +/datum/gear_tweak/custom_setup/tweak_item(mob/user, obj/item/gear, metadata) var/arglist = list(user) if(length(additional_arguments)) arglist += additional_arguments - call(item, custom_setup_proc)(arglist(arglist)) + call(gear, custom_setup_proc)(arglist(arglist)) return GEAR_TWEAK_SUCCESS /* @@ -358,31 +358,31 @@ for(var/i in 1 to TWEAKABLE_COMPUTER_PART_SLOTS) . += 1 -/datum/gear_tweak/tablet/tweak_item(var/user, var/obj/item/modular_computer/tablet/I, var/list/metadata) +/datum/gear_tweak/tablet/tweak_item(mob/user, obj/item/gear, metadata) if(length(metadata) < TWEAKABLE_COMPUTER_PART_SLOTS) return GEAR_TWEAK_SKIPPED - var/datum/extension/assembly/modular_computer/assembly = get_extension(I, /datum/extension/assembly) + var/datum/extension/assembly/modular_computer/assembly = get_extension(gear, /datum/extension/assembly) if(ValidProcessors[metadata[1]]) var/t = ValidProcessors[metadata[1]] - assembly.add_replace_component(null, PART_CPU, new t(I)) + assembly.add_replace_component(null, PART_CPU, new t(gear)) if(ValidBatteries[metadata[2]]) var/t = ValidBatteries[metadata[2]] - assembly.add_replace_component(null, PART_BATTERY, new t(I)) + assembly.add_replace_component(null, PART_BATTERY, new t(gear)) if(ValidHardDrives[metadata[3]]) var/t = ValidHardDrives[metadata[3]] - assembly.add_replace_component(null, PART_HDD, new t(I)) + assembly.add_replace_component(null, PART_HDD, new t(gear)) if(ValidNetworkCards[metadata[4]]) var/t = ValidNetworkCards[metadata[4]] - assembly.add_replace_component(null, PART_NETWORK, new t(I)) + assembly.add_replace_component(null, PART_NETWORK, new t(gear)) if(ValidNanoPrinters[metadata[5]]) var/t = ValidNanoPrinters[metadata[5]] - assembly.add_replace_component(null, PART_PRINTER, new t(I)) + assembly.add_replace_component(null, PART_PRINTER, new t(gear)) if(ValidCardSlots[metadata[6]]) var/t = ValidCardSlots[metadata[6]] - assembly.add_replace_component(null, PART_CARD, new t(I)) + assembly.add_replace_component(null, PART_CARD, new t(gear)) if(ValidTeslaLinks[metadata[7]]) var/t = ValidTeslaLinks[metadata[7]] - assembly.add_replace_component(null, PART_TESLA, new t(I)) + assembly.add_replace_component(null, PART_TESLA, new t(gear)) return GEAR_TWEAK_SUCCESS /* @@ -409,9 +409,9 @@ var/global/datum/gear_tweak/custom_name/gear_tweak_free_name = new() return input(user, "Choose an item name.", CHARACTER_PREFERENCE_INPUT_TITLE, metadata) as null|anything in valid_custom_names return sanitize(input(user, "Choose the item's name. Leave it blank to use the default name.", "Item Name", metadata) as text|null, MAX_LNAME_LEN) -/datum/gear_tweak/custom_name/tweak_item(obj/item/I, metadata) +/datum/gear_tweak/custom_name/tweak_item(mob/user, obj/item/gear, metadata) if(metadata) - I.name = metadata + gear.set_custom_name(metadata) return GEAR_TWEAK_SUCCESS return GEAR_TWEAK_SKIPPED @@ -439,8 +439,8 @@ var/global/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new() return input(user, "Choose an item description.", CHARACTER_PREFERENCE_INPUT_TITLE, metadata) as null|anything in valid_custom_desc return sanitize(input(user, "Choose the item's description. Leave it blank to use the default description.", "Item Description", metadata) as message|null) -/datum/gear_tweak/custom_desc/tweak_item(obj/item/I, metadata) +/datum/gear_tweak/custom_desc/tweak_item(mob/user, obj/item/gear, metadata) if(metadata) - I.desc = metadata + gear.set_custom_desc(metadata) return GEAR_TWEAK_SUCCESS return GEAR_TWEAK_SKIPPED diff --git a/code/modules/client/preference_setup/loadout/lists/accessories.dm b/code/modules/client/preference_setup/loadout/lists/accessories.dm index 24d0af7d405..110807d2c65 100644 --- a/code/modules/client/preference_setup/loadout/lists/accessories.dm +++ b/code/modules/client/preference_setup/loadout/lists/accessories.dm @@ -28,7 +28,7 @@ /decl/loadout_option/accessory/tie_color name = "colored tie" path = /obj/item/clothing/accessory - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/accessory/tie_color/get_gear_tweak_options() . = ..() @@ -45,7 +45,7 @@ /decl/loadout_option/accessory/necklace name = "necklace, colour select" path = /obj/item/clothing/accessory/necklace - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/accessory/bowtie name = "bowtie, horrible" @@ -54,10 +54,10 @@ /decl/loadout_option/accessory/bowtie/color name = "bowtie, colour select" path = /obj/item/clothing/accessory/bowtie/color - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/accessory/bracelet name = "bracelet, color select" path = /obj/item/clothing/accessory/bracelet cost = 1 - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION diff --git a/code/modules/client/preference_setup/loadout/lists/augmentations.dm b/code/modules/client/preference_setup/loadout/lists/augmentations.dm index fc7caa2e4cf..1ae8245c615 100644 --- a/code/modules/client/preference_setup/loadout/lists/augmentations.dm +++ b/code/modules/client/preference_setup/loadout/lists/augmentations.dm @@ -4,7 +4,7 @@ /decl/loadout_option/augmentation category = /decl/loadout_category/augmentation abstract_type = /decl/loadout_option/augmentation - flags = GEAR_NO_EQUIP | GEAR_NO_FINGERPRINTS + loadout_flags = GEAR_NO_EQUIP | GEAR_NO_FINGERPRINTS custom_setup_proc = /obj/item/proc/AttemptAugmentation custom_setup_proc_arguments = list(BP_CHEST) diff --git a/code/modules/client/preference_setup/loadout/lists/clothing.dm b/code/modules/client/preference_setup/loadout/lists/clothing.dm index 9b9bb7b3a98..b39318110f3 100644 --- a/code/modules/client/preference_setup/loadout/lists/clothing.dm +++ b/code/modules/client/preference_setup/loadout/lists/clothing.dm @@ -10,12 +10,12 @@ name = "flannel (colorable)" path = /obj/item/clothing/accessory/toggleable/flannel slot = slot_tie_str - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/scarf name = "scarf" path = /obj/item/clothing/accessory/scarf - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/hawaii name = "hawaii shirt" @@ -33,7 +33,7 @@ /decl/loadout_option/clothing/vest name = "suit vest, colour select" path = /obj/item/clothing/accessory/toggleable - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/suspenders name = "suspenders" @@ -42,22 +42,22 @@ /decl/loadout_option/clothing/suspenders/colorable name = "suspenders, colour select" path = /obj/item/clothing/accessory/suspenders/colorable - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/wcoat name = "waistcoat, colour select" path = /obj/item/clothing/accessory/wcoat - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/zhongshan name = "zhongshan jacket, colour select" path = /obj/item/clothing/accessory/toggleable/zhongshan - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/dashiki name = "dashiki selection" path = /obj/item/clothing/accessory/dashiki - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/clothing/thawb name = "thawb" @@ -66,19 +66,19 @@ /decl/loadout_option/clothing/sherwani name = "sherwani, colour select" path = /obj/item/clothing/accessory/sherwani - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/qipao name = "qipao blouse, colour select" path = /obj/item/clothing/accessory/qipao - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/sweater name = "turtleneck sweater, colour select" path = /obj/item/clothing/accessory/sweater - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/clothing/tangzhuang name = "tangzhuang jacket, colour select" path = /obj/item/clothing/accessory/tangzhuang - flags = GEAR_HAS_COLOR_SELECTION \ No newline at end of file + loadout_flags = GEAR_HAS_COLOR_SELECTION \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/lists/eyegear.dm b/code/modules/client/preference_setup/loadout/lists/eyegear.dm index 27ead013454..8d06da5b399 100644 --- a/code/modules/client/preference_setup/loadout/lists/eyegear.dm +++ b/code/modules/client/preference_setup/loadout/lists/eyegear.dm @@ -40,4 +40,4 @@ /decl/loadout_option/eyes/blindfold name = "blindfold" path = /obj/item/clothing/glasses/blindfold - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION diff --git a/code/modules/client/preference_setup/loadout/lists/footwear.dm b/code/modules/client/preference_setup/loadout/lists/footwear.dm index 17eb7b047df..695956ce4b0 100644 --- a/code/modules/client/preference_setup/loadout/lists/footwear.dm +++ b/code/modules/client/preference_setup/loadout/lists/footwear.dm @@ -9,7 +9,7 @@ /decl/loadout_option/shoes/athletic name = "athletic shoes, colour select" path = /obj/item/clothing/shoes/athletic - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/shoes/boots name = "boot selection" @@ -53,12 +53,12 @@ /decl/loadout_option/shoes/flats name = "flats, colour select" path = /obj/item/clothing/shoes/flats - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/shoes/high name = "high tops selection" path = /obj/item/clothing/shoes/color/hightops - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/shoes/sandal name = "wooden sandals" @@ -67,4 +67,4 @@ /decl/loadout_option/shoes/heels name = "high heels, colour select" path = /obj/item/clothing/shoes/heels - flags = GEAR_HAS_COLOR_SELECTION \ No newline at end of file + loadout_flags = GEAR_HAS_COLOR_SELECTION \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/lists/gloves.dm b/code/modules/client/preference_setup/loadout/lists/gloves.dm index 33d0021e801..0d36482365a 100644 --- a/code/modules/client/preference_setup/loadout/lists/gloves.dm +++ b/code/modules/client/preference_setup/loadout/lists/gloves.dm @@ -9,13 +9,13 @@ /decl/loadout_option/gloves/colored name = "gloves, colored" - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION path = /obj/item/clothing/gloves/color /decl/loadout_option/gloves/evening name = "gloves, evening, colour select" path = /obj/item/clothing/gloves/color/evening - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/ring name = "ring" diff --git a/code/modules/client/preference_setup/loadout/lists/headwear.dm b/code/modules/client/preference_setup/loadout/lists/headwear.dm index 09f4888f57b..5fca5f8753e 100644 --- a/code/modules/client/preference_setup/loadout/lists/headwear.dm +++ b/code/modules/client/preference_setup/loadout/lists/headwear.dm @@ -9,7 +9,7 @@ /decl/loadout_option/head/beret name = "beret, colour select" path = /obj/item/clothing/head/beret/plaincolor - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION description = "A simple, solid color beret. This one has no emblems or insignia on it." /decl/loadout_option/head/bandana @@ -24,17 +24,17 @@ /decl/loadout_option/head/beanie name = "beanie, color select" path = /obj/item/clothing/head/beanie - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/bow name = "hair bow, colour select" path = /obj/item/clothing/head/hairflower/bow - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/flat_cap name = "flat cap, colour select" path = /obj/item/clothing/head/flatcap - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/cap name = "cap selection" @@ -118,22 +118,22 @@ /decl/loadout_option/head/hijab name = "hijab, colour select" path = /obj/item/clothing/head/hijab - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/kippa name = "kippa, colour select" path = /obj/item/clothing/head/kippa - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/turban name = "turban, colour select" path = /obj/item/clothing/head/turban - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/taqiyah name = "taqiyah, colour select" path = /obj/item/clothing/head/taqiyah - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/head/rastacap name = "rastacap" diff --git a/code/modules/client/preference_setup/loadout/lists/misc.dm b/code/modules/client/preference_setup/loadout/lists/misc.dm index deb41f06f3d..a6543d4d4a2 100644 --- a/code/modules/client/preference_setup/loadout/lists/misc.dm +++ b/code/modules/client/preference_setup/loadout/lists/misc.dm @@ -51,12 +51,12 @@ /decl/loadout_option/coffeecup name = "coffee cup" path = /obj/item/chems/drinks/glass2/coffeecup - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/towel name = "towel" path = /obj/item/towel - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/mirror name = "handheld mirror" @@ -65,12 +65,12 @@ /decl/loadout_option/lipstick name = "lipstick selection" path = /obj/item/lipstick - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/comb name = "plastic comb" path = /obj/item/haircomb - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/mask name = "sterile mask" @@ -152,7 +152,7 @@ /decl/loadout_option/wallet name = "wallet, colour select" path = /obj/item/storage/wallet - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/wallet_poly name = "wallet, polychromic" @@ -164,4 +164,4 @@ name = "multi-tool" path = /obj/item/knife/folding/swiss cost = 4 - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION diff --git a/code/modules/client/preference_setup/loadout/lists/suits.dm b/code/modules/client/preference_setup/loadout/lists/suits.dm index 11f80c40219..eccfe386093 100644 --- a/code/modules/client/preference_setup/loadout/lists/suits.dm +++ b/code/modules/client/preference_setup/loadout/lists/suits.dm @@ -10,7 +10,7 @@ name = "poncho selection" path = /obj/item/clothing/suit/poncho/colored cost = 1 - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/suit/suit_jacket name = "standard suit jackets" @@ -28,17 +28,17 @@ /decl/loadout_option/suit/custom_suit_jacket name = "suit jacket, colour select" path = /obj/item/clothing/suit/storage/toggle/suit - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/suit/hoodie name = "hoodie, colour select" path = /obj/item/clothing/suit/storage/toggle/hoodie - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/suit/coat name = "coat, colour select" path = /obj/item/clothing/suit/storage/toggle/labcoat/coat - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/suit/leather name = "jacket selection" @@ -60,7 +60,7 @@ /decl/loadout_option/suit/track name = "track jacket selection" path = /obj/item/clothing/suit/storage/toggle/track - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/suit/blueapron name = "apron, blue" @@ -89,11 +89,11 @@ /decl/loadout_option/suit/letterman_custom name = "letterman jacket, colour select" path = /obj/item/clothing/suit/letterman - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION cost = 1 /decl/loadout_option/suit/cloak name = "plain cloak" path = /obj/item/clothing/accessory/cloak - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION cost = 3 diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 125764766ca..0db5d7f321b 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -9,12 +9,12 @@ /decl/loadout_option/uniform/jumpsuit name = "jumpsuit, colour select" path = /obj/item/clothing/under/color - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/shortjumpskirt name = "short jumpskirt, colour select" path = /obj/item/clothing/under/shortjumpskirt - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/blackjumpshorts name = "black jumpsuit shorts" @@ -76,62 +76,62 @@ /decl/loadout_option/uniform/cheongsam name = "cheongsam, colour select" path = /obj/item/clothing/under/cheongsam - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/abaya name = "abaya, colour select" path = /obj/item/clothing/under/abaya - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/skirt name = "skirt selection" path = /obj/item/clothing/under/skirt - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/skirt_c name = "short skirt, colour select" path = /obj/item/clothing/under/skirt_c - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/skirt_c/dress name = "simple dress, colour select" path = /obj/item/clothing/under/skirt_c/dress - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/casual_pants name = "casual pants selection" path = /obj/item/clothing/pants/casual - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/formal_pants name = "formal pants selection" path = /obj/item/clothing/pants/formal - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/formal_pants/baggycustom name = "baggy suit pants, colour select" path = /obj/item/clothing/pants/baggy - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/shorts name = "shorts selection" path = /obj/item/clothing/pants/shorts - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/shorts/custom name = "athletic shorts, colour select" path = /obj/item/clothing/pants/shorts/athletic - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/turtleneck name = "sweater, colour select" path = /obj/item/clothing/under/psych/turtleneck/sweater - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/kimono name = "kimono, colour select" path = /obj/item/clothing/under/kimono - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/frontier name = "frontier clothes" diff --git a/code/modules/client/preference_setup/loadout/lists/utility.dm b/code/modules/client/preference_setup/loadout/lists/utility.dm index 32947920f85..168a0d635e7 100644 --- a/code/modules/client/preference_setup/loadout/lists/utility.dm +++ b/code/modules/client/preference_setup/loadout/lists/utility.dm @@ -67,7 +67,7 @@ /decl/loadout_option/utility/umbrella name = "umbrella" path = /obj/item/umbrella - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/utility/knives/get_gear_tweak_options() . = ..() diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index d6f7f86999e..93a1eefd41c 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -38,7 +38,7 @@ var/global/list/gear_datums = list() return /decl/loadout_option/proc/can_afford(var/mob/user, var/datum/preferences/pref) - if(cost > 0 && (pref.total_loadout_cost + cost) > config.max_gear_cost) + if(cost > 0 && (pref.total_loadout_cost + cost) > get_config_value(/decl/config/num/max_gear_cost)) return FALSE var/decl/loadout_category/LC = GET_DECL(category) if(!LC || pref.total_loadout_selections[category] >= LC.max_selections) @@ -77,14 +77,15 @@ var/global/list/gear_datums = list() /datum/category_item/player_setup_item/loadout/sanitize_character() - pref.gear_slot = sanitize_integer(pref.gear_slot, 1, config.loadout_slots, initial(pref.gear_slot)) + var/loadout_slots = get_config_value(/decl/config/num/loadout_slots) + pref.gear_slot = sanitize_integer(pref.gear_slot, 1, loadout_slots, initial(pref.gear_slot)) if(!islist(pref.gear_list)) pref.gear_list = list() - if(pref.gear_list.len < config.loadout_slots) - pref.gear_list.len = config.loadout_slots + if(pref.gear_list.len < loadout_slots) + pref.gear_list.len = loadout_slots - for(var/index = 1 to config.loadout_slots) + for(var/index = 1 to loadout_slots) pref.total_loadout_cost = 0 pref.total_loadout_selections = list() @@ -118,14 +119,15 @@ var/global/list/gear_datums = list() recalculate_loadout_cost() var/fcolor = COLOR_CYAN_BLUE - if(pref.total_loadout_cost < config.max_gear_cost) + var/max_gear_cost = get_config_value(/decl/config/num/max_gear_cost) + if(pref.total_loadout_cost < max_gear_cost) fcolor = COLOR_FONT_ORANGE . += "" . += "" @@ -296,14 +298,14 @@ var/global/list/gear_datums = list() return TOPIC_REFRESH_UPDATE_PREVIEW if(href_list["next_slot"]) pref.gear_slot = pref.gear_slot+1 - if(pref.gear_slot > config.loadout_slots) + if(pref.gear_slot > get_config_value(/decl/config/num/loadout_slots)) pref.gear_slot = 1 recalculate_loadout_cost() return TOPIC_REFRESH_UPDATE_PREVIEW if(href_list["prev_slot"]) pref.gear_slot = pref.gear_slot-1 if(pref.gear_slot < 1) - pref.gear_slot = config.loadout_slots + pref.gear_slot = get_config_value(/decl/config/num/loadout_slots) recalculate_loadout_cost() return TOPIC_REFRESH_UPDATE_PREVIEW if(href_list["select_category"]) @@ -337,7 +339,7 @@ var/global/list/gear_datums = list() var/list/allowed_roles // Roles that can spawn with this item. var/list/allowed_branches // Service branches that can spawn with it. var/list/allowed_skills // Skills required to spawn with this item. - var/flags // Special tweaks in new + var/loadout_flags // Special tweaks in new var/custom_setup_proc // Special tweak in New var/list/custom_setup_proc_arguments // Special tweak in New var/category = /decl/loadout_category // Type to use for categorization and organization. @@ -349,6 +351,10 @@ var/global/list/gear_datums = list() abstract_type = /decl/loadout_option /decl/loadout_option/Initialize() + + if(get_config_value(/decl/config/toggle/allow_loadout_customization)) + loadout_flags |= GEAR_HAS_CUSTOM_SELECTION + . = ..() if(name && (!global.using_map.loadout_blacklist || !(type in global.using_map.loadout_blacklist))) @@ -357,18 +363,18 @@ var/global/list/gear_datums = list() ADD_SORTED(LC.gear, name, /proc/cmp_text_asc) LC.gear[name] = src - if(FLAGS_EQUALS(flags, GEAR_HAS_TYPE_SELECTION|GEAR_HAS_SUBTYPE_SELECTION)) + if(FLAGS_EQUALS(loadout_flags, GEAR_HAS_TYPE_SELECTION|GEAR_HAS_SUBTYPE_SELECTION)) CRASH("May not have both type and subtype selection tweaks") if(!description) var/obj/O = path description = initial(O.desc) - if(flags & GEAR_HAS_COLOR_SELECTION) + if(loadout_flags & GEAR_HAS_COLOR_SELECTION) gear_tweaks += gear_tweak_free_color_choice() - if(flags & GEAR_HAS_TYPE_SELECTION) + if(loadout_flags & GEAR_HAS_TYPE_SELECTION) gear_tweaks += new /datum/gear_tweak/path/type(path) - if(flags & GEAR_HAS_SUBTYPE_SELECTION) + if(loadout_flags & GEAR_HAS_SUBTYPE_SELECTION) gear_tweaks += new /datum/gear_tweak/path/subtype(path) - if(flags & GEAR_HAS_CUSTOM_SELECTION) + if(loadout_flags & GEAR_HAS_CUSTOM_SELECTION) gear_tweaks += gear_tweak_free_name gear_tweaks += gear_tweak_free_desc if(custom_setup_proc) @@ -412,7 +418,7 @@ var/global/list/gear_datums = list() gt.tweak_gear_data(islist(metadata) && metadata["[gt]"], gd) var/item = new gd.path(gd.location) for(var/datum/gear_tweak/gt in gear_tweaks) - gt.tweak_item(user, item, islist(metadata) && metadata["[gt]"]) + gt.tweak_item(user, item, (islist(metadata) && metadata["[gt]"])) . = item if(metadata && !islist(metadata)) PRINT_STACK_TRACE("Loadout spawn_item() proc received non-null non-list metadata: '[json_encode(metadata)]'") @@ -427,6 +433,7 @@ var/global/list/gear_datums = list() . = item if(!old_item) return + item.handle_loadout_equip_replacement(old_item) if(old_item.type != item.type) place_in_storage_or_drop(wearer, old_item) else @@ -457,10 +464,10 @@ var/global/list/gear_datums = list() if(QDELETED(item)) return - if(!(flags & GEAR_NO_FINGERPRINTS)) + if(!(loadout_flags & GEAR_NO_FINGERPRINTS)) item.add_fingerprint(H) - if(flags & GEAR_NO_EQUIP) + if(loadout_flags & GEAR_NO_EQUIP) return return item diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index 468760abdd5..0ff94c20d9b 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -426,7 +426,7 @@ var/datum/mil_branch/B = mil_branches.get_branch_by_type(T) dat += "
  • [B.name]: [job.get_ranks(B.name)]" dat += "
    " - if(config.wikiurl) + if(get_config_value(/decl/config/text/wikiurl)) dat += "Open wiki page in browser" var/description = job.get_description_blurb() @@ -438,7 +438,7 @@ else if(href_list["job_wiki"]) var/rank = href_list["job_wiki"] - open_link(user,"[config.wikiurl][rank]") + open_link(user,"[get_config_value(/decl/config/text/wikiurl)][rank]") return ..() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ac46b89ff8a..6c4b80e00d2 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -244,7 +244,6 @@ var/global/list/time_prefs_fixed = list() var/obj/screen/setup_preview/bg/BG = LAZYACCESS(char_render_holders, "BG") if(!BG) BG = new - BG.icon = 'icons/effects/32x32.dmi' BG.pref = src LAZYSET(char_render_holders, "BG", BG) client.screen |= BG @@ -279,13 +278,13 @@ var/global/list/time_prefs_fixed = list() char_render_holders = null /datum/preferences/proc/process_link(mob/user, list/href_list) - - if(!user) return - if(isliving(user)) return - + if(!user) + return + if(isliving(user)) + return if(href_list["preference"] == "open_whitelist_forum") - if(config.forumurl) - direct_output(user, link(config.forumurl)) + if(get_config_value(/decl/config/text/forumurl)) + direct_output(user, link(get_config_value(/decl/config/text/forumurl))) else to_chat(user, "The forum URL is not set in the server configuration.") return @@ -352,9 +351,10 @@ var/global/list/time_prefs_fixed = list() if(be_random_name) var/decl/cultural_info/culture = GET_DECL(cultural_info[TAG_CULTURE]) - if(culture) real_name = culture.get_random_name(gender) + if(culture) + real_name = culture.get_random_name(gender) - if(config.humans_need_surnames) + if(get_config_value(/decl/config/toggle/humans_need_surnames)) var/firstspace = findtext(real_name, " ") var/name_length = length(real_name) if(!firstspace) //we need a surname @@ -367,20 +367,17 @@ var/global/list/time_prefs_fixed = list() character.set_gender(gender) character.blood_type = blood_type - character.eye_colour = eye_colour + character.set_eye_colour(eye_colour, skip_update = TRUE) - character.h_style = h_style - character.hair_colour = hair_colour + character.set_hairstyle(h_style, skip_update = TRUE) + character.set_hair_colour(hair_colour, skip_update = TRUE) - character.f_style = f_style - character.facial_hair_colour = facial_hair_colour + character.set_facial_hairstyle(f_style, skip_update = TRUE) + character.set_facial_hair_colour(facial_hair_colour, skip_update = TRUE) - character.skin_colour = skin_colour + character.set_skin_colour(skin_colour, skip_update = TRUE) character.skin_tone = skin_tone - character.h_style = h_style - character.f_style = f_style - QDEL_NULL_LIST(character.worn_underwear) character.worn_underwear = list() @@ -466,7 +463,8 @@ var/global/list/time_prefs_fixed = list() dat += "
    " dat += "Select a character slot to load
    " - for(var/i=1, i<= config.character_slots, i++) + var/character_slots = get_config_value(/decl/config/num/character_slots) + for(var/i = 1 to character_slots) var/name = (slot_names && slot_names[get_slot_key(i)]) || "Character[i]" if(i==default_slot) name = "[name]" diff --git a/code/modules/client/preferences_persist.dm b/code/modules/client/preferences_persist.dm index d18dd143f3a..c9f55d56d8c 100644 --- a/code/modules/client/preferences_persist.dm +++ b/code/modules/client/preferences_persist.dm @@ -55,7 +55,7 @@ slot = default_slot if(slot != SAVE_RESET) // SAVE_RESET will reset the slot as though it does not exist, but keep the current slot for saving purposes. - slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) + slot = sanitize_integer(slot, 1, get_config_value(/decl/config/num/character_slots), initial(default_slot)) if(slot != default_slot) default_slot = slot SScharacter_setup.queue_preferences_save(src) diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 815aba407a7..76692d83e6a 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -1,14 +1,50 @@ -/decl/spawnpoint - var/name // Name used in preference setup. - var/msg // Message to display on the arrivals computer. - var/list/turfs // List of turfs to spawn on. +// This proc will return a random valid respawn location, defaulting to +// observer spawn points if nothing else is available. Flags can be used to +// filter the spawnpoints considered valid, see code/__defines/spawn.dm. +/proc/get_random_spawn_turf(var/mob/spawning, var/check_flags) + var/list/spawn_locs = list() + var/list/all_spawns = decls_repository.get_decls_of_subtype(/decl/spawnpoint) + for(var/spawn_type in all_spawns) + var/decl/spawnpoint/spawn_data = all_spawns[spawn_type] + if((!check_flags || (spawn_data.spawn_flags & check_flags))) + var/add_spawn_turfs = spawn_data.get_spawn_turfs(spawning) + if(length(add_spawn_turfs)) + spawn_locs |= add_spawn_turfs + . = SAFEPICK(spawn_locs) + if(!.) + // Observer spawn is guaranteed by CI to be populated. + var/decl/spawnpoint/observer_spawn = GET_DECL(/decl/spawnpoint/observer) + return pick(observer_spawn.get_spawn_turfs()) +/decl/spawnpoint + abstract_type = /decl/spawnpoint + decl_flags = DECL_FLAG_MANDATORY_UID + /// Name displayed in preference setup. + var/name + /// Message to display on the arrivals computer. If null, no message will be sent. + var/spawn_announcement + /// Determines validity for get_random_spawn_turf() + var/spawn_flags = (SPAWN_FLAG_GHOSTS_CAN_SPAWN | SPAWN_FLAG_JOBS_CAN_SPAWN | SPAWN_FLAG_PRISONERS_CAN_SPAWN | SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) + /// List of turfs to spawn on. Retrieved via get_spawn_turfs(). + VAR_PRIVATE/list/_spawn_turfs + /// A list of job types that are allowed to use this spawnpoint. var/list/restrict_job + /// A list of event categories that are allowed to use this spawnpoint (ex. ASSIGNMENT_JANITOR) var/list/restrict_job_event_categories - + /// A list of job types that are not allowed to use this spawnpoint. var/list/disallow_job + /// A list of event categories that are not allowed to use this spawnpoint (ex. ASSIGNMENT_JANITOR) var/list/disallow_job_event_categories +// Returns the spawn list. Mob is supplied in case overrides want to check prefs. +/decl/spawnpoint/proc/get_spawn_turfs(var/mob/spawning) + return _spawn_turfs + +// Adds to the spawn list. Uses a proc for subtype overrides. +/decl/spawnpoint/proc/add_spawn_turf(var/turf/adding) + LAZYDISTINCTADD(_spawn_turfs, adding) + +// Validates that a job is allowed to use this spawn point. /decl/spawnpoint/proc/check_job_spawning(var/datum/job/job) if(restrict_job && !(job.type in restrict_job) && !(job.title in restrict_job)) @@ -33,30 +69,31 @@ /decl/spawnpoint/proc/after_join(mob/victim) return -/decl/spawnpoint/arrivals - name = "Arrivals" - msg = "has arrived on the station" - -/decl/spawnpoint/arrivals/Initialize() - . = ..() - turfs = global.latejoin_locations +// Dummy spawnpoint for ghosts. +/decl/spawnpoint/observer + name = "Observer" + uid = "spawn_observer" + spawn_flags = SPAWN_FLAG_GHOSTS_CAN_SPAWN -/decl/spawnpoint/gateway - name = "Gateway" - msg = "has completed translation from offsite gateway" +/obj/abstract/landmark/latejoin/observer + spawn_decl = /decl/spawnpoint/observer -/decl/spawnpoint/gateway/Initialize() - . = ..() - turfs = global.latejoin_gateway_locations +// The 'default' latejoin spawn location. +/decl/spawnpoint/arrivals + name = "Arrivals" + spawn_announcement = "has arrived on the station" + uid = "spawn_arrivals" +// Spawn the mob inside a cryopod at the spawn loc. /decl/spawnpoint/cryo name = "Cryogenic Storage" - msg = "has completed cryogenic revival" + spawn_announcement = "has completed cryogenic revival" disallow_job_event_categories = list(ASSIGNMENT_ROBOT) + uid = "spawn_cryo" + spawn_flags = (SPAWN_FLAG_GHOSTS_CAN_SPAWN | SPAWN_FLAG_JOBS_CAN_SPAWN) -/decl/spawnpoint/cryo/Initialize() - . = ..() - turfs = global.latejoin_cryo_locations +/obj/abstract/landmark/latejoin/cryo + spawn_decl = /decl/spawnpoint/cryo /decl/spawnpoint/cryo/after_join(mob/living/carbon/human/victim) if(!istype(victim) || victim.buckled) // They may have spawned with a wheelchair; don't move them into a pod in that case. @@ -79,11 +116,13 @@ to_chat(victim,SPAN_NOTICE("You are slowly waking up from the cryostasis aboard [global.using_map.full_name]. It might take a few seconds.")) return +// Spawnpoint used specifically for robots. /decl/spawnpoint/cyborg name = "Robot Storage" - msg = "has been activated from storage" + spawn_announcement = "has been activated from storage" restrict_job_event_categories = list(ASSIGNMENT_ROBOT) + spawn_flags = SPAWN_FLAG_JOBS_CAN_SPAWN + uid = "spawn_cyborg" -/decl/spawnpoint/cyborg/Initialize() - . = ..() - turfs = global.latejoin_cyborg_locations +/obj/abstract/landmark/latejoin/cyborg + spawn_decl = /decl/spawnpoint/cyborg diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 638b0977ea9..d88d8bef264 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -1,8 +1,8 @@ /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 - origin_tech = "{'materials':1,'engineering':1}" - material = /decl/material/solid/cloth + origin_tech = @'{"materials":1,"engineering":1}' + material = /decl/material/solid/organic/cloth var/wizard_garb = 0 var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection. @@ -17,7 +17,6 @@ var/blood_overlay_type = "uniformblood" var/visible_name = "Unknown" var/ironed_state = WRINKLES_DEFAULT - var/smell_state = SMELL_DEFAULT var/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints // if this item covers the feet, the footprints it should leave var/volume_multiplier = 1 var/markings_icon // simple colored overlay that would be applied to the icon @@ -32,7 +31,7 @@ return TRUE // Sort of a placeholder for proper tailoring. -#define RAG_COUNT(X) CEILING((LAZYACCESS(X.matter, /decl/material/solid/cloth) * 0.65) / SHEET_MATERIAL_AMOUNT) +#define RAG_COUNT(X) CEILING((LAZYACCESS(X.matter, /decl/material/solid/organic/cloth) * 0.65) / SHEET_MATERIAL_AMOUNT) /obj/item/clothing/attackby(obj/item/I, mob/user) var/rags = RAG_COUNT(src) @@ -52,14 +51,14 @@ new /obj/item/chems/glass/rag(get_turf(src)) if(loc == user) user.drop_from_inventory(src) - LAZYREMOVE(matter, /decl/material/solid/cloth) + LAZYREMOVE(matter, /decl/material/solid/organic/cloth) physically_destroyed() return TRUE . = ..() // End placeholder. // Updates the vision of the mob wearing the clothing item, if any -/obj/item/clothing/proc/update_vision() +/obj/item/clothing/proc/update_wearer_vision() if(isliving(src.loc)) var/mob/living/L = src.loc L.handle_vision() @@ -68,7 +67,7 @@ /obj/item/clothing/proc/needs_vision_update() return flash_protection || tint -/obj/item/clothing/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) @@ -105,8 +104,14 @@ if(LAZYLEN(new_overlays)) add_overlay(new_overlays) -/obj/item/clothing/proc/change_smell(smell = SMELL_DEFAULT) - smell_state = smell +// Used by washing machines to temporarily make clothes smell +/obj/item/clothing/proc/change_smell(decl/material/odorant, time = 10 MINUTES) + if(!odorant || !odorant.scent) + remove_extension(src, /datum/extension/scent) + return + + set_extension(src, /datum/extension/scent/custom, odorant.scent, odorant.scent_intensity, odorant.scent_descriptor, odorant.scent_range) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/clothing, change_smell)), time, TIMER_UNIQUE | TIMER_OVERRIDE) /obj/item/clothing/proc/get_fibers() . = "material from \a [name]" @@ -131,17 +136,23 @@ if(markings_color && markings_icon) update_icon() -/obj/item/clothing/mob_can_equip(mob/living/M, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) +/obj/item/clothing/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() - if(. && !isnull(bodytype_equip_flags) && ishuman(M) && !(slot in list(slot_l_store_str, slot_r_store_str, slot_s_store_str)) && !(slot in M.get_held_item_slots())) - var/mob/living/carbon/human/H = M - . = (bodytype_equip_flags & BODY_FLAG_EXCLUDE) ? !(bodytype_equip_flags & H.get_bodytype().bodytype_flag) : (bodytype_equip_flags & H.get_bodytype().bodytype_flag) - if(!. && !disable_warning) - to_chat(H, SPAN_WARNING("\The [src] [gender == PLURAL ? "do" : "does"] not fit you.")) + if(!. || slot == slot_s_store_str || (slot in global.pocket_slots)) + return + var/decl/bodytype/root_bodytype = user?.get_bodytype() + if(!root_bodytype || isnull(bodytype_equip_flags) || (slot in user.get_held_item_slots())) + return + if(bodytype_equip_flags & BODY_FLAG_EXCLUDE) + . = !(bodytype_equip_flags & root_bodytype.bodytype_flag) + else + . = (bodytype_equip_flags & root_bodytype.bodytype_flag) + if(!. && !disable_warning) + to_chat(user, SPAN_WARNING("\The [src] [gender == PLURAL ? "do" : "does"] not fit you.")) /obj/item/clothing/equipped(var/mob/user) if(needs_vision_update()) - update_vision() + update_wearer_vision() return ..() /obj/item/clothing/proc/refit_for_bodytype(var/target_bodytype) @@ -186,16 +197,22 @@ if(WRINKLES_NONE) to_chat(user, "It's completely wrinkle-free!") - switch(smell_state) - if(SMELL_CLEAN) - to_chat(user, "It smells clean!") - if(SMELL_STINKY) - to_chat(user, "It's quite stinky!") - var/rags = RAG_COUNT(src) if(rags) to_chat(user, SPAN_SUBTLE("With a sharp object, you could cut \the [src] up into [rags] rag\s.")) + var/obj/item/clothing/accessory/vitals_sensor/sensor = locate() in accessories + if(sensor) + switch(sensor.sensor_mode) + if(VITALS_SENSOR_OFF) + to_chat(user, "Its sensors appear to be disabled.") + if(VITALS_SENSOR_BINARY) + to_chat(user, "Its binary life sensors appear to be enabled.") + if(VITALS_SENSOR_VITAL) + to_chat(user, "Its vital tracker appears to be enabled.") + if(VITALS_SENSOR_TRACKING) + to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + #undef RAG_COUNT /obj/item/clothing/Topic(href, href_list, datum/topic_state/state) @@ -227,3 +244,41 @@ /obj/item/clothing/proc/check_limb_support(var/mob/living/carbon/human/user) return FALSE + +/obj/item/clothing/verb/toggle_suit_sensors() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/proc/set_sensors(mob/user) + if (isobserver(user) || user.incapacitated()) + return + var/obj/item/clothing/accessory/vitals_sensor/sensor = locate() in accessories + if(sensor) + sensor.user_set_sensors(user) + +/obj/item/clothing/handle_loadout_equip_replacement(obj/item/old_item) + . = ..() + if(!istype(old_item, /obj/item/clothing) || !(ACCESSORY_SLOT_SENSORS in valid_accessory_slots)) + return + var/obj/item/clothing/old_clothes = old_item + var/obj/item/clothing/accessory/vitals_sensor/sensor = locate() in old_clothes.accessories + if(!sensor) + return + sensor.removable = TRUE // This will be refreshed by remove_accessory/attach_accessory + old_clothes.remove_accessory(null, sensor) + attach_accessory(null, sensor) + + +/decl/interaction_handler/clothing_set_sensors + name = "Set Sensors Level" + expected_target_type = /obj/item/clothing/under + +/decl/interaction_handler/clothing_set_sensors/invoked(var/atom/target, var/mob/user) + var/obj/item/clothing/under/U = target + U.set_sensors(user) + +/obj/item/clothing/get_alt_interactions(var/mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/clothing_set_sensors) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index bc323d94fea..2d247d30dd2 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -47,7 +47,7 @@ name = "jumpsuit" icon = 'icons/clothing/under/jumpsuits/jumpsuit.dmi' desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -76,7 +76,7 @@ name = "grey cap" desc = "It looks like a plain hat, but upon closer inspection, there's an advanced holographic array installed inside. It seems to have a small dial inside." icon = 'icons/clothing/head/softcap.dmi' - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' body_parts_covered = 0 item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -106,7 +106,7 @@ name = "armor" icon = 'icons/clothing/suit/armor/vest.dmi' desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -134,7 +134,7 @@ name = "black shoes" icon = 'icons/clothing/feet/colored_shoes.dmi' desc = "They're comfy black shoes, with clever cloaking technology built in. It seems to have a small dial on the back of each shoe." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -161,7 +161,7 @@ /obj/item/storage/backpack/chameleon name = "backpack" desc = "A backpack outfitted with cloaking tech. It seems to have a small dial inside, kept away from the storage." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON icon = 'icons/obj/items/storage/backpack/backpack.dmi' var/static/list/clothing_choices @@ -197,7 +197,7 @@ color = COLOR_GRAY40 icon = 'icons/clothing/hands/gloves_generic.dmi' desc = "It looks like a pair of gloves, but it seems to have a small dial inside." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -226,7 +226,7 @@ name = "gas mask" icon = 'icons/clothing/mask/gas_mask_full.dmi' desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -255,7 +255,7 @@ name = "Optical Meson Scanner" icon = 'icons/clothing/eyes/scanner_meson.dmi' desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -284,7 +284,7 @@ name = "radio headset" icon = 'icons/obj/items/device/radio/headsets/headset.dmi' desc = "An updated, modular intercom that fits over the head. This one seems to have a small dial on it." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -316,7 +316,7 @@ name = "tie" icon = 'icons/clothing/accessories/ties/tie.dmi' desc = "A neosilk clip-on tie. It seems to have a small dial on its back." - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices @@ -355,7 +355,7 @@ icon = 'icons/obj/guns/revolvers.dmi' icon_state = "revolver" w_class = ITEM_SIZE_SMALL - origin_tech = "{'combat':2,'materials':2,'esoteric':8}" + origin_tech = @'{"combat":2,"materials":2,"esoteric":8}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON matter = list() diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index 79ccae86989..47ce6070e55 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -46,18 +46,6 @@ . = A.attack_hand(user) || . return TRUE -/obj/item/clothing/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen)) || ..() - -/obj/item/clothing/handle_mouse_drop(atom/over, mob/user) - if(ishuman(user) && loc == user && istype(over, /obj/screen/inventory)) - var/obj/screen/inventory/inv = over - add_fingerprint(user) - if(user.try_unequip(src)) - user.equip_to_slot_if_possible(src, inv.slot_id) - return TRUE - . = ..() - /obj/item/clothing/proc/update_accessory_slowdown() slowdown_accessory = 0 for(var/obj/item/clothing/accessory/A in accessories) @@ -81,7 +69,7 @@ update_clothing_icon() /obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) - if(!A || !(A in accessories)) + if(!A || !(A in accessories) || !A.removable || !A.canremove) return A.on_removed(user) @@ -106,11 +94,21 @@ if(!LAZYLEN(accessories)) return + var/list/removable_accessories = list() + for(var/obj/item/clothing/accessory/accessory in accessories) + if(accessory.canremove && accessory.removable) + removable_accessories += accessory + + if(!length(removable_accessories)) + to_chat(usr, SPAN_WARNING("You have no removable accessories.")) + verbs -= /obj/item/clothing/proc/removetie_verb + return + var/obj/item/clothing/accessory/A - if(LAZYLEN(accessories) > 1) - A = show_radial_menu(M, M, make_item_radial_menu_choices(accessories), radius = 42, tooltips = TRUE) + if(LAZYLEN(removable_accessories) > 1) + A = show_radial_menu(M, M, make_item_radial_menu_choices(removable_accessories), radius = 42, tooltips = TRUE) else - A = accessories[1] + A = removable_accessories[1] remove_accessory(usr, A) diff --git a/code/modules/clothing/ears/earrings.dm b/code/modules/clothing/ears/earrings.dm index cb78f2c6c4b..f1f6f2b3867 100644 --- a/code/modules/clothing/ears/earrings.dm +++ b/code/modules/clothing/ears/earrings.dm @@ -1,71 +1,45 @@ /obj/item/clothing/ears/stud - name = "pearl stud earrings" + name = "stud earrings" desc = "A pair of small stud earrings." - color = "#eae0c8" + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + material = /decl/material/solid/organic/bone/pearl /obj/item/clothing/ears/stud/glass - name = "glass stud earrings" - color = "#00e1ff" - + material = /decl/material/solid/glass /obj/item/clothing/ears/stud/wood - name = "wood stud earrings" - color = "#824b28" - + material = /decl/material/solid/organic/wood /obj/item/clothing/ears/stud/iron - name = "iron stud earrings" - color = "#5c5454" - + material = /decl/material/solid/metal/iron /obj/item/clothing/ears/stud/steel - name = "steel stud earrings" - color = "#666666" - + material = /decl/material/solid/metal/steel /obj/item/clothing/ears/stud/silver - name = "silver stud earrings" - color = "#d1e6e3" - + material = /decl/material/solid/metal/silver /obj/item/clothing/ears/stud/gold - name = "gold stud earrings" - color = "#edd12f" - + material = /decl/material/solid/metal/gold /obj/item/clothing/ears/stud/platinum - name = "platinum stud earrings" - color = "#9999ff" - + material = /decl/material/solid/metal/platinum /obj/item/clothing/ears/stud/diamond - name = "diamond stud earrings" - color = "#00ffe1" + material = /decl/material/solid/gemstone/diamond /obj/item/clothing/ears/dangle + name = "dangle earrings" icon = 'icons/clothing/ears/earring_dangle.dmi' + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + material = /decl/material/solid/organic/bone/pearl /obj/item/clothing/ears/dangle/glass - name = "glass dangle earrings" - color = "#00e1ff" - + material = /decl/material/solid/glass /obj/item/clothing/ears/dangle/wood - name = "wood dangle earrings" - color = "#824b28" - + material = /decl/material/solid/organic/wood /obj/item/clothing/ears/dangle/iron - name = "iron dangle earrings" - color = "#5c5454" - + material = /decl/material/solid/metal/iron /obj/item/clothing/ears/dangle/steel - name = "steel dangle earrings" - color = "#666666" - + material = /decl/material/solid/metal/steel /obj/item/clothing/ears/dangle/silver - name = "silver dangle earrings" - color = "#d1e6e3" - + material = /decl/material/solid/metal/silver /obj/item/clothing/ears/dangle/gold - name = "gold dangle earrings" - color = "#edd12f" - + material = /decl/material/solid/metal/gold /obj/item/clothing/ears/dangle/platinum - name = "platinum dangle earrings" - color = "#9999ff" - + material = /decl/material/solid/metal/platinum /obj/item/clothing/ears/dangle/diamond - name = "diamond dangle earrings" - color = "#00ffe1" + material = /decl/material/solid/gemstone/diamond diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 6cf4c26780b..9ac497c285a 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -18,7 +18,7 @@ var/electric = FALSE //if the glasses should be disrupted by EMP var/hud_type - var/obj/screen/overlay + var/obj/screen/screen_overlay var/obj/item/clothing/glasses/hud/hud // Hud glasses, if any var/activation_sound = 'sound/items/goggles_charge.ogg' var/deactivation_sound // set this if you want a sound on deactivation @@ -32,7 +32,7 @@ if(ispath(hud)) hud = new hud(src) -/obj/item/clothing/glasses/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/glasses/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && active && check_state_in_icon("[overlay.icon_state]-active", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-active" . = ..() @@ -43,7 +43,7 @@ . = ..() /obj/item/clothing/glasses/needs_vision_update() - return ..() || overlay || vision_flags || see_invisible || darkness_view + return ..() || screen_overlay || vision_flags || see_invisible || darkness_view /obj/item/clothing/glasses/emp_act(severity) if(electric) @@ -69,7 +69,7 @@ active = _active update_icon() update_clothing_icon() - update_vision() + update_wearer_vision() /obj/item/clothing/glasses/on_update_icon() . = ..() diff --git a/code/modules/clothing/glasses/eyepatch.dm b/code/modules/clothing/glasses/eyepatch.dm index e660806e603..57b9e63696b 100644 --- a/code/modules/clothing/glasses/eyepatch.dm +++ b/code/modules/clothing/glasses/eyepatch.dm @@ -60,7 +60,7 @@ eye.color = eye_color add_overlay(eye) -/obj/item/clothing/glasses/eyepatch/hud/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/glasses/eyepatch/hud/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && active && check_state_in_icon("[overlay.icon_state]-eye", overlay.icon)) var/image/eye = emissive_overlay(overlay.icon, "[overlay.icon_state]-eye") eye.color = eye_color @@ -96,7 +96,7 @@ /obj/item/clothing/glasses/eyepatch/hud/meson/Initialize() . = ..() var/datum/global_hud/global_hud = get_global_hud() - overlay = global_hud.meson + screen_overlay = global_hud.meson /obj/item/clothing/glasses/eyepatch/monocle name = "monocle" diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 2766c94ee05..d5be4791a90 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -4,7 +4,7 @@ gender = NEUTER icon = 'icons/clothing/eyes/scanner_meson.dmi' action_button_name = "Toggle Goggles" - origin_tech = "{'magnets':2,'engineering':2}" + origin_tech = @'{"magnets":2,"engineering":2}' toggleable = TRUE vision_flags = SEE_TURFS see_invisible = SEE_INVISIBLE_NOLIGHTING @@ -13,7 +13,7 @@ /obj/item/clothing/glasses/meson/Initialize() . = ..() var/datum/global_hud/global_hud = get_global_hud() - overlay = global_hud.meson + screen_overlay = global_hud.meson /obj/item/clothing/glasses/meson/prescription name = "prescription mesons" @@ -37,13 +37,13 @@ /obj/item/clothing/glasses/science/Initialize() . = ..() var/datum/global_hud/global_hud = get_global_hud() - overlay = global_hud.science + screen_overlay = global_hud.science /obj/item/clothing/glasses/night name = "night vision goggles" desc = "You can totally see in the dark now!" icon = 'icons/clothing/eyes/night_vision.dmi' - origin_tech = "{'magnets':2}" + origin_tech = @'{"magnets":2}' darkness_view = 7 action_button_name = "Toggle Goggles" toggleable = TRUE @@ -53,13 +53,13 @@ /obj/item/clothing/glasses/night/Initialize() . = ..() var/datum/global_hud/global_hud = get_global_hud() - overlay = global_hud.nvg + screen_overlay = global_hud.nvg /obj/item/clothing/glasses/tacgoggles name = "tactical goggles" desc = "Self-polarizing goggles with light amplification for dark environments. Made from durable synthetic." icon = 'icons/clothing/eyes/tactical.dmi' - origin_tech = "{'magnets':2,'combat':4}" + origin_tech = @'{"magnets":2,"combat":4}' darkness_view = 5 action_button_name = "Toggle Goggles" toggleable = TRUE @@ -79,7 +79,7 @@ desc = "Very confusing glasses." gender = NEUTER icon = 'icons/clothing/eyes/scanner_material.dmi' - origin_tech = "{'magnets':3,'engineering':3}" + origin_tech = @'{"magnets":3,"engineering":3}' action_button_name = "Toggle Goggles" toggleable = TRUE vision_flags = SEE_OBJS diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 4a4b6dc75a4..7da212e8b23 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -1,7 +1,7 @@ /obj/item/clothing/glasses/hud name = "\improper HUD" desc = "A heads-up display that provides important info in (almost) real time." - origin_tech = "{'magnets':3,'biotech':2}" + origin_tech = @'{"magnets":3,"biotech":2}' electric = TRUE gender = NEUTER toggleable = TRUE diff --git a/code/modules/clothing/glasses/thermals.dm b/code/modules/clothing/glasses/thermals.dm index 2896b7f7578..6938f8ecea8 100644 --- a/code/modules/clothing/glasses/thermals.dm +++ b/code/modules/clothing/glasses/thermals.dm @@ -4,7 +4,7 @@ gender = NEUTER icon = 'icons/clothing/eyes/scanner_thermal.dmi' action_button_name = "Toggle Goggles" - origin_tech = "{'magnets':3}" + origin_tech = @'{"magnets":3}' toggleable = TRUE vision_flags = SEE_MOBS see_invisible = SEE_INVISIBLE_NOLIGHTING @@ -13,13 +13,13 @@ /obj/item/clothing/glasses/thermal/Initialize() . = ..() var/datum/global_hud/global_hud = get_global_hud() - overlay = global_hud.thermal + screen_overlay = global_hud.thermal /obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete name = "optical meson scanner" desc = "Used for seeing walls, floors, and stuff through anything." icon = 'icons/clothing/eyes/scanner_meson.dmi' - origin_tech = "{'magnets':3,'esoteric':4}" + origin_tech = @'{"magnets":3,"esoteric":4}' /obj/item/clothing/glasses/thermal/plain toggleable = FALSE diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 7c74a138b64..2d403a89c27 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -24,24 +24,23 @@ /obj/item/clothing/gloves/get_fibers() return "material from a pair of [name]." -/obj/item/clothing/gloves/mob_can_equip(mob/M, slot, disable_warning = 0, force = 0, ignore_equipped = 0) +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) var/obj/item/clothing/ring/check_ring - var/mob/living/carbon/human/H = M - var/obj/item/gloves = M.get_equipped_item(slot_gloves_str) - if(slot == slot_gloves_str && istype(H) && gloves) + var/obj/item/gloves = user?.get_equipped_item(slot_gloves_str) + if(slot == slot_gloves_str && gloves) if(!ignore_equipped && gloves != src) check_ring = gloves - if(!istype(check_ring) || !check_ring.can_fit_under_gloves || !H.try_unequip(check_ring, src)) + if(!istype(check_ring) || !check_ring.can_fit_under_gloves || !user.try_unequip(check_ring, src)) if(!disable_warning) - to_chat(M, SPAN_WARNING("You are unable to wear \the [src] as \the [gloves] are in the way.")) + to_chat(user, SPAN_WARNING("You are unable to wear \the [src] as \the [gloves] are in the way.")) return FALSE . = ..() if(check_ring && check_ring != src) if(.) covering_ring = check_ring - to_chat(M, SPAN_NOTICE("You slip \the [src] on over \the [covering_ring].")) + to_chat(user, SPAN_NOTICE("You slip \the [src] on over \the [covering_ring].")) else - M.equip_to_slot_if_possible(check_ring, slot_gloves_str, disable_warning = TRUE) + user.equip_to_slot_if_possible(check_ring, slot_gloves_str, disable_warning = TRUE) /obj/item/clothing/gloves/Destroy() QDEL_NULL(covering_ring) diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index 3ad4d2bdfd6..d7032fcb124 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD color = COLOR_RED_GRAY item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_PADDED - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/clothing/gloves/boxing/green color = COLOR_GREEN_GRAY diff --git a/code/modules/clothing/gloves/latex.dm b/code/modules/clothing/gloves/latex.dm index 29e2b9f18b2..54415d7515e 100644 --- a/code/modules/clothing/gloves/latex.dm +++ b/code/modules/clothing/gloves/latex.dm @@ -6,7 +6,7 @@ germ_level = 0 icon_state = ICON_STATE_WORLD anomaly_shielding = 0.1 - material = /decl/material/solid/plastic //todo: latex + material = /decl/material/solid/organic/plastic //todo: latex /obj/item/clothing/gloves/latex/nitrile name = "nitrile gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index a2241079ff8..a36102e6b7b 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -10,8 +10,8 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 icon_state = ICON_STATE_WORLD - material = /decl/material/solid/plastic //TODO: rubber - matter = list(/decl/material/solid/cloth = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/plastic //TODO: rubber + matter = list(/decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT) /obj/item/clothing/gloves/insulated/cheap //Cheap Chinese Crap desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly." @@ -47,8 +47,8 @@ ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, ARMOR_LASER = ARMOR_LASER_MINOR ) - material = /decl/material/solid/cloth - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/cloth + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) /obj/item/clothing/gloves/guards desc = "A pair of synthetic gloves and arm pads reinforced with armor plating." @@ -58,8 +58,8 @@ w_class = ITEM_SIZE_NORMAL siemens_coefficient = 0.7 permeability_coefficient = 0.03 - material = /decl/material/solid/cloth - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/cloth + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, @@ -84,5 +84,5 @@ heat_protection = SLOT_HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE max_pressure_protection = FIRESUIT_MAX_PRESSURE - material = /decl/material/solid/cloth - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/cloth + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/clothing/gloves/thick.dm b/code/modules/clothing/gloves/thick.dm index eeac1d8e9de..f6b427c2857 100644 --- a/code/modules/clothing/gloves/thick.dm +++ b/code/modules/clothing/gloves/thick.dm @@ -19,7 +19,7 @@ ARMOR_ENERGY = ARMOR_ENERGY_SMALL, ARMOR_BOMB = ARMOR_BOMB_RESISTANT, ARMOR_BIO = ARMOR_BIO_MINOR) - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/clothing/gloves/thick/swat desc = "These tactical gloves are somewhat fire and impact-resistant." @@ -42,7 +42,7 @@ . = ..() add_overlay(overlay_image(icon, "[icon_state]-botany_fingertips", flags = RESET_COLOR)) -/obj/item/clothing/gloves/thick/botany/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/gloves/thick/botany/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && slot == slot_gloves_str) var/image/I = image(overlay.icon, "[overlay.icon_state]-botany_fingertips") I.appearance_flags |= RESET_COLOR @@ -52,7 +52,7 @@ /obj/item/clothing/gloves/thick/duty desc = "These brown duty gloves are made from a durable synthetic." color = COLOR_BEASTY_BROWN - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/clothing/gloves/thick/craftable name = "gauntlets" diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 180079d1971..4dfca922a2e 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -4,26 +4,14 @@ icon = 'icons/clothing/head/softcap.dmi' blood_overlay_type = "helmetblood" w_class = ITEM_SIZE_SMALL - flags_inv = BLOCK_HEAD_HAIR slot_flags = SLOT_HEAD body_parts_covered = SLOT_HEAD var/protects_against_weather = FALSE - var/image/light_overlay_image - var/light_overlay = "helmet_light" var/light_applied var/brightness_on var/on = 0 -/obj/item/clothing/head/equipped(var/mob/user, var/slot) - light_overlay_image = null - ..(user, slot) - -/obj/item/clothing/head/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) - if(overlay && on && slot == slot_head_str) - overlay.overlays += overlay_image('icons/mob/light_overlays.dmi', "[light_overlay]", null, RESET_COLOR) - . = ..() - /obj/item/clothing/head/attack_self(mob/user) if(brightness_on) if(!isturf(user.loc)) @@ -45,53 +33,26 @@ update_icon(user) user.update_action_buttons() -/obj/item/clothing/head/attack_ai(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/attack_animal(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) - var/datum/extension/hattable/hattable = get_extension(user, /datum/extension/hattable) - if(Adjacent(user) && hattable) - if(hattable.hat) - to_chat(user, SPAN_WARNING("You are already wearing a hat.")) - return TRUE - if(hattable.wear_hat(user, src)) - to_chat(user, SPAN_NOTICE("You are now wearing \the [src].")) - return TRUE - return FALSE - /obj/item/clothing/head/on_update_icon(var/mob/user) . = ..() - if(on) - add_light_overlay() update_clothing_icon() + if(on) + var/light_state = "[icon_state]_light" + if(check_state_in_icon(light_state, icon)) + var/image/light_overlay = image(icon, light_state) + light_overlay.appearance_flags |= RESET_COLOR + add_overlay(light_overlay) -/obj/item/clothing/head/proc/add_light_overlay() - if(use_single_icon) - var/cache_key = "[icon]-[get_world_inventory_state()]_icon" - if(!light_overlay_cache[cache_key]) - light_overlay_cache[cache_key] = image(icon, "[get_world_inventory_state()]_light") - overlays |= light_overlay_cache[cache_key] - return - - if(!light_overlay_cache["[light_overlay]_icon"]) - light_overlay_cache["[light_overlay]_icon"] = image("icon" = 'icons/obj/light_overlays.dmi', "icon_state" = "[light_overlay]") - overlays |= light_overlay_cache["[light_overlay]_icon"] - -/obj/item/clothing/head/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && on && check_state_in_icon("[overlay.icon_state]_light", overlay.icon)) - var/image/light_overlay = image(overlay.icon, "[overlay.icon_state]_light") - if(ishuman(user_mob)) - var/mob/living/carbon/human/H = user_mob - if(H.get_bodytype_category() != bodytype) - light_overlay = H.get_bodytype().get_offset_overlay_image(FALSE, light_overlay.icon, light_overlay.icon_state, null, slot) + var/light_overlay + if(user_mob.get_bodytype_category() != bodytype) + light_overlay = user_mob.get_bodytype()?.get_offset_overlay_image(overlay.icon, "[overlay.icon_state]_light", null, slot) + if(!light_overlay) + light_overlay = image(overlay.icon, "[overlay.icon_state]_light") overlay.overlays += light_overlay . = ..() /obj/item/clothing/head/get_associated_equipment_slots() . = ..() - LAZYDISTINCTADD(., slot_head_str) \ No newline at end of file + LAZYDISTINCTADD(., slot_head_str) diff --git a/code/modules/clothing/head/fated_key.dm b/code/modules/clothing/head/fated_key.dm index 7220fb501e8..676131c55e5 100644 --- a/code/modules/clothing/head/fated_key.dm +++ b/code/modules/clothing/head/fated_key.dm @@ -12,7 +12,7 @@ canremove = FALSE to_chat(user, SPAN_DANGER("\The [src] shatters your mind as it sears through [user.isSynthetic() ? "metal and circuitry" : "flesh and bone"], embedding itself into your skull!")) SET_STATUS_MAX(user, STAT_PARA, 5) - addtimer(CALLBACK(src, .proc/activate_role), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(activate_role)), 5 SECONDS) else canremove = TRUE name = initial(name) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index dc2c9561290..fbfcf71f12c 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -4,7 +4,6 @@ icon = 'icons/clothing/head/hardhat/yellow.dmi' action_button_name = "Toggle Headlamp" brightness_on = 4 //luminosity when on - light_overlay = "hardhat_light" w_class = ITEM_SIZE_NORMAL armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, @@ -20,9 +19,9 @@ heat_protection = SLOT_HEAD max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE max_pressure_protection = FIRESUIT_MAX_PRESSURE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':1,'engineering':1,'combat':1}" + origin_tech = @'{"materials":1,"engineering":1,"combat":1}' /obj/item/clothing/head/hardhat/orange icon = 'icons/clothing/head/hardhat/orange.dmi' @@ -40,7 +39,6 @@ name = "\improper EMS helmet" desc = "A polymer helmet worn by EMTs throughout human space to protect their head. This one comes with an attached flashlight and has 'Medic' written on its back in blue lettering." icon = 'icons/clothing/head/hardhat/medic.dmi' - light_overlay = "EMS_light" w_class = ITEM_SIZE_NORMAL armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, diff --git a/code/modules/clothing/head/headphones.dm b/code/modules/clothing/head/headphones.dm index 34f598aee53..061e6763f37 100644 --- a/code/modules/clothing/head/headphones.dm +++ b/code/modules/clothing/head/headphones.dm @@ -23,7 +23,7 @@ icon_state = "[icon_state]-on" update_clothing_icon() -/obj/item/clothing/head/headphones/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/headphones/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && headphones_on) overlay.icon_state = "[overlay.icon_state]-on" . = ..() @@ -50,10 +50,6 @@ update_icon() -/obj/item/clothing/head/headphones/handle_mouse_drop(atom/over, mob/user) - interact(user) - return TRUE - /obj/item/clothing/head/headphones/attack_self(mob/user) ..() interact(user) @@ -78,6 +74,14 @@ sound_to(user, sound(null, channel = sound_channel)) sound_to(user, sound(track.song, repeat = 1, wait = 0, volume = music_volume, channel = sound_channel)) +/obj/item/clothing/head/headphones/attack_hand(mob/user) + // if it's equipped and we're not holding it, open + // the interface instead of removing it from the slot. + var/equip_slot = user.get_equipped_slot_for_item(src) + if(equip_slot && !(equip_slot in user.get_held_item_slots())) + return attack_self(user) + return ..() + /obj/item/clothing/head/headphones/proc/stop_music(mob/user) if(!user || !user.client) return diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 4fce0e75298..541a7d9cd93 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -22,7 +22,7 @@ w_class = ITEM_SIZE_NORMAL material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/plasteel = MATTER_AMOUNT_TRACE) - origin_tech = "{'materials':1,'engineering':1,'combat':1}" + origin_tech = @'{"materials":1,"engineering":1,"combat":1}' protects_against_weather = TRUE /obj/item/clothing/head/helmet/tactical @@ -38,7 +38,7 @@ ) siemens_coefficient = 0.6 material = /decl/material/solid/metal/plasteel - origin_tech = "{'materials':2,'engineering':2,'combat':2}" + origin_tech = @'{"materials":2,"engineering":2,"combat":2}' /obj/item/clothing/head/helmet/merc name = "combat helmet" @@ -54,7 +54,7 @@ siemens_coefficient = 0.5 material = /decl/material/solid/metal/plasteel matter = list(/decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':2,'engineering':2,'combat':2}" + origin_tech = @'{"materials":2,"engineering":2,"combat":2}' /obj/item/clothing/head/helmet/riot name = "riot helmet" @@ -69,7 +69,7 @@ siemens_coefficient = 0.7 action_button_name = "Toggle Visor" var/up = 0 - matter = list(/decl/material/solid/cloth = MATTER_AMOUNT_SECONDARY) + matter = list(/decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY) /obj/item/clothing/head/helmet/riot/attack_self(mob/user) up = !up @@ -86,7 +86,7 @@ icon_state = "[icon_state]_up" update_clothing_icon() -/obj/item/clothing/head/helmet/riot/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/helmet/riot/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && up && check_state_in_icon("[overlay.icon_state]_up", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_up" . = ..() @@ -122,7 +122,7 @@ /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':3,'engineering':2,'combat':3}" + origin_tech = @'{"materials":3,"engineering":2,"combat":3}' /obj/item/clothing/head/helmet/swat name = "\improper SWAT helmet" @@ -140,7 +140,7 @@ siemens_coefficient = 0.5 material = /decl/material/solid/metal/plasteel matter = list(/decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':4,'engineering':2,'combat':4}" + origin_tech = @'{"materials":4,"engineering":2,"combat":4}' /obj/item/clothing/head/helmet/thunderdome name = "\improper Thunderdome helmet" @@ -159,7 +159,7 @@ siemens_coefficient = 1 material = /decl/material/solid/metal/plasteel matter = list(/decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':4,'engineering':2,'combat':4}" + origin_tech = @'{"materials":4,"engineering":2,"combat":4}' /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 8e1a1901d64..fb305b44e58 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -60,7 +60,7 @@ flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) to_chat(usr, "You push the [src] up out of your face.") update_icon() - update_vision() + update_wearer_vision() usr.update_action_buttons() /obj/item/clothing/head/welding/on_update_icon() @@ -70,7 +70,7 @@ icon_state = "[icon_state]_up" update_clothing_icon() //so our mob-overlays -/obj/item/clothing/head/welding/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/welding/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && up && check_state_in_icon("[overlay.icon_state]_up", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_up" . = ..() @@ -126,7 +126,7 @@ icon_state = "[icon_state]_up" update_clothing_icon() -/obj/item/clothing/head/ushanka/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/ushanka/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && up && check_state_in_icon("[overlay.icon_state]_up", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_up" . = ..() @@ -142,7 +142,6 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES brightness_on = 2 - light_overlay = "helmet_light" w_class = ITEM_SIZE_NORMAL /* @@ -199,7 +198,7 @@ if(overlay && check_state_in_icon("[overlay.icon_state]-flame", overlay.icon)) return emissive_overlay(overlay.icon, "[overlay.icon_state]-flame") -/obj/item/clothing/head/cakehat/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) +/obj/item/clothing/head/cakehat/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && is_on_fire) var/image/I = get_mob_flame_overlay(overlay, bodytype) if(I) diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 03d5f37f661..885b9195403 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -13,10 +13,10 @@ if(flipped) icon_state = "[get_world_inventory_state()]_flipped" -/obj/item/clothing/head/soft/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/soft/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && flipped && check_state_in_icon("[overlay.icon_state]_flipped", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_flipped" - . = ..() + . = ..() /obj/item/clothing/head/soft/dropped() src.flipped=0 diff --git a/code/modules/clothing/masks/_mask.dm b/code/modules/clothing/masks/_mask.dm index 3772afe69eb..4457c7089a4 100644 --- a/code/modules/clothing/masks/_mask.dm +++ b/code/modules/clothing/masks/_mask.dm @@ -6,8 +6,8 @@ body_parts_covered = SLOT_FACE|SLOT_EYES blood_overlay_type = "maskblood" material = /decl/material/solid/fiberglass - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':1,'engineering':1}" + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) + origin_tech = @'{"materials":1,"engineering":1}' var/voicechange = 0 var/list/say_messages @@ -33,7 +33,7 @@ . = ..() LAZYDISTINCTADD(., slot_wear_mask_str) -/obj/item/clothing/mask/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/mask/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && hanging && slot == slot_wear_mask_str && check_state_in_icon("[overlay.icon_state]-down", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-down" . = ..() diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 891e4243ac6..25a605d653a 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -9,7 +9,7 @@ down_flags_inv = BLOCK_HEAD_HAIR pull_mask = 1 w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/clothing/mask/balaclava/tactical name = "green balaclava" @@ -24,7 +24,7 @@ body_parts_covered = SLOT_HEAD|SLOT_FACE w_class = ITEM_SIZE_SMALL siemens_coefficient = 3.0 - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/clothing/mask/luchador/tecnicos name = "Tecnicos Mask" diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 1a3533da829..06d78421b29 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -12,8 +12,8 @@ down_body_parts_covered = null down_item_flags = ITEM_FLAG_THICKMATERIAL pull_mask = 1 - origin_tech = "{'materials':1}" - material = /decl/material/solid/plastic + origin_tech = @'{"materials":1}' + material = /decl/material/solid/organic/plastic /obj/item/clothing/mask/breath/medical desc = "A close-fitting sterile mask that can be manually connected to an air supply for treatment." diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index 9ff4c7d1e0a..aab492be317 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -4,6 +4,8 @@ icon = 'icons/clothing/mask/chewables/lollipop.dmi' body_parts_covered = 0 bodytype_equip_flags = null + origin_tech = null + matter = null // no plastic/fiberglass var/type_butt = null var/chem_volume = 0 @@ -12,7 +14,7 @@ /obj/item/clothing/mask/chewable/Initialize() . = ..() - atom_flags |= ATOM_FLAG_NO_REACT // so it doesn't react until you light it + atom_flags |= ATOM_FLAG_NO_CHEM_CHANGE // so it doesn't react until you light it initialize_reagents() /obj/item/clothing/mask/chewable/initialize_reagents(populate = TRUE) @@ -62,6 +64,7 @@ chem_volume = 50 chewtime = 300 brand = "tobacco" + material = /decl/material/solid/organic/plantmatter /obj/item/trash/cigbutt/spitwad name = "spit wad" @@ -120,6 +123,7 @@ slot_flags = SLOT_EARS | SLOT_FACE chem_volume = 50 chewtime = 300 + material = /decl/material/liquid/nutriment/sugar var/initial_payload_amount = 3 /obj/item/clothing/mask/chewable/candy/populate_reagents() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index be4cab615d7..21b84c44b3b 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -111,7 +111,7 @@ /decl/material/solid/glass = MATTER_AMOUNT_SECONDARY, /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/mask/gas/syndicate name = "tactical mask" @@ -129,7 +129,7 @@ /decl/material/solid/glass = MATTER_AMOUNT_SECONDARY, /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/mask/gas/death_commando name = "\improper Death Commando Mask" @@ -151,8 +151,8 @@ ARMOR_BIO = ARMOR_BIO_SHIELDED ) body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES - material = /decl/material/solid/cloth - origin_tech = "{'materials':1,'engineering':2}" + material = /decl/material/solid/organic/cloth + origin_tech = @'{"materials":1,"engineering":2}' /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 114503a735d..4856bf57ba5 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -43,7 +43,7 @@ down_gas_transfer_coefficient = 1 down_body_parts_covered = null pull_mask = 1 - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/clothing/mask/fakemoustache name = "fake moustache" @@ -61,7 +61,7 @@ icon_state = ICON_STATE_WORLD flags_inv = HIDEFACE body_parts_covered = 0 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic // This doesn't 'filter' water so much as allow us to breathe from the air above it. /obj/item/clothing/mask/snorkel/filters_water() @@ -107,7 +107,7 @@ flags_inv = HIDEFACE body_parts_covered = SLOT_FACE|SLOT_EYES action_button_name = "Toggle MUI" - origin_tech = "{'programming':5,'engineering':5}" + origin_tech = @'{"programming":5,"engineering":5}' /obj/item/clothing/mask/ai/Initialize() . = ..() @@ -138,7 +138,7 @@ flags_inv = HIDEFACE|BLOCK_ALL_HAIR siemens_coefficient = 0.9 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/clothing/mask/rubber/barros name = "Amaya Barros mask" @@ -184,7 +184,7 @@ icon = 'icons/clothing/mask/spirit.dmi' flags_inv = HIDEFACE body_parts_covered = SLOT_FACE|SLOT_EYES - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth // Bandanas below /obj/item/clothing/mask/bandana @@ -198,7 +198,7 @@ body_parts_covered = SLOT_FACE item_flags = ITEM_FLAG_FLEXIBLEMATERIAL w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/clothing/mask/bandana/equipped(var/mob/user, var/slot) . = ..() diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 7f8b1fd0950..0cc94b7409b 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -47,7 +47,7 @@ . = ..() update_icon() -/obj/item/clothing/mask/monitor/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/mask/monitor/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) if(!(monitor_state_index in monitor_states)) monitor_state_index = initial(monitor_state_index) @@ -71,7 +71,7 @@ canremove = 1 return ..() -/obj/item/clothing/mask/monitor/mob_can_equip(var/mob/living/carbon/human/user, var/slot, var/disable_warning, var/force, var/ignore_equipped) +/obj/item/clothing/mask/monitor/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() if(. && (slot == slot_head_str || slot == slot_wear_mask_str)) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(user, BP_HEAD) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 50bb56f8395..f7518a81a4e 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -6,7 +6,7 @@ bodytype_equip_flags = null z_flags = ZMM_MANGLE_PLANES - var/lit = 0 + var/lit = FALSE var/waterproof = FALSE var/type_butt = null var/chem_volume = 0 @@ -34,7 +34,7 @@ /obj/item/clothing/mask/smokable/Initialize() . = ..() - atom_flags |= ATOM_FLAG_NO_REACT // so it doesn't react until you light it + atom_flags |= ATOM_FLAG_NO_CHEM_CHANGE // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 /obj/item/clothing/mask/smokable/Destroy() @@ -50,6 +50,7 @@ /obj/item/clothing/mask/smokable/fire_act() light(0) + return ..() /obj/item/clothing/mask/smokable/proc/smoke(amount, manual) smoketime -= amount @@ -109,7 +110,7 @@ M.update_equipment_overlay(slot_wear_mask_str, FALSE) M.update_inhand_overlays() -/obj/item/clothing/mask/smokable/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/mask/smokable/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && lit && check_state_in_icon("[overlay.icon_state]-on", overlay.icon)) var/image/on_overlay = emissive_overlay(overlay.icon, "[overlay.icon_state]-on") on_overlay.appearance_flags |= RESET_COLOR @@ -131,7 +132,7 @@ if(submerged()) to_chat(usr, SPAN_WARNING("You cannot light \the [src] underwater.")) return - lit = 1 + lit = TRUE damtype = BURN if(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel)) // the fuel explodes var/datum/effect/effect/system/reagents_explosion/e = new() @@ -139,7 +140,7 @@ e.start() qdel(src) return - atom_flags &= ~ATOM_FLAG_NO_REACT // allowing reagents to react after being lit + atom_flags &= ~ATOM_FLAG_NO_CHEM_CHANGE // allowing reagents to react after being lit HANDLE_REACTIONS(reagents) update_icon() if(flavor_text) @@ -149,7 +150,7 @@ START_PROCESSING(SSobj, src) /obj/item/clothing/mask/smokable/proc/extinguish(var/mob/user, var/no_message) - lit = 0 + lit = FALSE damtype = BRUTE STOP_PROCESSING(SSobj, src) set_light(0) @@ -201,6 +202,9 @@ ignitermes = "USER fiddles with FLAME, and manages to light their NAME." brand = "\improper Trans-Stellar Duty-free" +/obj/item/clothing/mask/smokable/cigarette/can_be_injected_by(var/atom/injector) + return TRUE + /obj/item/clothing/mask/smokable/cigarette/Initialize() . = ..() initialize_reagents() @@ -351,17 +355,15 @@ name = "wooden tip" icon = 'icons/clothing/mask/smokables/cigar_butt.dmi' desc = "A wooden mouthpiece from a cigar. Smells rather bad." - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/clothing/mask/smokable/cigarette/attackby(var/obj/item/W, var/mob/user) - ..() - if(istype(W, /obj/item/energy_blade/sword)) var/obj/item/energy_blade/sword/S = W if(S.active) light(SPAN_WARNING("[user] swings their [W], barely missing their nose. They light their [name] in the process.")) - - return + return TRUE + return ..() /obj/item/clothing/mask/smokable/cigarette/attack(mob/living/carbon/human/H, mob/user, def_zone) if(lit && H == user && istype(H)) @@ -387,13 +389,12 @@ return ..() /obj/item/clothing/mask/smokable/cigarette/afterattack(obj/item/chems/glass/glass, var/mob/user, proximity) - ..() if(!proximity) return - if(istype(glass)) //you can dip cigarettes into beakers + if(!lit && istype(glass)) //you can dip unlit cigarettes into beakers. todo: extinguishing lit cigarettes in beakers? disambiguation via intent? if(!ATOM_IS_OPEN_CONTAINER(glass)) to_chat(user, SPAN_NOTICE("You need to take the lid off first.")) - return + return TRUE var/transfered = glass.reagents.trans_to_obj(src, chem_volume) if(transfered) //if reagents were transfered, show the message to_chat(user, SPAN_NOTICE("You dip \the [src] into \the [glass].")) @@ -402,6 +403,8 @@ to_chat(user, SPAN_NOTICE("[glass] is empty.")) else to_chat(user, SPAN_NOTICE("[src] is full.")) + return TRUE + return ..() /obj/item/clothing/mask/smokable/cigarette/attack_self(var/mob/user) if(lit == 1) @@ -451,7 +454,7 @@ name = "cigarette butt" desc = "A manky old cigarette butt." icon = 'icons/clothing/mask/smokables/cigarette_butt.dmi' - icon_state = "butt" + icon_state = ICON_STATE_WORLD randpixel = 10 w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS @@ -465,7 +468,7 @@ /obj/item/trash/cigbutt/cigarbutt name = "cigar butt" desc = "A manky old cigar butt." - icon = 'icons/clothing/mask/smokables/cigar.dmi' + icon = 'icons/clothing/mask/smokables/cigar_butt.dmi' /obj/item/clothing/mask/smokable/cigarette/cigar/attackby(var/obj/item/W, var/mob/user) ..() @@ -518,7 +521,7 @@ if(submerged()) to_chat(usr, SPAN_WARNING("You cannot light \the [src] underwater.")) return - lit = 1 + lit = TRUE damtype = BURN var/turf/T = get_turf(src) T.visible_message(flavor_text) @@ -542,7 +545,7 @@ /obj/item/clothing/mask/smokable/pipe/attack_self(var/mob/user) if(lit == 1) user.visible_message(SPAN_NOTICE("[user] puts out [src]."), SPAN_NOTICE("You put out [src].")) - lit = 0 + lit = FALSE update_icon() STOP_PROCESSING(SSobj, src) remove_extension(src, /datum/extension/scent) diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 9cd680243c9..edee4acd8eb 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -9,7 +9,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." var/obj/item/voice_changer/changer - origin_tech = "{'esoteric':4}" + origin_tech = @'{"esoteric":4}' /obj/item/clothing/mask/chameleon/voice/verb/Toggle_Voice_Changer() set category = "Object" diff --git a/code/modules/clothing/pants/_pants.dm b/code/modules/clothing/pants/_pants.dm index 860c287e3b1..d2b2590cdba 100644 --- a/code/modules/clothing/pants/_pants.dm +++ b/code/modules/clothing/pants/_pants.dm @@ -9,6 +9,7 @@ w_class = ITEM_SIZE_NORMAL force = 0 valid_accessory_slots = list( + ACCESSORY_SLOT_SENSORS, ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_HOLSTER, ACCESSORY_SLOT_ARMBAND, diff --git a/code/modules/clothing/rings/material.dm b/code/modules/clothing/rings/material.dm index 7d64281ea32..9b3644f7fdf 100644 --- a/code/modules/clothing/rings/material.dm +++ b/code/modules/clothing/rings/material.dm @@ -30,9 +30,9 @@ . += " \[View\]" /obj/item/clothing/ring/material/wood - material = /decl/material/solid/wood/walnut + material = /decl/material/solid/organic/wood/walnut /obj/item/clothing/ring/material/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/clothing/ring/material/steel material = /decl/material/solid/metal/steel /obj/item/clothing/ring/material/silver diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm index a6dc2b84426..b0446ef0697 100644 --- a/code/modules/clothing/rings/rings.dm +++ b/code/modules/clothing/rings/rings.dm @@ -43,7 +43,7 @@ /obj/item/clothing/ring/reagent atom_flags = ATOM_FLAG_OPEN_CONTAINER - origin_tech = "{'materials':2,'esoteric':4}" + origin_tech = @'{"materials":2,"esoteric":4}' var/tmp/volume = 15 /obj/item/clothing/ring/reagent/Initialize(ml, material_key) @@ -73,7 +73,7 @@ /obj/item/clothing/ring/reagent/sleepy name = "silver ring" desc = "A ring made from what appears to be silver." - origin_tech = "{'materials':2,'esoteric':5}" + origin_tech = @'{"materials":2,"esoteric":5}' /obj/item/clothing/ring/reagent/sleepy/populate_reagents() reagents.add_reagent(/decl/material/liquid/paralytics, 10) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 9f6675aac63..1e59942aa10 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -12,8 +12,8 @@ permeability_coefficient = 0.50 force = 2 blood_overlay_type = "shoeblood" - material = /decl/material/solid/leather - origin_tech = "{'materials':1,'engineering':1}" + material = /decl/material/solid/organic/leather + origin_tech = @'{"materials":1,"engineering":1}' var/can_fit_under_magboots = TRUE var/can_add_cuffs = TRUE @@ -174,7 +174,7 @@ S.blend_mode = BLEND_ADD add_overlay(S) -/obj/item/clothing/shoes/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/shoes/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && shine > 0 && slot == slot_shoes_str) var/mutable_appearance/S = mutable_appearance(overlay.icon, "shine") S.alpha = 127 * shine / 100 diff --git a/code/modules/clothing/shoes/craftable.dm b/code/modules/clothing/shoes/craftable.dm index f8d930ad558..db270395869 100644 --- a/code/modules/clothing/shoes/craftable.dm +++ b/code/modules/clothing/shoes/craftable.dm @@ -2,7 +2,7 @@ name = "shoes" desc = "A pair of shoes." icon = 'icons/clothing/feet/generic_shoes.dmi' - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME cold_protection = SLOT_FEET min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm index 8ac9290fa3c..38f03b11e15 100644 --- a/code/modules/clothing/shoes/jobs.dm +++ b/code/modules/clothing/shoes/jobs.dm @@ -14,7 +14,7 @@ name = "jackboots" desc = "Tall synthleather boots with an artificial shine." icon = 'icons/clothing/feet/boots.dmi' - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth material_alteration = MAT_FLAG_ALTERATION_COLOR force = 3 armor = list( @@ -35,7 +35,7 @@ max_pressure_protection = FIRESUIT_MAX_PRESSURE var/artificail_shine = 20 matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/shoes/jackboots/set_material(var/new_material) ..() @@ -45,7 +45,7 @@ name = "workboots" desc = "A pair of steel-toed work boots designed for use in industrial settings. Safety first." icon = 'icons/clothing/feet/boots.dmi' - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth color = "#d88d4b" armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, @@ -61,4 +61,4 @@ max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE max_pressure_protection = FIRESUIT_MAX_PRESSURE matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 6984b7ac43e..6771a84fda1 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -11,7 +11,7 @@ center_of_mass = null randpixel = 0 matter = list(/decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':2,'engineering':2,'magnets':3}" + origin_tech = @'{"materials":2,"engineering":2,"magnets":3}' var/magpulse = 0 var/obj/item/clothing/shoes/covering_shoes var/online_slowdown = 3 @@ -54,7 +54,7 @@ icon_state = new_state update_clothing_icon() -/obj/item/clothing/shoes/magboots/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/shoes/magboots/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) var/new_state = overlay.icon_state if(magpulse) @@ -63,23 +63,22 @@ overlay.icon_state = new_state . = ..() -/obj/item/clothing/shoes/magboots/mob_can_equip(mob/M, slot, disable_warning = 0, force = 0, ignore_equipped = 0) +/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) var/obj/item/clothing/shoes/check_shoes - var/mob/living/carbon/human/H = M - if(slot == slot_shoes_str && istype(H)) - check_shoes = H.get_equipped_item(slot_shoes_str) + if(slot == slot_shoes_str) + check_shoes = user.get_equipped_item(slot_shoes_str) if(!ignore_equipped && check_shoes != src) - if(istype(check_shoes) && (!check_shoes.can_fit_under_magboots || !H.try_unequip(check_shoes, src))) + if(istype(check_shoes) && (!check_shoes.can_fit_under_magboots || !user.try_unequip(check_shoes, src))) if(!disable_warning) - to_chat(M, SPAN_WARNING("You are unable to wear \the [src] as \the [check_shoes] are in the way.")) + to_chat(user, SPAN_WARNING("You are unable to wear \the [src] as \the [check_shoes] are in the way.")) return FALSE . = ..() if(check_shoes && check_shoes != src) if(.) covering_shoes = check_shoes - to_chat(M, SPAN_NOTICE("You slip \the [src] on over \the [covering_shoes].")) + to_chat(user, SPAN_NOTICE("You slip \the [src] on over \the [covering_shoes].")) else - M.equip_to_slot_if_possible(check_shoes, slot_shoes_str, disable_warning = TRUE) + user.equip_to_slot_if_possible(check_shoes, slot_shoes_str, disable_warning = TRUE) set_slowdown() /obj/item/clothing/shoes/magboots/Destroy() diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 03cf4f3dec2..74aa9e80546 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -6,7 +6,7 @@ markings_color = WOOD_COLOR_CHOCOLATE permeability_coefficient = 0.05 item_flags = ITEM_FLAG_NOSLIP - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' siemens_coefficient = 0.8 bodytype_equip_flags = null matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index 694c4994227..fcab77cc951 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -186,7 +186,7 @@ switch(W.get_material_type()) if(/decl/material/solid/metal/steel) repair_power = 2 - if(/decl/material/solid/plastic) + if(/decl/material/solid/organic/plastic) repair_power = 1 if(!repair_power) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index d38ecf182bb..d574528f109 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -34,8 +34,8 @@ interface_desc = "Disorientates your target by blinding them with this intense palm-mounted light." device = /obj/item/flash - origin_tech = "{'combat':2,'magnets':3,'engineering':5}" - material = /decl/material/solid/plastic + origin_tech = @'{"combat":2,"magnets":3,"engineering":5}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE @@ -44,7 +44,7 @@ /obj/item/rig_module/device/flash/advanced name = "advanced mounted flash" device = /obj/item/flash/advanced - origin_tech = "{'combat':3,'magnets':3,'engineering':5}" + origin_tech = @'{"combat":3,"magnets":3,"engineering":5}' /obj/item/rig_module/device/flash/installed() . = ..() @@ -262,11 +262,11 @@ interface_name = "mounted energy gun" interface_desc = "A shoulder-mounted suit-powered energy gun." - origin_tech = "{'powerstorage':6,'combat':6,'engineering':6}" + origin_tech = @'{"powerstorage":6,"combat":6,"engineering":6}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) @@ -284,10 +284,10 @@ interface_name = "mounted electrolaser" interface_desc = "A shoulder-mounted, cell-powered electrolaser." - origin_tech = "{'powerstorage':5,'combat':5,'engineering':6}" + origin_tech = @'{"powerstorage":5,"combat":5,"engineering":6}' material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE ) @@ -304,13 +304,13 @@ interface_name = "mounted plasma cutter" interface_desc = "A forearm-mounted suit-powered plasma cutter." - origin_tech = "{'materials':5,'exoticmatter':4,'engineering':7,'combat':5}" + origin_tech = @'{"materials":5,"exoticmatter":4,"engineering":7,"combat":5}' gun = /obj/item/gun/energy/plasmacutter/mounted material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE ) diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 6453b626e9f..d92a4c0e239 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -51,13 +51,13 @@ material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE ) - origin_tech = "{'programming':6,'materials':5,'engineering':6}" + origin_tech = @'{"programming":6,"materials":5,"engineering":6}' var/mob/integrated_ai // Direct reference to the actual mob held in the suit. - var/obj/item/ai_card // Reference to the MMI, posibrain, inteliCard or pAI card previously holding the AI. + var/obj/item/ai_card // Reference to the object previously holding the AI. var/obj/item/ai_verbs/verb_holder /mob @@ -136,7 +136,7 @@ return 1 // Okay, it wasn't a terminal being touched, check for all the simple insertions. - if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/organ/internal/posibrain)) + if(input_device.type in list(/obj/item/paicard, /obj/item/organ/internal/brain_interface)) if(integrated_ai) integrated_ai.attackby(input_device,user) // If the transfer was successful, we can clear out our vars. @@ -340,12 +340,12 @@ interface_name = "niling d-sink" interface_desc = "Colloquially known as a power siphon, this module drains power through the suit hands into the suit battery." - origin_tech = "{'powerstorage':6,'engineering':6}" + origin_tech = @'{"powerstorage":6,"engineering":6}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/atom/interfaced_with // Currently draining power from this device. diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 2d857ea0254..735a2facf1e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -15,7 +15,7 @@ icon_state = "module" material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE ) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index a3e55b3c798..91ba1424b49 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -20,7 +20,7 @@ active_power_cost = 6 KILOWATTS // 30 min battery life /w best (3kWh) cell passive_power_cost = 0 module_cooldown = 10 SECONDS - origin_tech = "{'materials':5,'powerstorage':6,'magnets':6,'esoteric':6,'engineering':7}" + origin_tech = @'{"materials":5,"powerstorage":6,"magnets":6,"esoteric":6,"engineering":7}' activate_string = "Enable Cloak" deactivate_string = "Disable Cloak" @@ -36,7 +36,7 @@ /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/rig_module/stealth_field/activate() @@ -153,12 +153,12 @@ fabrication_type = /obj/item/energy_net use_power_cost = 20 KILOWATTS - origin_tech = "{'materials':5,'powerstorage':6,'magnets':5,'esoteric':4,'engineering':6}" + origin_tech = @'{"materials":5,"powerstorage":6,"magnets":5,"esoteric":4,"engineering":6}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/rig_module/fabricator/energy_net/engage(atom/target) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index f70ec348639..cc9deeed3c7 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -37,9 +37,9 @@ engage_string = "Display Readout" usable = 1 use_power_cost = 200 - origin_tech = "{'magnets':3,'biotech':3,'engineering':5}" + origin_tech = @'{"magnets":3,"biotech":3,"engineering":5}' device = /obj/item/scanner/health - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE @@ -66,13 +66,13 @@ suit_overlay_inactive = null use_power_cost = 3600 //2 Wh per use module_cooldown = 0 - origin_tech = "{'materials':6,'powerstorage':4,'engineering':6}" + origin_tech = @'{"materials":6,"powerstorage":4,"engineering":6}' device = /obj/item/pickaxe/diamonddrill material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/rig_module/device/anomaly_scanner @@ -86,8 +86,8 @@ usable = 1 selectable = 0 device = /obj/item/ano_scanner - origin_tech = "{'wormholes':4,'magnets':4,'engineering':6}" - material = /decl/material/solid/plastic + origin_tech = @'{"wormholes":4,"magnets":4,"engineering":6}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE @@ -105,8 +105,8 @@ toggleable = 1 use_power_cost = 200 device = /obj/item/scanner/mining - origin_tech = "{'materials':4,'magnets':4,'engineering':6}" - material = /decl/material/solid/plastic + origin_tech = @'{"materials":4,"magnets":4,"engineering":6}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE @@ -128,12 +128,12 @@ usable = 1 engage_string = "Configure RCD" use_power_cost = 300 - origin_tech = "{'materials':6,'magnets':5,'engineering':7}" + origin_tech = @'{"materials":6,"magnets":5,"engineering":7}' device = /obj/item/rcd/mounted material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) @@ -383,10 +383,10 @@ interface_name = "maneuvering jets" interface_desc = "An inbuilt EVA maneuvering system that runs off a seperate gas supply." - origin_tech = "{'materials':6,'engineering':7}" + origin_tech = @'{"materials":6,"engineering":7}' material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE ) var/obj/item/tank/jetpack/rig/jets @@ -523,25 +523,25 @@ icon_state = "ewar" interface_name = "mounted matter decompiler" interface_desc = "Eats trash like no one's business." - origin_tech = "{'materials':5,'engineering':5}" + origin_tech = @'{"materials":5,"engineering":5}' device = /obj/item/matter_decompiler material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE ) /obj/item/rig_module/cooling_unit name = "mounted cooling unit" toggleable = 1 - origin_tech = "{'magnets':2,'materials':2,'engineering':5}" + origin_tech = @'{"magnets":2,"materials":2,"engineering":5}' interface_name = "mounted cooling unit" interface_desc = "A heat sink with a liquid cooled radiator." module_cooldown = 0 SECONDS //no cd because its critical for a life-support module material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/charge_consumption = 0.5 KILOWATTS var/max_cooling = 12 diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index 99ceb033ce6..3b19bf49653 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -58,7 +58,7 @@ material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/datum/rig_vision/vision @@ -91,7 +91,7 @@ name = "hardsuit meson scanner" desc = "A layered, translucent visor system for a hardsuit." icon_state = "meson" - origin_tech = "{'magnets':2,'engineering':5}" + origin_tech = @'{"magnets":2,"engineering":5}' usable = 0 interface_name = "meson scanner" @@ -117,14 +117,14 @@ name = "hardsuit night vision interface" desc = "A multi input night vision system for a hardsuit." icon_state = "night" - origin_tech = "{'magnets':6,'engineering':6}" + origin_tech = @'{"magnets":6,"engineering":6}' usable = 0 interface_name = "night vision interface" interface_desc = "An integrated night vision system." vision_modes = list(/datum/rig_vision/nvg) - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE, @@ -136,7 +136,7 @@ name = "hardsuit security hud" desc = "A simple tactical information system for a hardsuit." icon_state = "securityhud" - origin_tech = "{'magnets':3,'biotech':2,'engineering':5}" + origin_tech = @'{"magnets":3,"biotech":2,"engineering":5}' usable = 0 interface_name = "security HUD" @@ -149,7 +149,7 @@ name = "hardsuit medical hud" desc = "A simple medical status indicator for a hardsuit." icon_state = "healthhud" - origin_tech = "{'magnets':3,'biotech':2,'engineering':5}" + origin_tech = @'{"magnets":3,"biotech":2,"engineering":5}' usable = 0 interface_name = "medical HUD" diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 0f25ee45e80..f842ec06611 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -33,11 +33,10 @@ siemens_coefficient = 0.2 permeability_coefficient = 0.1 - unacidable = 1 material = /decl/material/solid/metal/titanium matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_TRACE, @@ -172,7 +171,6 @@ if(piece.siemens_coefficient > siemens_coefficient) //So that insulated gloves keep their insulation. piece.siemens_coefficient = siemens_coefficient piece.permeability_coefficient = permeability_coefficient - piece.unacidable = unacidable if(islist(armor)) piece.armor = armor.Copy() // codex reads the armor list, not extensions. this list does not have any effect on in game mechanics remove_extension(piece, /datum/extension/armor) @@ -202,7 +200,7 @@ LAZYSET(chest.slowdown_per_slot, slot_wear_suit_str, (active? online_slowdown : offline_slowdown)) if(helmet) helmet.tint = (active? vision_restriction : offline_vision_restriction) - helmet.update_vision() + helmet.update_wearer_vision() /obj/item/rig/proc/suit_is_deployed() if(!istype(wearer) || src.loc != wearer || wearer.get_equipped_item(slot_back_str) != src) @@ -581,7 +579,7 @@ for(var/slot in update_rig_slots) wearer.update_equipment_overlay(slot) -/obj/item/rig/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/rig/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && slot == slot_back_str && !offline && equipment_overlay_icon && LAZYLEN(installed_modules)) for(var/obj/item/rig_module/module in installed_modules) if(module.suit_overlay) diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index c90476de578..a219f13e06d 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -29,7 +29,7 @@ if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" -/obj/item/clothing/head/helmet/space/rig/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/helmet/space/rig/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && user_mob?.check_rig_status() && check_state_in_icon("[overlay.icon_state]-sealed", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-sealed" . = ..() @@ -49,7 +49,7 @@ if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" -/obj/item/clothing/gloves/rig/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/gloves/rig/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && user_mob?.check_rig_status() && check_state_in_icon("[overlay.icon_state]-sealed", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-sealed" . = ..() @@ -69,7 +69,7 @@ if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" -/obj/item/clothing/shoes/magboots/rig/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/shoes/magboots/rig/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && user_mob?.check_rig_status() && check_state_in_icon("[overlay.icon_state]-sealed", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-sealed" . = ..() @@ -95,7 +95,7 @@ if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" -/obj/item/clothing/suit/space/rig/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/suit/space/rig/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && user_mob?.check_rig_status() && check_state_in_icon("[overlay.icon_state]-sealed", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-sealed" . = ..() diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index 23c2abd6baa..a21fb598d8b 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -47,7 +47,6 @@ gloves = /obj/item/clothing/gloves/rig/combat /obj/item/clothing/head/helmet/space/rig/combat - light_overlay = "helmet_light_dual_green" icon = 'icons/clothing/rigs/helmets/helmet_security.dmi' /obj/item/clothing/suit/space/rig/combat icon = 'icons/clothing/rigs/chests/chest_security.dmi' @@ -120,7 +119,6 @@ gloves = /obj/item/clothing/gloves/rig/military /obj/item/clothing/head/helmet/space/rig/military - light_overlay = "helmet_light_dual_green" icon = 'icons/clothing/rigs/helmets/helmet_military.dmi' /obj/item/clothing/suit/space/rig/military icon = 'icons/clothing/rigs/chests/chest_military.dmi' diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm index 6a0c955ac50..06c837cbe4a 100644 --- a/code/modules/clothing/spacesuits/rig/suits/merc.dm +++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm @@ -37,7 +37,6 @@ item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS icon = 'icons/clothing/rigs/gloves/gloves_merc.dmi' /obj/item/clothing/head/helmet/space/rig/merc - light_overlay = "helmet_light_dual_green" camera = /obj/machinery/camera/network/mercenary icon = 'icons/clothing/rigs/helmets/helmet_merc.dmi' /obj/item/clothing/shoes/rig/merc diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 77582a59243..50961204ea4 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -110,7 +110,6 @@ req_access = list(access_engine_equip) /obj/item/clothing/head/helmet/space/rig/eva - light_overlay = "helmet_light_dual" camera = /obj/machinery/camera/network/engineering icon = 'icons/clothing/rigs/helmets/helmet_eva.dmi' /obj/item/clothing/suit/space/rig/eva @@ -212,7 +211,6 @@ req_access = list(access_tox) /obj/item/clothing/head/helmet/space/rig/hazmat - light_overlay = "helmet_light_dual" camera = /obj/machinery/camera/network/research icon = 'icons/clothing/rigs/helmets/helmet_science.dmi' /obj/item/clothing/suit/space/rig/hazmat @@ -303,7 +301,6 @@ anomaly_shielding = 1 /obj/item/clothing/head/helmet/space/rig/hazard - light_overlay = "helmet_light_dual" camera = /obj/machinery/camera/network/security icon = 'icons/clothing/rigs/helmets/helmet_hazard.dmi' /obj/item/clothing/suit/space/rig/hazard @@ -354,7 +351,6 @@ /obj/item/clothing/head/helmet/space/rig/zero camera = null - light_overlay = "helm_light" desc = "A bubble helmet that maximizes the field of view. A state of the art holographic display provides a stream of information" icon = 'icons/clothing/rigs/helmets/helmet_null.dmi' diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 274edf5ff58..a259a0462b0 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -23,14 +23,13 @@ randpixel = 0 flash_protection = FLASH_PROTECTION_MAJOR action_button_name = "Toggle Helmet Light" - light_overlay = "helmet_light" brightness_on = 4 light_wedge = LIGHT_WIDE on = 0 var/obj/machinery/camera/camera var/tinted = null //Set to non-null for toggleable tint helmets - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel /obj/item/clothing/head/helmet/space/Destroy() @@ -54,6 +53,10 @@ set category = "Object" set src in usr + var/mob/living/user = usr + if(!istype(user)) + return + if(ispath(camera)) camera = new camera(src) camera.set_status(0) @@ -61,10 +64,10 @@ if(camera) camera.set_status(!camera.status) if(camera.status) - camera.c_tag = FindNameFromID(usr) - to_chat(usr, "User scanned as [camera.c_tag]. Camera activated.") + camera.c_tag = user.get_id_name() + to_chat(user, "User scanned as [camera.c_tag]. Camera activated.") else - to_chat(usr, "Camera deactivated.") + to_chat(user, "Camera deactivated.") /obj/item/clothing/head/helmet/space/examine(mob/user, distance) . = ..() @@ -94,20 +97,20 @@ to_chat(usr, "You toggle [src]'s visor tint.") update_tint() -/obj/item/clothing/head/helmet/space/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/head/helmet/space/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && tint && check_state_in_icon("[overlay.icon_state]_dark", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_dark" . = ..() /obj/item/clothing/head/helmet/space/on_update_icon(mob/user) . = ..() - var/base_icon = get_world_inventory_state() - if(!base_icon) - base_icon = initial(icon_state) - if(tint && check_state_in_icon("[base_icon]_dark", icon)) - icon_state = "[base_icon]_dark" + var/base_icon_state = get_world_inventory_state() + if(!base_icon_state) + base_icon_state = initial(icon_state) + if(tint && check_state_in_icon("[base_icon_state]_dark", icon)) + icon_state = "[base_icon_state]_dark" else - icon_state = base_icon + icon_state = base_icon_state /obj/item/clothing/suit/space name = "space suit" @@ -132,12 +135,12 @@ center_of_mass = null randpixel = 0 valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_OVER) - origin_tech = "{'materials':3, 'engineering':3}" - material = /decl/material/solid/plastic + origin_tech = @'{"materials":3, "engineering":3}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT ) protects_against_weather = TRUE diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 919f3be047b..bac9c28b8bc 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -285,7 +285,7 @@ else if(##equipment_var) {\ /obj/item/clothing/suit/space/void/attack_self() //sole purpose of existence is to toggle the helmet toggle_helmet() -/obj/item/clothing/suit/space/void/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/suit/space/void/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && tank && slot == slot_back_str) overlay.overlays += tank.get_mob_overlay(user_mob, slot_back_str) . = ..() diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index dba126f1951..614aec8086d 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -3,7 +3,7 @@ name = "gem-encrusted voidsuit helmet" desc = "A bizarre gem-encrusted helmet that radiates magical energies." icon = 'icons/clothing/spacesuit/void/wizard/helmet.dmi' - unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles! + material = /decl/material/solid/gemstone/crystal armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, @@ -21,7 +21,7 @@ desc = "A bizarre gem-encrusted suit that radiates magical energies." icon = 'icons/clothing/spacesuit/void/wizard/suit.dmi' w_class = ITEM_SIZE_LARGE //normally voidsuits are bulky but this one is magic I suppose - unacidable = 1 + material = /decl/material/solid/gemstone/crystal armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, @@ -53,7 +53,7 @@ gender = PLURAL gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - unacidable = 1 + material = /decl/material/solid/gemstone/crystal armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, diff --git a/code/modules/clothing/suits/_suit.dm b/code/modules/clothing/suits/_suit.dm index 58e9f58a648..99ed1ab1a02 100644 --- a/code/modules/clothing/suits/_suit.dm +++ b/code/modules/clothing/suits/_suit.dm @@ -19,7 +19,7 @@ /obj/item/clothing/suit/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return TRUE -/obj/item/clothing/suit/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/suit/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && item_state) overlay.icon_state = item_state . = ..() diff --git a/code/modules/clothing/suits/armor/_armor.dm b/code/modules/clothing/suits/armor/_armor.dm index 1369417acf4..eb04ea7d330 100644 --- a/code/modules/clothing/suits/armor/_armor.dm +++ b/code/modules/clothing/suits/armor/_armor.dm @@ -9,4 +9,4 @@ max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.6 blood_overlay_type = "armor" - origin_tech = "{'materials':1,'engineering':1,'combat':1}" + origin_tech = @'{"materials":1,"engineering":1,"combat":1}' diff --git a/code/modules/clothing/suits/armor/bulletproof.dm b/code/modules/clothing/suits/armor/bulletproof.dm index 198bb143bfd..8c217d5b4f4 100644 --- a/code/modules/clothing/suits/armor/bulletproof.dm +++ b/code/modules/clothing/suits/armor/bulletproof.dm @@ -19,7 +19,7 @@ /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':3,'engineering':1,'combat':3}" + origin_tech = @'{"materials":3,"engineering":1,"combat":3}' // no accessory /obj/item/clothing/suit/armor/bulletproof/prepared @@ -43,7 +43,7 @@ /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':3,'engineering':1,'combat':3}" + origin_tech = @'{"materials":3,"engineering":1,"combat":3}' /obj/item/clothing/accessory/legguards/ballistic name = "ballistic leg guards" @@ -64,4 +64,4 @@ /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':3,'engineering':1,'combat':3}" \ No newline at end of file + origin_tech = @'{"materials":3,"engineering":1,"combat":3}' \ No newline at end of file diff --git a/code/modules/clothing/suits/armor/craftable.dm b/code/modules/clothing/suits/armor/craftable.dm index f4111b395ef..18478dfe183 100644 --- a/code/modules/clothing/suits/armor/craftable.dm +++ b/code/modules/clothing/suits/armor/craftable.dm @@ -24,9 +24,9 @@ desc = initial(desc) /obj/item/clothing/suit/armor/crafted/cardboard - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard /obj/item/clothing/suit/armor/crafted/leather - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/clothing/suit/armor/crafted/copper material = /decl/material/solid/metal/copper /obj/item/clothing/suit/armor/crafted/diamond diff --git a/code/modules/clothing/suits/armor/merc.dm b/code/modules/clothing/suits/armor/merc.dm index 3ee072f2d06..c81931f77f1 100644 --- a/code/modules/clothing/suits/armor/merc.dm +++ b/code/modules/clothing/suits/armor/merc.dm @@ -15,7 +15,7 @@ ) material = /decl/material/solid/metal/titanium matter = list(/decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':5,'engineering':2,'combat':3}" + origin_tech = @'{"materials":5,"engineering":2,"combat":3}' /obj/item/clothing/accessory/armguards/merc name = "heavy arm guards" @@ -30,7 +30,7 @@ ) color = null material = /decl/material/solid/metal/steel - origin_tech = "{'materials':2,'engineering':1,'combat':2}" + origin_tech = @'{"materials":2,"engineering":1,"combat":2}' /obj/item/clothing/accessory/legguards/merc name = "heavy leg guards" @@ -45,4 +45,4 @@ ARMOR_BOMB = ARMOR_BOMB_PADDED ) material = /decl/material/solid/metal/steel - origin_tech = "{'materials':2,'engineering':1,'combat':2}" + origin_tech = @'{"materials":2,"engineering":1,"combat":2}' diff --git a/code/modules/clothing/suits/armor/plate_carrier.dm b/code/modules/clothing/suits/armor/plate_carrier.dm index e9c2d228d60..4b242bc95d1 100644 --- a/code/modules/clothing/suits/armor/plate_carrier.dm +++ b/code/modules/clothing/suits/armor/plate_carrier.dm @@ -6,7 +6,7 @@ color = COLOR_GRAY40 valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S, ACCESSORY_SLOT_ARMOR_M) restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S) - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather starting_accessories = null /obj/item/clothing/suit/armor/pcarrier/light diff --git a/code/modules/clothing/suits/armor/reactive.dm b/code/modules/clothing/suits/armor/reactive.dm index e57aacf502c..8c3a5cae75e 100644 --- a/code/modules/clothing/suits/armor/reactive.dm +++ b/code/modules/clothing/suits/armor/reactive.dm @@ -48,7 +48,7 @@ . = ..() icon_state = "[get_world_inventory_state()][active ? "_on" : ""]" -/obj/item/clothing/suit/armor/reactive/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/suit/armor/reactive/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && active && check_state_in_icon("[overlay.icon_state]_on", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_on" . = ..() diff --git a/code/modules/clothing/suits/armor/riot.dm b/code/modules/clothing/suits/armor/riot.dm index 8027fcd8bff..378f70efd61 100644 --- a/code/modules/clothing/suits/armor/riot.dm +++ b/code/modules/clothing/suits/armor/riot.dm @@ -16,9 +16,9 @@ siemens_coefficient = 0.5 material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/cloth = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY ) - origin_tech = "{'materials':1,'engineering':1,'combat':2}" + origin_tech = @'{"materials":1,"engineering":1,"combat":2}' /obj/item/clothing/suit/armor/riot/prepared starting_accessories = list(/obj/item/clothing/accessory/armguards/riot, /obj/item/clothing/accessory/legguards/riot) @@ -40,8 +40,8 @@ siemens_coefficient = 0.5 slowdown = 1 material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/cloth = MATTER_AMOUNT_SECONDARY) - origin_tech = "{'materials':1,'engineering':1,'combat':2}" + matter = list(/decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY) + origin_tech = @'{"materials":1,"engineering":1,"combat":2}' /obj/item/clothing/accessory/armguards/riot name = "riot arm guards" @@ -57,6 +57,6 @@ color = null siemens_coefficient = 0.5 material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/cloth = MATTER_AMOUNT_SECONDARY) - origin_tech = "{'materials':1,'engineering':1,'combat':2}" + matter = list(/decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY) + origin_tech = @'{"materials":1,"engineering":1,"combat":2}' diff --git a/code/modules/clothing/suits/armor/security.dm b/code/modules/clothing/suits/armor/security.dm index 4809cd4adae..99c26d00735 100644 --- a/code/modules/clothing/suits/armor/security.dm +++ b/code/modules/clothing/suits/armor/security.dm @@ -27,7 +27,7 @@ body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS cold_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS heat_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather matter = list( /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 635fbbc63f0..d51ec5781f7 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -12,9 +12,9 @@ item_flags = ITEM_FLAG_THICKMATERIAL body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS siemens_coefficient = 0.9 - origin_tech = "{'materials':3, 'engineering':3}" + origin_tech = @'{"materials":3, "engineering":3}' matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT ) @@ -34,9 +34,9 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL item_flags = ITEM_FLAG_THICKMATERIAL siemens_coefficient = 0.9 - origin_tech = "{'materials':3, 'engineering':3}" + origin_tech = @'{"materials":3, "engineering":3}' matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT ) @@ -89,8 +89,8 @@ desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against space plague." icon = 'icons/clothing/suit/biosuit/plague.dmi' flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL - origin_tech = "{'materials':1,'engineering':1,'biotech':1}" + origin_tech = @'{"materials":1,"engineering":1,"biotech":1}' matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT ) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 394b41d4ddd..3d800838cd7 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -85,7 +85,7 @@ ARMOR_LASER = ARMOR_LASER_SMALL, ARMOR_ENERGY = ARMOR_ENERGY_MINOR ) - origin_tech = "{'materials':2, 'engineering':2}" + origin_tech = @'{"materials":2, "engineering":2}' matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) //Forensics @@ -101,7 +101,7 @@ ARMOR_LASER = ARMOR_LASER_MINOR, ARMOR_ENERGY = ARMOR_ENERGY_MINOR ) - origin_tech = "{'materials':2, 'engineering':2}" + origin_tech = @'{"materials":2, "engineering":2}' matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT) /obj/item/clothing/suit/storage/forensics/red diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 7ed9c634d74..a5527976a9d 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -26,7 +26,7 @@ restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) markings_icon = "_marking" matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE) - origin_tech = "{'materials':1,'engineering':1,'biotech':1}" + origin_tech = @'{"materials":1,"engineering":1,"biotech":1}' /obj/item/clothing/suit/storage/toggle/labcoat/cmo name = "chief medical officer's labcoat" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 4f3ef902377..aab123c760a 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -147,7 +147,7 @@ icon = 'icons/clothing/suit/leathercoat.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME material_armor_multiplier = 0.8 - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather var/shine var/artificial_shine @@ -158,7 +158,7 @@ shine = material.reflectiveness desc = "A long, thick [material.use_name] coat." -/obj/item/clothing/suit/leathercoat/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/suit/leathercoat/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && shine > 0 && slot == slot_wear_suit_str) var/mutable_appearance/S = mutable_appearance(overlay.icon, "shine") S.alpha = max(shine, artificial_shine)/100 * 255 @@ -166,7 +166,7 @@ . = ..() /obj/item/clothing/suit/leathercoat/synth - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth artificial_shine = 80 //stripper @@ -193,7 +193,7 @@ cold_protection = SLOT_UPPER_BODY|SLOT_ARMS min_cold_protection_temperature = T0C - 20 siemens_coefficient = 0.7 - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/clothing/suit/storage/leather_jacket name = "black leather jacket" diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index c348f4219f0..5e3fff9233b 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -15,8 +15,10 @@ return ..(user) return TRUE -/obj/item/clothing/suit/storage/handle_mouse_drop(atom/over, mob/user) - . = pockets?.handle_storage_internal_mouse_drop(user, over) && ..() +/obj/item/clothing/suit/storage/handle_mouse_drop(atom/over, mob/user, params) + if(istype(over, /obj/screen/inventory)) + return ..() + return pockets?.handle_storage_internal_mouse_drop(user, over) && ..() /obj/item/clothing/suit/storage/attackby(obj/item/W, mob/user) ..() diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 255ce885048..2edcb16bafd 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -59,7 +59,7 @@ else icon_state = get_world_inventory_state() -/obj/item/clothing/suit/storage/toggle/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/suit/storage/toggle/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(buttons && overlay && check_state_in_icon("[overlay.icon_state]_open", overlay.icon)) overlay.icon_state = "[overlay.icon_state]_open" . = ..() diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index b6cd249815d..c30941bf3b1 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -31,7 +31,7 @@ matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/suit/fire/Initialize() . = ..() @@ -101,11 +101,11 @@ ARMOR_RAD = ARMOR_RAD_SHIELDED ) matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/suit/radiation name = "radiation suit" @@ -122,10 +122,10 @@ ) flags_inv = HIDEJUMPSUIT|HIDETAIL|HIDEGLOVES|HIDESHOES matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/suit/radiation/Initialize() . = ..() @@ -137,7 +137,7 @@ /obj/item/clothing/head/chem_hood name = "chemical hood" - desc = "A hood that protects the head from chemical comtaminants." + desc = "A hood that protects the head from chemical contaminants." icon = 'icons/clothing/head/chem_hood.dmi' permeability_coefficient = 0 armor = list( @@ -146,13 +146,13 @@ ) flags_inv = HIDEEARS|BLOCK_HEAD_HAIR item_flags = ITEM_FLAG_THICKMATERIAL - body_parts_covered = SLOT_HEAD|SLOT_EARS + body_parts_covered = SLOT_HEAD|SLOT_EARS|SLOT_FACE siemens_coefficient = 0.9 matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/clothing/suit/chem_suit name = "chemical suit" @@ -171,7 +171,7 @@ item_flags = ITEM_FLAG_THICKMATERIAL siemens_coefficient = 0.9 matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 35f3bf665a0..04a12bba6ff 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -9,6 +9,7 @@ force = 0 valid_accessory_slots = list( + ACCESSORY_SLOT_SENSORS, ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_HOLSTER, ACCESSORY_SLOT_ARMBAND, @@ -29,21 +30,18 @@ ACCESSORY_SLOT_OVER ) - var/has_sensor = SUIT_HAS_SENSORS - var/sensor_mode = SUIT_SENSOR_OFF var/displays_id = 1 var/rolled_down = FALSE var/rolled_sleeves = FALSE /obj/item/clothing/under/Initialize() - sensor_mode = pick(0,1,2,3) . = ..() if(check_state_in_icon("[BODYTYPE_HUMANOID]-[slot_w_uniform_str]-rolled", icon)) verbs |= /obj/item/clothing/under/proc/roll_down_clothes if(check_state_in_icon("[BODYTYPE_HUMANOID]-[slot_w_uniform_str]-sleeves", icon)) verbs |= /obj/item/clothing/under/proc/roll_up_sleeves -/obj/item/clothing/under/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/under/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && slot == slot_w_uniform_str) if(rolled_down && check_state_in_icon("[overlay.icon_state]-rolled", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-rolled" @@ -88,93 +86,6 @@ var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) LAZYDISTINCTADD(., under_slots) -/obj/item/clothing/under/examine(mob/user) - . = ..() - switch(src.sensor_mode) - if(0) - to_chat(user, "Its sensors appear to be disabled.") - if(1) - to_chat(user, "Its binary life sensors appear to be enabled.") - if(2) - to_chat(user, "Its vital tracker appears to be enabled.") - if(3) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") - -/obj/item/clothing/under/proc/set_sensors(mob/user) - var/mob/M = user - if (isobserver(M)) return - if (user.incapacitated()) return - if(has_sensor >= SUIT_LOCKED_SENSORS) - to_chat(user, "The controls are locked.") - return 0 - if(has_sensor <= SUIT_NO_SENSORS) - to_chat(user, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") - var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes - if(get_dist(user, src) > 1) - to_chat(user, "You have moved too far away.") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == user) - var/user_message - switch(sensor_mode) - if(0) - user_message = "You disable your suit's remote sensing equipment." - if(1) - user_message = "Your suit will now report whether you are live or dead." - if(2) - user_message = "Your suit will now report your vital lifesigns." - if(3) - user_message = "Your suit will now report your vital lifesigns as well as your coordinate position." - - if(user_message) - var/decl/pronouns/G = user.get_pronouns() - user.visible_message( \ - SPAN_NOTICE("\The [user] adjusts the tracking sensor on [G.his] [name]."), \ - SPAN_NOTICE(user_message)) - - else if (ismob(src.loc)) - if(sensor_mode == 0) - user.visible_message("[user] disables [src.loc]'s remote sensing equipment.", "You disable [src.loc]'s remote sensing equipment.") - else - user.visible_message("[user] adjusts the tracking sensor on [src.loc]'s [src.name].", "You adjust [src.loc]'s sensors.") - else - user.visible_message("[user] adjusts the tracking sensor on [src]", "You adjust the sensor on [src].") - -/obj/item/clothing/under/emp_act(var/severity) - ..() - var/new_mode - switch(severity) - if(1) - new_mode = pick(75;SUIT_SENSOR_OFF, 15;SUIT_SENSOR_BINARY, 10;SUIT_SENSOR_VITAL) - if(2) - new_mode = pick(50;SUIT_SENSOR_OFF, 25;SUIT_SENSOR_BINARY, 20;SUIT_SENSOR_VITAL, 5;SUIT_SENSOR_TRACKING) - else - new_mode = pick(25;SUIT_SENSOR_OFF, 35;SUIT_SENSOR_BINARY, 30;SUIT_SENSOR_VITAL, 10;SUIT_SENSOR_TRACKING) - - sensor_mode = new_mode - -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - set_sensors(usr) - -/decl/interaction_handler/clothing_set_sensors - name = "Set Sensors Level" - expected_target_type = /obj/item/clothing/under - -/decl/interaction_handler/clothing_set_sensors/invoked(var/atom/target, var/mob/user) - var/obj/item/clothing/under/U = target - U.set_sensors(user) - -/obj/item/clothing/under/get_alt_interactions(var/mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/clothing_set_sensors) - // This stub is so the linter stops yelling about sleeping during Initialize() // due to corpse props equipping themselves, which calls equip_to_slot, which // calls attackby(), which sometimes sleeps due to input(). Yeah. diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index bea89057513..5d3becfdf66 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -61,7 +61,7 @@ if(uniform.rolled_sleeves && hide_on_uniform_rollsleeves) return FALSE -/obj/item/clothing/accessory/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && istype(loc, /obj/item/clothing/under)) var/new_state = overlay.icon_state var/obj/item/clothing/under/uniform = loc diff --git a/code/modules/clothing/under/accessories/accessory_toggleable.dm b/code/modules/clothing/under/accessories/accessory_toggleable.dm index 0720696be1d..56d6a31f1ac 100644 --- a/code/modules/clothing/under/accessories/accessory_toggleable.dm +++ b/code/modules/clothing/under/accessories/accessory_toggleable.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD var/open = FALSE -/obj/item/clothing/accessory/toggleable/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/toggleable/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && open && check_state_in_icon("[overlay.icon_state]-open", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-open" . = ..() @@ -155,7 +155,7 @@ icon_state = "[icon_state]-tucked" update_clothing_icon() -/obj/item/clothing/accessory/toggleable/flannel/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/toggleable/flannel/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) if(rolled && check_state_in_icon("[overlay.icon_state]-rolled", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-rolled" diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index ac6389b64f2..5960722be72 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -33,11 +33,11 @@ ARMOR_BOMB = ARMOR_BOMB_MINOR ) slot = ACCESSORY_SLOT_ARMOR_C - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY ) - origin_tech = "{'materials':1,'engineering':1,'combat':1}" + origin_tech = @'{"materials":1,"engineering":1,"combat":1}' /obj/item/clothing/accessory/armor/plate/get_fibers() return null //plates do not shed @@ -56,7 +56,7 @@ matter = list( /decl/material/solid/metal/plasteel = MATTER_AMOUNT_SECONDARY ) - origin_tech = "{'materials':2,'engineering':1,'combat':2}" + origin_tech = @'{"materials":2,"engineering":1,"combat":2}' /obj/item/clothing/accessory/armor/plate/tactical name = "tactical armor plate" @@ -75,7 +75,7 @@ /decl/material/solid/metal/titanium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'materials':3,'engineering':2,'combat':2}" + origin_tech = @'{"materials":3,"engineering":2,"combat":2}' //Arm guards /obj/item/clothing/accessory/armguards @@ -94,11 +94,11 @@ ARMOR_BOMB = ARMOR_BOMB_PADDED ) slot = ACCESSORY_SLOT_ARMOR_A - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY ) - origin_tech = "{'materials':1,'engineering':1,'combat':1}" + origin_tech = @'{"materials":1,"engineering":1,"combat":1}' /obj/item/clothing/accessory/armguards/craftable material_armor_multiplier = 1 @@ -122,11 +122,11 @@ ARMOR_BOMB = ARMOR_BOMB_PADDED ) slot = ACCESSORY_SLOT_ARMOR_L - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY ) - origin_tech = "{'materials':1,'engineering':1,'combat':1}" + origin_tech = @'{"materials":1,"engineering":1,"combat":1}' /obj/item/clothing/accessory/legguards/craftable material_armor_multiplier = 1 diff --git a/code/modules/clothing/under/accessories/cloaks.dm b/code/modules/clothing/under/accessories/cloaks.dm index 271e6550173..390f2eba438 100644 --- a/code/modules/clothing/under/accessories/cloaks.dm +++ b/code/modules/clothing/under/accessories/cloaks.dm @@ -25,7 +25,7 @@ // Cloaks should layer over and under everything, so set the layer directly rather // than relying on overlay order. This also overlays over inhands but it looks ok. -/obj/item/clothing/accessory/cloak/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/cloak/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(slot == slot_wear_suit_str || slot == slot_tie_str || slot == slot_w_uniform_str) @@ -35,8 +35,8 @@ var/bodyicon = get_icon_for_bodytype(bodytype) var/decl/bodytype/root_bodytype = user_mob.get_bodytype() if(user_mob && bodytype != root_bodytype.bodytype_category) - underlay = root_bodytype.get_offset_overlay_image(FALSE, bodyicon, "[bodytype]-underlay", color, slot) - cloverlay = root_bodytype.get_offset_overlay_image(FALSE, bodyicon, "[bodytype]-overlay", color, slot) + underlay = root_bodytype.get_offset_overlay_image(bodyicon, "[bodytype]-underlay", color, slot) + cloverlay = root_bodytype.get_offset_overlay_image(bodyicon, "[bodytype]-overlay", color, slot) else underlay = image(bodyicon, "[bodytype]-underlay") cloverlay = image(bodyicon, "[bodytype]-overlay") @@ -127,7 +127,7 @@ name = "cloak" desc = "A ragged cloak made of some sort of thick hide." icon = 'icons/clothing/suit/cloaks/cloak_hide.dmi' - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME armor_type = /datum/extension/armor/ablative body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 0fa9fbee52c..c30ba70aa2f 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -16,7 +16,7 @@ ARMOR_ENERGY = ARMOR_ENERGY_MINOR ) body_parts_covered = SLOT_UPPER_BODY - origin_tech = "{'combat':2,'materials':3,'esoteric':2}" + origin_tech = @'{"combat":2,"materials":3,"esoteric":2}' /obj/item/clothing/accessory/suspenders name = "suspenders" @@ -95,7 +95,7 @@ if(sleeves_rolled && check_state_in_icon("[icon_state]-sleeves", icon)) icon_state = "[icon_state]-sleeves" -/obj/item/clothing/accessory/tangzhuang/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/tangzhuang/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && sleeves_rolled && check_state_in_icon("[overlay.icon_state]-sleeves", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-sleeves" . = ..() diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 092d935b86a..670ecca3518 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -31,9 +31,11 @@ return ..(user) return TRUE -/obj/item/clothing/accessory/storage/handle_mouse_drop(atom/over, mob/user) +/obj/item/clothing/accessory/storage/handle_mouse_drop(atom/over, mob/user, params) + if(istype(over, /obj/screen/inventory)) + return ..() if(!istype(loc, /obj/item/clothing) && hold?.handle_storage_internal_mouse_drop(user, over)) - . = ..(over) + return ..() return TRUE /obj/item/clothing/accessory/storage/attackby(obj/item/W, mob/user) @@ -121,7 +123,7 @@ if(contents_count > 0 && check_state_in_icon("[icon_state]-[contents_count]", icon)) icon_state = "[icon_state]-[contents_count]" -/obj/item/clothing/accessory/storage/knifeharness/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/storage/knifeharness/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) var/contents_count = min(length(contents), 2) if(contents_count > 0 && check_state_in_icon("[overlay.icon_state]-[contents_count]", overlay.icon)) diff --git a/code/modules/clothing/under/accessories/ties.dm b/code/modules/clothing/under/accessories/ties.dm index 282035a7942..fbff4b81f28 100644 --- a/code/modules/clothing/under/accessories/ties.dm +++ b/code/modules/clothing/under/accessories/ties.dm @@ -75,7 +75,7 @@ tied = !tied update_icon() -/obj/item/clothing/accessory/bowtie/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/clothing/accessory/bowtie/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && !tied && check_state_in_icon("[overlay.icon_state]-untied", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-untied" . = ..() diff --git a/code/modules/clothing/under/accessories/vitals_sensor.dm b/code/modules/clothing/under/accessories/vitals_sensor.dm new file mode 100644 index 00000000000..ef51b0b2d4f --- /dev/null +++ b/code/modules/clothing/under/accessories/vitals_sensor.dm @@ -0,0 +1,143 @@ +/obj/item/clothing/accessory/vitals_sensor + name = "vitals sensor" + desc = "A small sensor used to read the biometrics and vital signs of the wearer." + slot_flags = SLOT_TIE + icon = 'icons/clothing/accessories/vitals_sensor.dmi' + icon_state = ICON_STATE_WORLD + slot = ACCESSORY_SLOT_SENSORS + var/sensors_locked = FALSE + var/sensor_mode + var/static/list/sensor_modes = list( + "Off", + "Binary sensors", + "Vitals tracker", + "Tracking beacon" + ) + +/obj/item/clothing/accessory/vitals_sensor/Initialize() + . = ..() + if(isnull(sensor_mode) || sensor_mode < VITALS_SENSOR_OFF || sensor_mode > VITALS_SENSOR_TRACKING) + set_sensor_mode(rand(VITALS_SENSOR_OFF, VITALS_SENSOR_TRACKING)) + update_removable() + +/obj/item/clothing/accessory/vitals_sensor/proc/toggle_sensors_locked() + set_sensors_locked(!get_sensors_locked()) + +/obj/item/clothing/accessory/vitals_sensor/proc/get_sensors_locked() + return sensors_locked + +/obj/item/clothing/accessory/vitals_sensor/proc/set_sensors_locked(new_state) + if(get_sensors_locked() != new_state) + sensors_locked = new_state + update_removable() + +/obj/item/clothing/accessory/vitals_sensor/examine(mob/user) + . = ..() + switch(sensor_mode) + if(VITALS_SENSOR_OFF) + to_chat(user, "It appears to be disabled.") + if(VITALS_SENSOR_BINARY) + to_chat(user, "Its binary life tracker appear to be enabled.") + if(VITALS_SENSOR_VITAL) + to_chat(user, "Its vital tracker appears to be enabled.") + if(VITALS_SENSOR_TRACKING) + to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + +/obj/item/clothing/accessory/vitals_sensor/on_attached(obj/item/clothing/S, mob/user) + . = ..() + update_removable() + +/obj/item/clothing/accessory/vitals_sensor/on_removed(mob/user) + . = ..() + update_removable() + +/obj/item/clothing/accessory/vitals_sensor/proc/update_removable() + var/obj/item/clothing/clothes = loc + if(istype(clothes) && (src in clothes.accessories)) + removable = !sensors_locked + else + removable = TRUE + +/obj/item/clothing/accessory/vitals_sensor/proc/set_sensor_mode(var/new_sensor_mode) + if(sensor_mode != new_sensor_mode) + sensor_mode = new_sensor_mode + update_icon() + +/obj/item/clothing/accessory/vitals_sensor/on_update_icon() + . = ..() + cut_overlays() + var/image/I = image(icon, "[icon_state]-indicator") + I.appearance_flags |= RESET_COLOR + switch(sensor_mode) + if(VITALS_SENSOR_OFF) + I.color = COLOR_GRAY15 + if(VITALS_SENSOR_BINARY) + I.color = COLOR_AMBER + if(VITALS_SENSOR_VITAL) + I.color = COLOR_YELLOW + if(VITALS_SENSOR_TRACKING) + I.color = COLOR_LIME + else + I.color = COLOR_RED + add_overlay(I) + +/obj/item/clothing/accessory/vitals_sensor/attack_self(mob/user) + user_set_sensors(user) + return TRUE + +/obj/item/clothing/accessory/vitals_sensor/proc/user_set_sensors(mob/user) + if(sensors_locked) + to_chat(user, "The controls are locked.") + return FALSE + var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", sensor_modes[sensor_mode + 1]) in sensor_modes + if(user.incapacitated()) + return + if(loc != user && loc?.loc != user && !Adjacent(user)) + to_chat(user, "You have moved too far away.") + return + set_sensor_mode(sensor_modes.Find(switchMode) - 1) + var/mob/wearer = (ismob(loc) ? loc : (ismob(loc?.loc) ? loc.loc : null)) + if (wearer == user) // accessory or inhand + var/user_message + switch(sensor_mode) + if(VITALS_SENSOR_OFF) + user_message = "You disable your remote vitals sensor." + if(VITALS_SENSOR_BINARY) + user_message = "Your vitals sensor will now report whether you are live or dead." + if(VITALS_SENSOR_VITAL) + user_message = "Your vitals sensor will now report your vital lifesigns." + if(VITALS_SENSOR_TRACKING) + user_message = "Your vitals sensor will now report your vital lifesigns as well as your coordinate position." + if(user_message) + var/decl/pronouns/G = user.get_pronouns() + user.visible_message( \ + SPAN_NOTICE("\The [user] adjusts [G.his] vitals sensor."), + SPAN_NOTICE(user_message) + ) + return + if(wearer) + if(sensor_mode == 0) + user.visible_message( + SPAN_DANGER("\The [user] disables \the [wearer]'s vitals sensor."), + SPAN_DANGER("You disable \the [wearer]'s vitals sensor.") + ) + else + user.visible_message( + SPAN_NOTICE("\The [user] adjusts \the [wearer]'s vitals sensor."), + SPAN_NOTICE("You adjust \the [wearer]'s vitals sensor.") + ) + return + user.visible_message( + SPAN_NOTICE("\The [user] adjusts \the [src]"), + SPAN_NOTICE("You adjust \the [src].") + ) + +/obj/item/clothing/accessory/vitals_sensor/emp_act(var/severity) + ..() + switch(severity) + if(1) + set_sensor_mode(pick(75;VITALS_SENSOR_OFF, 15;VITALS_SENSOR_BINARY, 10;VITALS_SENSOR_VITAL)) + if(2) + set_sensor_mode(pick(50;VITALS_SENSOR_OFF, 25;VITALS_SENSOR_BINARY, 20;VITALS_SENSOR_VITAL, 5;VITALS_SENSOR_TRACKING)) + else + set_sensor_mode(pick(25;VITALS_SENSOR_OFF, 35;VITALS_SENSOR_BINARY, 30;VITALS_SENSOR_VITAL, 10;VITALS_SENSOR_TRACKING)) diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index abedb755a47..d4205a6f449 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -9,8 +9,13 @@ name = "orange jumpsuit" desc = "It's standardised prisoner-wear. Its suit sensor controls are permanently set to the \"Fully On\" position." icon = 'icons/clothing/under/jumpsuits/jumpsuit_prisoner.dmi' - has_sensor = SUIT_LOCKED_SENSORS - sensor_mode = SUIT_SENSOR_TRACKING + +/obj/item/clothing/under/color/orange/Initialize() + . = ..() + var/obj/item/clothing/accessory/vitals_sensor/sensor = new(src) + sensor.set_sensors_locked(TRUE) + sensor.set_sensor_mode(VITALS_SENSOR_TRACKING) + attach_accessory(null, sensor) /obj/item/clothing/under/color/blackjumpshorts name = "black jumpsuit shorts" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 6e4076073ba..b9476b9f16d 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -84,7 +84,7 @@ icon = 'icons/clothing/under/uniform_detective_1.dmi' siemens_coefficient = 0.9 starting_accessories = list(/obj/item/clothing/accessory/blue_clip) - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /obj/item/clothing/under/det/grey desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks." @@ -110,7 +110,7 @@ flags_inv = BLOCK_HEAD_HAIR markings_icon = "band" markings_color = "#b2977c" - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) /obj/item/clothing/head/det/attack_self(mob/user) @@ -139,9 +139,9 @@ ARMOR_MELEE = ARMOR_MELEE_SMALL ) siemens_coefficient = 0.8 - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - origin_tech = "{'materials':1,'engineering':1, 'combat':1}" + origin_tech = @'{"materials":1,"engineering":1, "combat":1}' /obj/item/clothing/head/HoS name = "Head of Security hat" @@ -149,7 +149,7 @@ icon = 'icons/clothing/head/hos.dmi' body_parts_covered = 0 siemens_coefficient = 0.8 - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/clothing/suit/armor/hos name = "armored coat" @@ -165,12 +165,12 @@ ) flags_inv = HIDEJUMPSUIT siemens_coefficient = 0.6 - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':3,'engineering':1, 'combat':2}" + origin_tech = @'{"materials":3,"engineering":1, "combat":2}' //Jensen cosplay gear /obj/item/clothing/under/head_of_security/jensen @@ -179,7 +179,7 @@ icon = 'icons/clothing/under/jumpsuits/jumpsuit_hos_alt.dmi' siemens_coefficient = 0.6 matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - origin_tech = "{'materials':3,'engineering':1, 'combat':2}" + origin_tech = @'{"materials":3,"engineering":1, "combat":2}' /obj/item/clothing/suit/armor/hos/jensen name = "armored trenchcoat" @@ -187,9 +187,9 @@ icon = 'icons/clothing/suit/jensen.dmi' flags_inv = 0 siemens_coefficient = 0.6 - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT ) - origin_tech = "{'materials':3,'engineering':1, 'combat':2}" + origin_tech = @'{"materials":3,"engineering":1, "combat":2}' diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 8cf7aa379cc..f7f9d8fc033 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -2,7 +2,6 @@ name = "tactical turtleneck" desc = "It's some non-descript, slightly suspicious looking, civilian clothing." icon = 'icons/clothing/under/uniform_tacticool.dmi' - has_sensor = SUIT_NO_SENSORS armor = list( ARMOR_MELEE = ARMOR_MELEE_SMALL, ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, @@ -15,7 +14,6 @@ name = "combat turtleneck" desc = "The height of fashion and tactical utility." icon = 'icons/clothing/under/uniform_combat.dmi' - has_sensor = SUIT_HAS_SENSORS /obj/item/clothing/under/syndicate/tacticool name = "\improper Tacticool turtleneck" @@ -23,5 +21,4 @@ icon = 'icons/clothing/under/uniform_tacticool.dmi' armor = null siemens_coefficient = 1 - has_sensor = SUIT_HAS_SENSORS matter = null \ No newline at end of file diff --git a/code/modules/clothing/underwear/base.dm b/code/modules/clothing/underwear/base.dm index 0d8e1872a0d..a4878aaebf7 100644 --- a/code/modules/clothing/underwear/base.dm +++ b/code/modules/clothing/underwear/base.dm @@ -1,7 +1,7 @@ /obj/item/underwear icon = 'icons/mob/human.dmi' w_class = ITEM_SIZE_TINY - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth var/required_free_body_parts var/slot_offset_str @@ -10,14 +10,15 @@ return // Might as well check DelayedEquipUnderwear(user, target) -/obj/item/underwear/handle_mouse_drop(atom/over, mob/user) +/obj/item/underwear/handle_mouse_drop(atom/over, mob/user, params) + SHOULD_CALL_PARENT(FALSE) DelayedEquipUnderwear(user, over) return TRUE /obj/item/underwear/proc/CanEquipUnderwear(var/mob/user, var/mob/living/carbon/human/H) if(!CanAdjustUnderwear(user, H, "put on")) return FALSE - if(!(H.species && (H.get_bodytype().appearance_flags & HAS_UNDERWEAR))) + if(!(H.species && (H.get_bodytype()?.appearance_flags & HAS_UNDERWEAR))) to_chat(user, "\The [H]'s species cannot wear underwear of this nature.") return FALSE if(is_path_in_list(type, H.worn_underwear)) diff --git a/code/modules/codex/categories/_materials.dm b/code/modules/codex/categories/_materials.dm new file mode 100644 index 00000000000..6509270555d --- /dev/null +++ b/code/modules/codex/categories/_materials.dm @@ -0,0 +1,98 @@ +/decl/codex_category/materials + abstract_type = /decl/codex_category/materials + var/reaction_category + +/decl/codex_category/materials/Populate() + + guide_html = guide_html + {" +

    Reactions

    +
  • " . += "\<\<\[[pref.gear_slot]\] \>\>" - if(config.max_gear_cost < INFINITY) - . += "[pref.total_loadout_cost]/[config.max_gear_cost] loadout points spent." + if(max_gear_cost < INFINITY) + . += "[pref.total_loadout_cost]/[max_gear_cost] loadout points spent." . += "Clear Loadout" . += "[hide_unavailable_gear ? "Show all" : "Hide unavailable"]
    + + "} + + var/list/entries_to_register = list() + var/list/all_reactions = decls_repository.get_decls_of_subtype(/decl/chemical_reaction) + for(var/reactiontype in all_reactions) + var/decl/chemical_reaction/reaction = all_reactions[reactiontype] + if(!reaction || !reaction.name || reaction.hidden_from_codex || istype(reaction, /decl/chemical_reaction/recipe) || reaction.reaction_category != reaction_category) + continue // Food recipes are handled in category_recipes.dm. + var/mechanics_text = "This reaction requires the following reagents:
    " + if(reaction.mechanics_text) + mechanics_text = "[reaction.mechanics_text]
    [mechanics_text]" + var/list/reactant_values = list() + for(var/reactant_id in reaction.required_reagents) + var/decl/material/reactant = GET_DECL(reactant_id) + var/reactant_name = "[reactant.name]" + reactant_values += "[reaction.required_reagents[reactant_id]]u [reactant_name]" + mechanics_text += " [jointext(reactant_values, " + ")]" + var/list/inhibitors = list() + + for(var/inhibitor_id in reaction.inhibitors) + var/decl/material/inhibitor = GET_DECL(inhibitor_id) + var/inhibitor_name = "[inhibitor.name]" + inhibitors += inhibitor_name + if(length(inhibitors)) + mechanics_text += " (inhibitors: [jointext(inhibitors, ", ")])" + + var/list/catalysts = list() + for(var/catalyst_id in reaction.catalysts) + var/decl/material/catalyst = GET_DECL(catalyst_id) + var/catalyst_name = "[catalyst.name]" + catalysts += "[reaction.catalysts[catalyst_id]]u [catalyst_name]" + if(length(catalysts)) + mechanics_text += " (catalysts: [jointext(catalysts, ", ")])" + + var/produces + if(reaction.result && reaction.result_amount) + var/decl/material/product = GET_DECL(reaction.result) + produces = product.codex_name || product.name + mechanics_text += "
    It will produce [reaction.result_amount]u [product.name]." + if(reaction.maximum_temperature != INFINITY) + mechanics_text += "
    The reaction will not occur if the temperature is above [reaction.maximum_temperature]K." + if(reaction.minimum_temperature > 0) + mechanics_text += "
    The reaction will not occur if the temperature is below [reaction.minimum_temperature]K." + + var/reaction_name = produces || lowertext(reaction.name) + if(produces) + guide_html += "
    " + else + guide_html += "" + guide_html += "" + guide_html += "" + if(length(catalysts)) + guide_html += "" + else + guide_html += "" + if(length(inhibitors)) + guide_html += "" + else + guide_html += "" + if(reaction.minimum_temperature > 0 && reaction.minimum_temperature < INFINITY) + guide_html += "" + else + guide_html += "" + if(reaction.maximum_temperature > 0 && reaction.maximum_temperature < INFINITY) + guide_html += "" + else + guide_html += "" + guide_html += "" + + entries_to_register += new /datum/codex_entry( \ + _display_name = "[reaction.name] (reaction)", \ + _associated_strings = list("[reaction.name] (chemical reaction)"), \ + _lore_text = reaction.lore_text, \ + _mechanics_text = mechanics_text \ + ) + guide_html += "
    Product nameProduct amountRequired reagentsCatalystsInhibitorsMin temperatureMax temperatureNotes
    [capitalize(reaction_name)]
    [capitalize(reaction_name)][reaction.result_amount || "N/A"][jointext(reactant_values, "
    ")]
    [jointext(catalysts, "
    ")]
    No catalysts.[jointext(inhibitors, "
    ")]
    No inhibitors.[reaction.minimum_temperature]KAny[reaction.maximum_temperature]KAny" + if(reaction.mechanics_text) + guide_html += reaction.mechanics_text + if(reaction.lore_text) + guide_html += "
    " + if(reaction.lore_text) + guide_html += reaction.lore_text + guide_html += "
    " + + for(var/datum/codex_entry/entry in entries_to_register) + items |= entry.name + + ..() diff --git a/code/modules/codex/categories/category_reactions.dm b/code/modules/codex/categories/category_reactions.dm index f64d5e317b3..c46829e0dfa 100644 --- a/code/modules/codex/categories/category_reactions.dm +++ b/code/modules/codex/categories/category_reactions.dm @@ -1,10 +1,8 @@ -/decl/codex_category/chemistry - name = "Chemical Reactions" - desc = "Chemical reactions with mundane, interesting or spectacular effects." - guide_name = "Chemistry" - -/decl/codex_category/chemistry/Populate() - +/decl/codex_category/materials/chemistry + name = "Pharmacology" + desc = "Chemical reactions with medical or metabolic effects on living things." + guide_name = "Pharmacology" + reaction_category = REACTION_TYPE_PHARMACEUTICAL guide_html = {"

    Chemistry Basics

    @@ -17,93 +15,26 @@

  • Chem grenades make use of a variety of reactions that produce effects like smoke or foam rather than a new chemical.
  • -

    Reactions

    - - "} - - var/list/entries_to_register = list() - var/list/all_reactions = decls_repository.get_decls_of_subtype(/decl/chemical_reaction) - for(var/reactiontype in all_reactions) - var/decl/chemical_reaction/reaction = all_reactions[reactiontype] - if(!reaction || !reaction.name || reaction.hidden_from_codex || istype(reaction, /decl/chemical_reaction/recipe)) - continue // Food recipes are handled in category_recipes.dm. - var/mechanics_text = "This reaction requires the following reagents:
    " - if(reaction.mechanics_text) - mechanics_text = "[reaction.mechanics_text]
    [mechanics_text]" - var/list/reactant_values = list() - for(var/reactant_id in reaction.required_reagents) - var/decl/material/reactant = GET_DECL(reactant_id) - var/reactant_name = "[reactant.name]" - reactant_values += "[reaction.required_reagents[reactant_id]]u [reactant_name]" - mechanics_text += " [jointext(reactant_values, " + ")]" - var/list/inhibitors = list() - - for(var/inhibitor_id in reaction.inhibitors) - var/decl/material/inhibitor = GET_DECL(inhibitor_id) - var/inhibitor_name = "[inhibitor.name]" - inhibitors += inhibitor_name - if(length(inhibitors)) - mechanics_text += " (inhibitors: [jointext(inhibitors, ", ")])" - - var/list/catalysts = list() - for(var/catalyst_id in reaction.catalysts) - var/decl/material/catalyst = GET_DECL(catalyst_id) - var/catalyst_name = "[catalyst.name]" - catalysts += "[reaction.catalysts[catalyst_id]]u [catalyst_name]" - if(length(catalysts)) - mechanics_text += " (catalysts: [jointext(catalysts, ", ")])" - - var/produces - if(reaction.result && reaction.result_amount) - var/decl/material/product = GET_DECL(reaction.result) - produces = product.codex_name || product.name - mechanics_text += "
    It will produce [reaction.result_amount]u [product.name]." - if(reaction.maximum_temperature != INFINITY) - mechanics_text += "
    The reaction will not occur if the temperature is above [reaction.maximum_temperature]K." - if(reaction.minimum_temperature > 0) - mechanics_text += "
    The reaction will not occur if the temperature is below [reaction.minimum_temperature]K." - - var/reaction_name = produces || lowertext(reaction.name) - if(produces) - guide_html += "" - else - guide_html += "" - guide_html += "" - guide_html += "" - if(length(catalysts)) - guide_html += "" - else - guide_html += "" - if(length(inhibitors)) - guide_html += "" - else - guide_html += "" - if(reaction.minimum_temperature > 0 && reaction.minimum_temperature < INFINITY) - guide_html += "" - else - guide_html += "" - if(reaction.maximum_temperature > 0 && reaction.maximum_temperature < INFINITY) - guide_html += "" - else - guide_html += "" - guide_html += "" - - entries_to_register += new /datum/codex_entry( \ - _display_name = "[reaction.name] (reaction)", \ - _associated_strings = list("[reaction.name] (chemical reaction)"), \ - _lore_text = reaction.lore_text, \ - _mechanics_text = mechanics_text \ - ) - guide_html += "
    Product nameProduct amountRequired reagentsCatalystsInhibitorsMin temperatureMax temperatureNotes
    [capitalize(reaction_name)]
    [capitalize(reaction_name)][reaction.result_amount || "N/A"][jointext(reactant_values, "
    ")]
    [jointext(catalysts, "
    ")]
    No catalysts.[jointext(inhibitors, "
    ")]
    No inhibitors.[reaction.minimum_temperature]KAny[reaction.maximum_temperature]KAny" - if(reaction.mechanics_text) - guide_html += reaction.mechanics_text - if(reaction.lore_text) - guide_html += "
    " - if(reaction.lore_text) - guide_html += reaction.lore_text - guide_html += "
    " - - for(var/datum/codex_entry/entry in entries_to_register) - items |= entry.name - - . = ..() + "} + +/decl/codex_category/materials/chemistry/compounds + name = "Compounds" + desc = "Chemical reactions with non-medical, mundane, interesting or spectacular effects." + guide_name = "Compounds" + reaction_category = REACTION_TYPE_COMPOUND + +/decl/codex_category/materials/chemistry/synthesis + name = "Material Synthesis" + desc = "Chemical reactions that produce solid materials." + guide_name = "Material Synthesis" + reaction_category = REACTION_TYPE_SYNTHESIS + +/decl/codex_category/materials/alloying + name = "Alloys" + desc = "Combinations of metals that form various products." + guide_name = "Metallurgy" + reaction_category = REACTION_TYPE_ALLOYING + guide_html = {" +

    Metallurgy Basics

    +

    Put metal in the smelter!

    + "} diff --git a/code/modules/codex/codex_atom.dm b/code/modules/codex/codex_atom.dm index 531ae62e228..289ed75612e 100644 --- a/code/modules/codex/codex_atom.dm +++ b/code/modules/codex/codex_atom.dm @@ -37,4 +37,4 @@ /atom/examine(mob/user, distance, infix = "", suffix = "") . = ..() if(user?.get_preference_value(/datum/client_preference/inquisitive_examine) == PREF_ON && user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) - to_chat(user, "The codex has relevant information available.") + to_chat(user, SPAN_NOTICE("The codex has relevant information available.")) diff --git a/code/modules/codex/codex_cataloguer.dm b/code/modules/codex/codex_cataloguer.dm index 9d69af42734..48349c767cb 100644 --- a/code/modules/codex/codex_cataloguer.dm +++ b/code/modules/codex/codex_cataloguer.dm @@ -1,85 +1,3 @@ -/obj/screen/scan_radius - name = null - plane = HUD_PLANE - layer = UNDER_HUD_LAYER - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - screen_loc = "CENTER,CENTER" - icon = 'icons/screen/scanner.dmi' - icon_state = "blank" - alpha = 180 - var/scan_range - var/image/holder_image - -/obj/screen/scan_radius/proc/set_radius(var/new_range) - if(new_range != scan_range) - scan_range = max(1, new_range) - update_icon() - -/obj/screen/scan_radius/proc/fade_out(var/mob/user, var/fade_time) - set waitfor = FALSE - animate(src, alpha = 0, time = fade_time) - if(fade_time > 0) - sleep(fade_time) - if(user?.client && holder_image) - user.client.images -= holder_image - -/obj/screen/scan_radius/Destroy() - if(holder_image) - holder_image.vis_contents.Cut() - QDEL_NULL(holder_image) - return ..() - -/obj/screen/scan_radius/on_update_icon() - cut_overlays() - if(scan_range <= 1) - add_overlay("single") - else - var/pixel_bound = (world.icon_size * scan_range) - - var/image/I = image(icon, "bottomleft") - I.pixel_x = -(pixel_bound) - I.pixel_y = -(pixel_bound) - add_overlay(I) - - I = image(icon, "bottomright") - I.pixel_x = pixel_bound - I.pixel_y = -(pixel_bound) - add_overlay(I) - - I = image(icon, "topleft") - I.pixel_x = -(pixel_bound) - I.pixel_y = pixel_bound - add_overlay(I) - - I = image(icon, "topright") - I.pixel_x = pixel_bound - I.pixel_y = pixel_bound - add_overlay(I) - - var/offset_scan_range = scan_range-1 - for(var/i = -(offset_scan_range) to offset_scan_range) - I = image(icon, "left") - I.pixel_x = -(pixel_bound) - I.pixel_y = world.icon_size * i - add_overlay(I) - - I = image(icon, "right") - I.pixel_x = pixel_bound - I.pixel_y = world.icon_size * i - add_overlay(I) - - I = image(icon, "bottom") - I.pixel_x = world.icon_size * i - I.pixel_y = -(pixel_bound) - add_overlay(I) - - I = image(icon, "top") - I.pixel_x = world.icon_size * i - I.pixel_y = pixel_bound - add_overlay(I) - - compile_overlays() - /obj/item/cataloguer name = "cataloguer" desc = "A hand-held device used for compiling information about an object by scanning it, and then uploading it to the local codex. Alt-click to highlight scannable objects around you." @@ -87,11 +5,11 @@ icon = 'icons/obj/items/device/cataloguer.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_NORMAL - origin_tech = "{'materials':2, 'programming':3,'magnets':3}" + origin_tech = @'{"materials":2, "programming":3,"magnets":3}' force = 0 item_flags = ITEM_FLAG_NO_BLUDGEON slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE, diff --git a/code/modules/codex/codex_client.dm b/code/modules/codex/codex_client.dm index c40a52431ee..180e7624c44 100644 --- a/code/modules/codex/codex_client.dm +++ b/code/modules/codex/codex_client.dm @@ -25,7 +25,7 @@ return codex_on_cooldown = TRUE - addtimer(CALLBACK(src, .proc/reset_codex_cooldown), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_codex_cooldown)), 1 SECOND) var/list/all_entries = SScodex.retrieve_entries_for_string(searching) if(mob && mob.mind && !player_is_antag(mob.mind)) @@ -71,7 +71,7 @@ to_chat(src, SPAN_WARNING("You cannot perform codex actions currently.")) return codex_on_cooldown = TRUE - addtimer(CALLBACK(src, .proc/reset_codex_cooldown), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_codex_cooldown)), 1 SECOND) to_chat(mob, SPAN_NOTICE("The codex forwards you an index file.")) @@ -114,7 +114,7 @@ return codex_on_cooldown = TRUE - addtimer(CALLBACK(src, .proc/reset_codex_cooldown), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(reset_codex_cooldown)), 1 SECOND) var/datum/codex_entry/entry = SScodex.get_codex_entry("nexus") SScodex.present_codex_entry(mob, entry) diff --git a/code/modules/codex/entries/_codex_entry.dm b/code/modules/codex/entries/_codex_entry.dm index ce72d55aa9a..c81ee255fc2 100644 --- a/code/modules/codex/entries/_codex_entry.dm +++ b/code/modules/codex/entries/_codex_entry.dm @@ -3,18 +3,28 @@ /datum/codex_entry var/name + /// Whether or not this entry is stored on the subsystem, or is associated with solely the specific atom. var/store_codex_entry = TRUE + /// A list of string search terms associated with this entry. var/list/associated_strings + /// A list of typepaths used to populate associated_strings. var/list/associated_paths + /// IC text. var/lore_text + /// OOC text. var/mechanics_text + /// Text shown to antagonists. var/antag_text + /// Value used to disambiguate overlapping codex names. var/disambiguator + /// A list of category decls that this codex entry belongs to. var/list/categories /// If TRUE, don't create this entry in codex init. Where possible, consider using abstract_type or store_codex_entry = FALSE instead. var/skip_hardcoded_generation = FALSE /// If TRUE, associated_paths is set to include each path's subtypes in New(). var/include_subtypes = FALSE + /// HTML returned when the entry is used to populate a guide manual. + var/guide_html /datum/codex_entry/temporary store_codex_entry = FALSE @@ -136,4 +146,5 @@ . += "" . += footer . += "" + #undef TRIM_LINEBREAKS diff --git a/code/modules/codex/entries/engineering.dm b/code/modules/codex/entries/engineering.dm index 66c24731bd2..98a90924909 100644 --- a/code/modules/codex/entries/engineering.dm +++ b/code/modules/codex/entries/engineering.dm @@ -46,26 +46,6 @@ mechanics_text = "This device disrupts shields on directly adjacent tiles (in a + shaped pattern), in a similar way the floor mounted variant does. It is, however, portable and run by an internal battery. Can be recharged with a regular recharger." disambiguator = "equipment" -/datum/codex_entry/hacking - associated_strings = list("hacking") - mechanics_text = "Airlocks, vending machines, and various other machinery can be hacked by opening them up and fiddling with the wires. \ - While it might sound like a unlawful deed (and it usually is) this process is also performed by engineers, usually to fix said criminal deeds. \ - Hacking also benefits from the Electrical Engineering skill: a low skill may cause wires to tangle, and a high enough skill will let you examine wires to see what they do. \ -
    Hacking makes use of several items: \ -
    • a screwdriver, for opening maintenance panels.
    • \ -
    • a multitool, for pulsing wires (optional for many tasks, but very useful)
    • \ -
    • wirecutters, for cutting wires
    • \ -
    • insulated gloves, to prevent electrocution (optional but highly recommended)
    • \ -
    • a crowbar, if you're hacking a door to open it.
    \ -
    The first step to most hacking procedures is to use the screwdriver to open a maintenance panel and access the wiring. \ - After, you can click on the machine to view the wires. \ - You then use the multitool to pulse the wires, and in response some of the displayed information may change, causing certain effects to occur or allowing for certain benefits. \ - If you don't have a multitool, you can cut the wires. \ - Pulsing tends to cause temporary changes or toggles something, whereas cutting a wire is usually longer lasting, but this is not always the case. \ - Note that the corresponding wires and effects are randomized between rounds of the game. \ - You can also attach a signaler to pulse wires remotely." - antag_text = "To avoid suspicion or accidents, practice quietly somewhere out of the way and learn the wires you need before doing it for real." - /datum/codex_entry/solars associated_paths = list(/obj/item/solar_assembly, /obj/machinery/power/solar, /obj/machinery/power/tracker, /obj/machinery/power/solar_control) associated_strings = list("solar array") diff --git a/code/modules/codex/entries/guides.dm b/code/modules/codex/entries/guides.dm new file mode 100644 index 00000000000..5a6e7c15f4c --- /dev/null +++ b/code/modules/codex/entries/guides.dm @@ -0,0 +1,618 @@ +/datum/codex_entry/guide + abstract_type = /datum/codex_entry/guide + lore_text = "This guide has not been written yet, sorry!" + +/datum/codex_entry/guide/New() + ..() + if(QDELETED(src)) + return + + // Add to category. + var/decl/codex_category/cat = GET_DECL(/decl/codex_category/guides) + LAZYDISTINCTADD(categories, cat) + LAZYDISTINCTADD(cat.items, name) + + // Generate our guide text. + guide_html = guide_html ? list(guide_html) : list() + if(lore_text) + guide_html += "

    [lore_text]

    " + if(mechanics_text) + guide_html += "

    [mechanics_text]

    " + // No antag text for the guide text. + guide_html = JOINTEXT(guide_html) + +/datum/codex_entry/guide/robotics + name = "Guide to Robotics" + lore_text = {" +

    Cyborgs for Dummies

    + +

    Chapters

    +
      +
    1. Cyborg Related Equipment
    2. +
    3. Cyborg Modules
    4. +
    5. Cyborg Construction
    6. +
    7. Cyborg Maintenance
    8. +
    9. Cyborg Repairs
    10. +
    11. In Case of Emergency
    12. +
    + +

    Cyborg Related Equipment

    + +

    Exosuit Fabricator

    + The Exosuit Fabricator is the most important piece of equipment related to cyborgs. It allows the construction of the core cyborg parts. Without these machines, cyborgs cannot be built. It seems that they may also benefit from advanced research techniques. + +

    Cyborg Recharging Station

    + This useful piece of equipment will suck power out of the power systems to charge a cyborg's power cell back up to full charge. + +

    Robotics Control Console

    + This useful piece of equipment can be used to immobilize or destroy a cyborg. A word of warning: Cyborgs are expensive pieces of equipment, do not destroy them without good reason, or the Company may see to it that it never happens again. + +

    Cyborg Modules

    + When a cyborg is created it picks out of an array of modules to designate its purpose. There are 11 different cyborg modules.
    + All cyborg modules carry a flash. + + # TODO generate from SSrobots + +

    Cyborg Construction

    + Cyborg construction is a rather easy process, requiring a decent amount of metal and a few other supplies.
    The required materials to make a cyborg are: +
      +
    • Metal
    • +
    • Two Flashes
    • +
    • One Power Cell (Preferably rated to 15000w)
    • +
    • Some electrical wires
    • +
    • One Human Brain
    • +
    • One Man-Machine Interface
    • +
    + Once you have acquired the materials, you can start on construction of your cyborg.
    To construct a cyborg, follow the steps below: +
      +
    1. Start the Exosuit Fabricators constructing all of the cyborg parts
    2. +
    3. While the parts are being constructed, take your human brain, and place it inside the Man-Machine Interface
    4. +
    5. Once you have a Robot Head, place your two flashes inside the eye sockets
    6. +
    7. Once you have your Robot Chest, wire the Robot chest, then insert the power cell
    8. +
    9. Attach all of the Robot parts to the Robot frame
    10. +
    11. Insert the Man-Machine Interface (With the Brain inside) into the Robot Body
    12. +
    13. Congratulations! You have a new cyborg!
    14. +
    + +

    Cyborg Maintenance

    + Occasionally Cyborgs may require maintenance of a couple types, this could include replacing a power cell with a charged one, or possibly maintaining the cyborg's internal wiring. + +

    Replacing a Power Cell

    + Replacing a Power cell is a common type of maintenance for cyborgs. It usually involves replacing the cell with a fully charged one, or upgrading the cell with a larger capacity cell.
    The steps to replace a cell are as follows: +
      +
    1. Unlock the Cyborg's Interface by swiping your ID on it
    2. +
    3. Open the Cyborg's outer panel using a crowbar
    4. +
    5. Remove the old power cell
    6. +
    7. Insert the new power cell
    8. +
    9. Close the Cyborg's outer panel using a crowbar
    10. +
    11. Lock the Cyborg's Interface by swiping your ID on it, this will prevent non-qualified personnel from attempting to remove the power cell
    12. +
    + +

    Exposing the Internal Wiring

    + Exposing the internal wiring of a cyborg is fairly easy to do, and is mainly used for cyborg repairs.
    You can easily expose the internal wiring by following the steps below: +
      +
    1. Follow Steps 1 - 3 of "Replacing a Cyborg's Power Cell"
    2. +
    3. Open the cyborg's internal wiring panel by using a screwdriver to unsecure the panel
    4. +
    + To re-seal the cyborg's internal wiring: +
      +
    1. Use a screwdriver to secure the cyborg's internal panel
    2. +
    3. Follow steps 4 - 6 of "Replacing a Cyborg's Power Cell" to close up the cyborg
    4. +
    + +

    Cyborg Repairs

    + Occasionally a Cyborg may become damaged. This could be in the form of impact damage from a heavy or fast-travelling object, or it could be heat damage from high temperatures, or even lasers or Electromagnetic Pulses (EMPs). + +

    Dents

    + If a cyborg becomes damaged due to impact from heavy or fast-moving objects, it will become dented. Sure, a dent may not seem like much, but it can compromise the structural integrity of the cyborg, possibly causing a critical failure. + Dents in a cyborg's frame are rather easy to repair, all you need is to apply a welding tool to the dented area, and the high-tech cyborg frame will repair the dent under the heat of the welder. + +

    Excessive Heat Damage

    + If a cyborg becomes damaged due to excessive heat, it is likely that the internal wires will have been damaged. You must replace those wires to ensure that the cyborg remains functioning properly.
    To replace the internal wiring follow the steps below: +
      +
    1. Unlock the Cyborg's Interface by swiping your ID
    2. +
    3. Open the Cyborg's External Panel using a crowbar
    4. +
    5. Remove the Cyborg's Power Cell
    6. +
    7. Using a screwdriver, expose the internal wiring of the Cyborg
    8. +
    9. Replace the damaged wires inside the cyborg
    10. +
    11. Secure the internal wiring cover using a screwdriver
    12. +
    13. Insert the Cyborg's Power Cell
    14. +
    15. Close the Cyborg's External Panel using a crowbar
    16. +
    17. Lock the Cyborg's Interface by swiping your ID
    18. +
    + These repair tasks may seem difficult, but are essential to keep your cyborgs running at peak efficiency. + +

    In Case of Emergency

    + In case of emergency, there are a few steps you can take. + +

    "Rogue" Cyborgs

    + If the cyborgs seem to become "rogue", they may have non-standard laws. In this case, use extreme caution. + To repair the situation, follow these steps: +
      +
    1. Locate the nearest robotics console
    2. +
    3. Determine which cyborgs are "Rogue"
    4. +
    5. Press the lockdown button to immobilize the cyborg
    6. +
    7. Locate the cyborg
    8. +
    9. Expose the cyborg's internal wiring
    10. +
    11. Check to make sure the LawSync and AI Sync lights are lit
    12. +
    13. If they are not lit, pulse the LawSync wire using a multitool to enable the cyborg's LawSync
    14. +
    15. Proceed to a cyborg upload console. The Company usually places these in the same location as AI upload consoles.
    16. +
    17. Use a "Reset" upload moduleto reset the cyborg's laws
    18. +
    19. Proceed to a Robotics Control console
    20. +
    21. Remove the lockdown on the cyborg
    22. +
    + +

    As a last resort

    + If all else fails in a case of cyborg-related emergency, there may be only one option. Using a Robotics Control console, you may have to remotely detonate the cyborg. +

    WARNING:

    Do not detonate a borg without an explicit reason for doing so. Cyborgs are expensive pieces of company equipment, and you may be punished for detonating them without reason. + "} + +/datum/codex_entry/guide/detective + name = "Guide to Forensics" + lore_text = {" +

    Detective Work

    + Between your bouts of self-narration and drinking whiskey on the rocks, you might get a case or two to solve.
    + To have the best chance to solve your case, follow these directions: +

    +

      +
    1. Go to the crime scene.
    2. +
    3. Take your scanner and scan EVERYTHING (Yes, the doors, the tables, even the dog).
    4. +
    5. Once you are reasonably certain you have every scrap of evidence you can use, find all possible entry points and scan them, too.
    6. +
    7. Return to your office.
    8. +
    9. Using your forensic scanning computer, scan your scanner to upload all of your evidence into the database.
    10. +
    11. Browse through the resulting dossiers, looking for the one that either has the most complete set of prints, or the most suspicious items handled.
    12. +
    13. If you have 80% or more of the print (The print is displayed), go to step 10, otherwise continue to step 8.
    14. +
    15. Look for clues from the suit fibres you found on your perpetrator, and go about looking for more evidence with this new information, scanning as you go.
    16. +
    17. Try to get a fingerprint card of your perpetrator, as if used in the computer, the prints will be completed on their dossier.
    18. +
    19. Assuming you have enough of a print to see it, grab the biggest complete piece of the print and search the security records for it.
    20. +
    21. Since you now have both your dossier and the name of the person, print both out as evidence and get security to nab your baddie.
    22. +
    23. Give yourself a pat on the back and a bottle of the ship's finest vodka, you did it!
    24. +
    +

    + It really is that easy! Good luck! + "} + +/datum/codex_entry/guide/nuclear_sabotage + name = "Guide to Nuclear Sabotage" + lore_text = {" +

    Nuclear Explosives 101

    + Hello and thank you for choosing the Syndicate for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.

    + + First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done, to unbolt it, one must completely log in, which at this time may not be possible.
    + +

    To make the nuclear device functional

    +
      +
    • Place the nuclear device in the designated detonation zone.
    • +
    • Extend and anchor the nuclear device from its interface.
    • +
    • Insert the nuclear authorisation disk into the slot.
    • +
    • Type the numeric authorisation code into the keypad. This should have been provided.
      + Note: If you make a mistake, press R to reset the device. +
    • Press the E button to log on to the device.
    • +

    + + You now have activated the device. To deactivate the buttons at anytime, for example when you've already prepped the bomb for detonation, remove the authentication disk OR press R on the keypad.

    + Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option. Toggle off the SAFETY.
    + Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.

    + + So use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
    + Note: THE BOMB IS STILL SET AND WILL DETONATE

    + + Now before you remove the disk, if you need to move the bomb, you can toggle off the anchor, move it, and re-anchor.

    + + Remember the order:
    + Disk, Code, Safety, Timer, Disk, RUN!

    + Intelligence Analysts believe that normal corporate procedure is for the Captain to secure the nuclear authentication disk.

    + + Good luck! + "} + +/datum/codex_entry/guide/particle_accelerator + name = "Guide to Particle Accelerators" + lore_text = {" +

    Experienced User's Guide

    +

    Setting up the accelerator

    +
      +
    1. Wrench all pieces to the floor
    2. +
    3. Add wires to all the pieces
    4. +
    5. Close all the panels with your screwdriver
    6. +
    +

    Using the accelerator

    +
      +
    1. Open the control panel
    2. +
    3. Set the speed to 2
    4. +
    5. Start firing at the singularity generator
    6. +
    7. When the singularity reaches a large enough size so it starts moving on it's own set the speed down to 0, but don't shut it off
    8. +
    9. Remember to wear a radiation suit when working with this machine... we did tell you that at the start, right?
    10. +
    + "} + + +/datum/codex_entry/guide/singularity + name = "Guide to Singularity Engines" + lore_text = {" +

    Singularity Safety in Special Circumstances

    +

    Power outage

    + A power problem has made you lose power? Could be wiring problems or syndicate power sinks. In any case follow these steps: +
      +
    1. PANIC!
    2. +
    3. Get your ass over to engineering! QUICKLY!!!
    4. +
    5. Get to the Area Power Controller which controls the power to the emitters.
    6. +
    7. Swipe it with your ID card - if it doesn't unlock, continue with step 15.
    8. +
    9. Open the console and disengage the cover lock.
    10. +
    11. Pry open the APC with a Crowbar.
    12. +
    13. Take out the empty power cell.
    14. +
    15. Put in the new, full power cell - if you don't have one, continue with step 15.
    16. +
    17. Quickly put on a Radiation suit.
    18. +
    19. Check if the singularity field generators withstood the down-time - if they didn't, continue with step 15.
    20. +
    21. Since disaster was averted you now have to ensure it doesn't repeat. If it was a powersink which caused it and if the engineering APC is wired to the same powernet, which the powersink is on, you have to remove the piece of wire which links the APC to the powernet. If it wasn't a powersink which caused it, then skip to step 14.
    22. +
    23. Grab your crowbar and pry away the tile closest to the APC.
    24. +
    25. Use the wirecutters to cut the wire which is connecting the grid to the terminal.
    26. +
    27. Go to the bar and tell the guys how you saved them all. Stop reading this guide here.
    28. +
    29. GET THE FUCK OUT OF THERE!!!
    30. +
    +

    Shields get damaged

    +
      +
    1. GET THE FUCK OUT OF THERE!!! FORGET THE WOMEN AND CHILDREN, SAVE YOURSELF!!!
    2. +
    + "} + +/datum/codex_entry/guide/mech_construction + name = "Guide to Exosuit Construction" + lore_text = {" +
    +
    + Weyland-Yutani - Building Better Worlds +

    Autonomous Power Loader Unit \"Ripley\"

    +
    +

    Specifications:

    +
      +
    • Class: Autonomous Power Loader
    • +
    • Scope: Logistics and Construction
    • +
    • Weight: 820kg (without operator and with empty cargo compartment)
    • +
    • Height: 2.5m
    • +
    • Width: 1.8m
    • +
    • Top speed: 5km/hour
    • +
    • Operation in vacuum/hostile environment: Possible +
    • Airtank volume: 500 liters
    • +
    • Devices: +
        +
      • Hydraulic clamp
      • +
      • High-speed drill
      • +
      +
    • +
    • Propulsion device: Powercell-powered electro-hydraulic system
    • +
    • Powercell capacity: Varies
    • +
    +

    Construction:

    +
      +
    1. Connect all exosuit parts to the chassis frame.
    2. +
    3. Connect all hydraulic fittings and tighten them up with a wrench.
    4. +
    5. Adjust the servohydraulics with a screwdriver.
    6. +
    7. Wire the chassis (Cable is not included).
    8. +
    9. Use the wirecutters to remove the excess cable if needed.
    10. +
    11. Install the central control module (Not included. Use supplied datadisk to create one).
    12. +
    13. Secure the mainboard with a screwdriver.
    14. +
    15. Install the peripherals control module (Not included. Use supplied datadisk to create one).
    16. +
    17. Secure the peripherals control module with a screwdriver.
    18. +
    19. Install the internal armor plating (Not included due to corporate regulations. Can be made using 5 metal sheets).
    20. +
    21. Secure the internal armor plating with a wrench.
    22. +
    23. Weld the internal armor plating to the chassis.
    24. +
    25. Install the external reinforced armor plating (Not included due to corporate regulations. Can be made using 5 reinforced metal sheets).
    26. +
    27. Secure the external reinforced armor plating with a wrench.
    28. +
    29. Weld the external reinforced armor plating to the chassis.
    30. +
    +

    Additional Information:

    +
      +
    • The firefighting variation is made in a similar fashion.
    • +
    • A firesuit must be connected to the firefighter chassis for heat shielding.
    • +
    • Internal armor is plasteel for additional strength.
    • +
    • External armor must be installed in 2 parts, totalling 10 sheets.
    • +
    • Completed exosuit is more resilient against fire, and is a bit more durable overall.
    • +
    • The Company is determined to ensure the safety of its investments employees.
    • +
    + + "} + +/datum/codex_entry/guide/atmospherics + name = "Guide to Atmospherics" + lore_text = {" +

    Contents

    +
      +
    1. Author's Foreword
    2. +
    3. Basic Piping
    4. +
    5. Insulated Pipes
    6. +
    7. Atmospherics Devices
    8. +
    9. Heat Exchange Systems
    10. +
    11. Final Checks
    12. +

    +

    HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS


    + Or: What the fuck does a "pressure regulator" do?

    + Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does. + Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So, + this will tell you what every device constructable by an ordinary pipe dispenser within atmospherics actually does. + You are not going to learn what to do with them to be the super best person ever, or how to play guitar with passive gates, + or something like that. Just what stuff does.

    +

    Basic Pipes

    + The boring ones.
    + Most ordinary pipes are pretty straightforward. They hold gas. If gas is moving in a direction for some reason, gas will flow in that direction. + That's about it. Even so, here's all of your wonderful pipe options.
    +
      +
    • Straight pipes: They're pipes. One-meter sections. Straight line. Pretty simple. Just about every pipe and device is based around this + standard one-meter size, so most things will take up as much space as one of these.
    • +
    • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
    • +
    • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
    • +
    • 4-way manifold: A four-way junction.
    • +
    • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh, use them to decorate your house or something.
    • +
    • Manual valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
    • +
    • Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


    • +
    + An important note here is that pipes are now done in three distinct lines - general, supply, and scrubber. You can move gases between these with a universal adapter. Use the correct position for the correct location. + Connecting scrubbers to a supply position pipe makes you an idiot who gives everyone a difficult job. Insulated and HE pipes don't go through these positions. +

    Insulated Pipes

    +
  • Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
  • +
  • Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
  • +
  • 4-way manifold: A four-way junction.
  • +
  • Pipe cap: Caps off the end of a pipe. Open ends don't actually vent air, because of the way the pipes are assembled, so, uh. Use them to decorate your house or something.
  • +
  • Manual Valve: A valve that will block off airflow when turned. Can't be used by the AI or cyborgs, because they don't have hands.
  • +
  • Manual T-Valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.


  • +

    Insulated Pipes


    + Special Public Service Announcement.
    + Our regular pipes are already insulated. These are completely worthless. Punch anyone who uses them.

    +

    Devices:

    + They actually do something.
    + This is usually where people get frightened, afraid, and start calling on their gods and/or cowering in fear. Yes, I can see you doing that right now. + Stop it. It's unbecoming. Most of these are fairly straightforward.
    +
      +
    • Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 15000 kPa (kilopascals). + Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa + (though 18 kPa is preferred when using internals with pure oxygen, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa. + You will make engiborgs cry and the Chief Engineer will beat you.
    • +
    • Pressure regulator: These replaced the old passive gates. You can choose to regulate pressure by input or output, and regulate flow rate. Regulating by input means that when input pressure is above the limit, gas will flow. + Regulating by output means that when pressure is below the limit, gas will flow. Flow rate can be controlled.
    • +
    • Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
    • +
    • Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
    • +
    • Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
    • +
    • Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers.. + Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely..
    • +
    • Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe, + the rest will continue out the other side. Can also output from 0-4500 kPa. The "omni" vairant allows you to set input and output sections freely.
    • +
    +

    Heat Exchange Systems

    + Will not set you on fire.
    + These systems are used to only transfer heat between two pipes. They will not move gases or any other element, but will equalize the temperature (eventually). Note that because of how gases work (remember: pv=nRt), + a higher temperature will raise pressure, and a lower one will lower temperature.
    +
  • Pipe: This is a pipe that will exchange heat with the surrounding atmosphere. Place in fire for superheating. Place in space for supercooling.
  • +
  • Bent pipe: Take a wild guess.
  • +
  • Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
  • +
  • Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch. + This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions.

  • + That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please. + "} + +/datum/codex_entry/guide/eva + name = "Guide to EVA" + lore_text = {" +

    EVA Gear and You: Not Spending All Day Inside

    + Or: How not to suffocate because there's a hole in your shoes
    +

    Contents

    +
      +
    1. A foreword on using EVA gear
    2. +
    3. Donning a Civilian Suit
    4. +
    5. Putting on a Hardsuit
    6. +
    7. Cyclers and Other Modification Equipment
    8. +
    9. Final Checks
    10. +
    +
    + EVA gear. Wonderful to use. It's useful for mining, engineering, and occasionally just surviving, if things are that bad. Most people have EVA training, + but apparently there are some people out in space who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections: + Civilian suits and hardsuits.

    +

    Civilian Suits

    + The bulkiest things this side of Alpha Centauri
    + These suits are the grey ones that are stored in EVA. They're the more simple to get on, but are also a lot bulkier, and provide less protection from environmental hazards such as radiation or physical impact. + As Medical, Engineering, Security, and Mining all have hardsuits of their own, these don't see much use, but knowing how to put them on is quite useful anyways.

    + First, take the suit. It should be in three pieces: A top, a bottom, and a helmet. Put the bottom on first, shoes and the like will fit in it. If you have magnetic boots, however, + put them on on top of the suit's feet. Next, get the top on, as you would a shirt. It can be somewhat awkward putting these pieces on, due to the makeup of the suit, + but to an extent they will adjust to you. You can then find the snaps and seals around the waist, where the two pieces meet. Fasten these, and double-check their tightness. + The red indicators around the waist of the lower half will turn green when this is done correctly. Next, put on whatever breathing apparatus you're using, be it a gas mask or a breath mask. Make sure the oxygen tube is fastened into it. + Put on the helmet now, straightforward, and make sure the tube goes into the small opening specifically for internals. Again, fasten seals around the neck, a small indicator light in the inside of the helmet should go from red to off when all is fastened. + There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit, + but it is recommended to have a full-sized tank on your back for EVA.

    + These suits tend to be wearable by most species. They're large and flexible. They might be pretty uncomfortable for some, though, so keep that in mind.

    +

    Hardsuits

    + Heavy, uncomfortable, still the best option.
    + These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.

    + Similarly to the other suits, these are split into three parts. Fastening the pant and top are mostly the same as the other spacesuits, with the exception that these are a bit heavier, + though not as bulky. The helmet goes on differently, with the air tube feeding into the suit and out a hole near the left shoulder, while the helmet goes on turned ninety degrees counter-clockwise, + and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light. + The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.

    + These suits generally only fit one species. Standard-issue suits are usually human-fitting by default, but there's equipment that can make modifications to the hardsuits to fit them to other species.

    +

    Modification Equipment

    + How to actually make hardsuits fit you.
    + There's a variety of equipment that can modify hardsuits to fit species that can't fit into them, making life quite a bit easier.

    + The first piece of equipment is a suit cycler. This is a large machine resembling the storage pods that are in place in some places. These are machines that will automatically tailor a suit to certain specifications. + The largest uses of them are for their cleaning functions and their ability to tailor suits for a species. Do not enter them physically. You will die from any of the functions being activated, and it will be painful. + These machines can both tailor a suit between species, and between types. This means you can convert engineering hardsuits to atmospherics, or the other way. This is useful. Use it if you can.

    + There's also modification kits that let you modify suits yourself. These are extremely difficult to use unless you understand the actual construction of the suit. I do not recommend using them unless no other option is available. +

    Final Checks

    +
      +
    • Are all seals fastened correctly?
    • +
    • If you have modified it manually, is absolutely everything sealed perfectly?
    • +
    • Do you either have shoes on under the suit, or magnetic boots on over it?
    • +
    • Do you have a mask on and internals on the suit or your back?
    • +
    • Do you have a way to communicate with your fellow crew in case something goes wrong?
    • +
    • Do you have a second person watching if this is a training session?

    • +
    + If you don't have any further issues, go out and do whatever is necessary. + "} + +/datum/codex_entry/guide/xenoarchaeology + name = "Guide to Xenoarchaeology" + lore_text = {" +

    Contents

    +
      +
    1. Prepping the expedition
    2. +
    3. Knowing your tools
    4. +
    5. Finding the dig
    6. +
    7. Analysing deposits
    8. +
    9. Extracting your first find
    10. +
    +
    +

    Prepping the expedition

    + Every digsite I've been to, someone has forgotten something and I've never yet been to a dig that hasn't had me hiking to get to it - so gather your gear + and get it to the site the first time. You learn quick that time is money, when you've got a shipful of bandits searching for you the next valley over, + but don't be afraid to clear some space if there are any inconvenient boulders in the way.
    +
      +
    • Floodlights (if it's dark)
    • +
    • Wooden trestle tables (for holding tools and finds)
    • +
    • Suspension field generator
    • +
    • Load bearing servitors (such as a mulebot, or hover-tray)
    • +
    • Spare energy packs
    • +

    + Contents +

    Knowing your tools

    + Every archaeologist has a plethora of tools at their disposal, but here's the important ones:
    +
      +
    • Picks, pickaxes, and brushes - don't underestimate the the smallest or largest in your arsenal, each one clears a different amount + of the rockface so each one has a use.
    • +
    • Measuring tape - don't leave home without it, you can use it to measure the depth a rock face has been excavated to.
    • +
    • GPS locator - knowing where you are is the first step to not be lost.
    • +
    • Core sampler - use this to take core samples from rock faces, which you can then run to the lab for analysis.
    • +
    • Depth scanner - uses X-ray diffraction to locate anomalous densities in rock, indicating archaeological deposits or mineral veins. + Comes with a handy reference log containing coordinates and time of each scan.
    • +
    • Alden-Saraspova counter - uses a patented application of Fourier Transform analysis to determine the difference between background and + exotic radiation. Use it to determine how far you are from anomalous energy sources.
    • +
    • Radio beacon locator - leave a beacon at an item of interest, then track it down later with this handy gadget. Watch for interference from other + devices though.
    • +
    • Flashlight or portable light source - Self explanatory, I hope.
    • +
    • Environmental safety gear - This one's dependent on the environment you're working in, but enclosed footwear and a pack of internals + could save your life.
    • +
    • Anomaly safety gear - A biosealed and catalysis-resistant suit along with eye shielding, tinted hood, and non-reactive disposable gloves are + the best kind of protection you can hope for from the errors our forebears may have unleashed.
    • +
    • Personal defence weapon - Never know what you'll find on the dig: pirates, natives, ancient guardians, carnivorous wildlife... + it pays in blood to be prepared.
    • +

    + Contents +

    Finding the dig

    + Wouldn't be an archaeologist without their dig, but everyone has to start somewhere. Here's a basic procedure I go through when cataloguing a new planet:
    +
      +
    • Get in touch with the locals (in particular geologists, miners, and farmers) - Never know what's been turned up by accident, then left to + gather dust on a shelf.
    • +
    • Check the obvious areas first - even if you're pressed for time, these ones are the generally easiest to search, and the most likely targets + of your rivals.
    • +
    • Do some prospecting - the earth mother isn't in the habit of displaying her secrets to the world (although sometimes you get lucky). + Drop a shaft and clear away a bit of surface rock here and there, you never know what might be lurking below the surface.
    • +
    • Tips on unearthing a deposit - How do you know when you're golden? Look for telltale white strata that looks strange or out of place, or if + something has broken under your pick while you're digging. Your depth scanner is your best friend, but even it can't distinguish between + ordinary minerals and ancient leavings, if in doubt then err on the side of caution.
    • +

    + Contents +

    Analysing the contents of a dig

    + You've found some unusual strata, but it's not all peaches from here. No archaeologist ever managed to pull a bone from the earth without doing thorough + chemical analysis on every two meters of rock face nearby.
    +
      +
    • Take core samples - Grab a rock core for every 4m^2.
    • +
    • Clear around any potential finds - Clear away ordinary rock, leaving your prizes reachable in a clearly marked area.
    • +
    • Haul off excess rock - It's easy for a dig to get cluttered, and a neat archaeologist is a successful archaeologist.
    • +
    • Don't be afraid to be cautious - It's slower sometimes, but the extra time will be worth the payoff when you find an Exolitic relic.
    • +
    • Chemical analysis - I won't go into detail here, but the labwork is essential to any successful extraction. Marshal your core samples, and + send them off to the labcoated geniuses.
    • +

    + Contents +

    Extracting your first find

    +
      +
    • Scan the rock - Use a depth scanner to determine the find's depth and clearance. DON'T FORGET THESE.
    • +
    • Choose stasis field - Chemical analysis on a core sample from the rock face will tell you which field is necessary to extract the find safely.
    • +
    • Setup field gen - Bolt it down, choose the field, check the charge, and activate it. If you forget it, you'll wish you hadn't when that priceless + Uryom vase crumbles as it sees the light of day.
    • +
    • FUNCTIONAL AND SAFE digging - Dig into the rock until you've cleared away a depth equal to (the anomaly depth MINUS the clearance range). The find + should come loose on it's own, but it will be in the midst of a chunk of rock. Use a welder or miniature excavation tool to clear away the excess.
    • +
    • FANCY AND SPEEDY digging - Dig into the rock until you've cleared away a depth equal to the anomaly depth, but without any of your strokes + entering the clearance range.
    • +
    • The big find - Sometimes, you'll chance upon something big, both literally and figuratively. Giant statues and functioning remnants of Precursor + technology are just as exciting, to the right buyers. If your digging leaves a large boulder behind, dig into it normally and see if anything's hidden + inside.
    • +

    + Contents + "} + + +/datum/codex_entry/guide/mass_spectrometry + name = "Guide to Mass Spectrometry" + lore_text = {" +

    Contents

    +
      +
    1. A note on terms
    2. +
    3. Analysis progression
    4. +
    5. Heat management
    6. +
    7. Ambient radiation
    8. +
    +
    +

    A note on terms

    +
      +
    • Mass spectrometry - MS is the procedure used used to measure and quantify the components of matter. The most prized tool in the field of + 'Materials analysis.'
    • +
    • Radiometric dating - MS applied using the right carrier reagents can be used to accurately determine the age of a sample.
    • +
    • Dissonance ratio - This is a pseudoarbitrary value indicating the overall presence of a particular element in a greater composite. + It takes into account volume, density, molecular excitation and isotope spread.
    • +
    • Vacuum seal integrity - A reference to how close an airtight seal is to failure.
    • +

    + Contents +

    Analysis progression

    + Modern mass spectrometry requires constant attention from the diligent researcher in order to be successful. There are many different elements to juggle, + and later chapters will delve into them. For the spectrometry assistant, the first thing you need to know is that the scanner wavelength is automatically + calculated for you. Just tweak the settings and try to match it with the actual wavelength as closely as possible.
    +
    + Contents +

    Seal integrity

    + In order to maintain sterile and environmentally static procedures, a special chamber is set up inside the spectrometer. It's protected by a proprietary vacuum seal + produced by top tier industrial science. It will only last for a certain number of scans before failing outright, but it can be resealed through use of nanite paste. + Unfortunately, it's susceptible to malforming under heat stress so exposing it to higher temperatures will cause it's operation life to drop significantly.
    +
    + Contents +

    Heat management

    + The scanner relies on a gyro-rotational system that varies in speed and intensity. Over the course of an ordinary scan, the RPMs can change dramatically. Higher RPMs + means greater heat generation, but is necessary for the ongoing continuation of the scan. To offset heat production, spectrometers have an inbuilt cooling system. + Researchers can modify the flow rate of water to aid in dropping temperature as necessary, but are advised that frequent water replacements may be necessary + depending on coolant purity. Other substances may be viable substitutes, but nowhere near as effective as water itself.
    +
    + Contents +

    Ambient radiation

    + Researchers are warned that while operational, mass spectrometers emit period bursts of radiation and are thus advised to wear protective gear. In the event of + radiation spikes, there is also a special shield that can be lowered to block emissions. Lowering this, however, will have the effect of blocking the scanner + so use it sparingly.
    +
    + Contents + "} + +/datum/codex_entry/guide/engineering + name = "Guide to Engineering" + +/datum/codex_entry/guide/construction + name = "Guide to Construction" + +/datum/codex_entry/guide/supermatter + name = "Guide to Supermatter Engines" + +/datum/codex_entry/guide/fusion + name = "Guide to Fusion Reactors" + +/datum/codex_entry/guide/hacking + name = "Guide to Hacking" + associated_strings = list("hacking") + mechanics_text = "Airlocks, vending machines, and various other machinery can be hacked by opening them up and fiddling with the wires. \ + While it might sound like a unlawful deed (and it usually is) this process is also performed by engineers, usually to fix said criminal deeds. \ + Hacking also benefits from the Electrical Engineering skill: a low skill may cause wires to tangle, and a high enough skill will let you examine wires to see what they do. \ +
    Hacking makes use of several items: \ +
    • a screwdriver, for opening maintenance panels.
    • \ +
    • a multitool, for pulsing wires (optional for many tasks, but very useful)
    • \ +
    • wirecutters, for cutting wires
    • \ +
    • insulated gloves, to prevent electrocution (optional but highly recommended)
    • \ +
    • a crowbar, if you're hacking a door to open it.
    \ +
    The first step to most hacking procedures is to use the screwdriver to open a maintenance panel and access the wiring. \ + After, you can click on the machine to view the wires. \ + You then use the multitool to pulse the wires, and in response some of the displayed information may change, causing certain effects to occur or allowing for certain benefits. \ + If you don't have a multitool, you can cut the wires. \ + Pulsing tends to cause temporary changes or toggles something, whereas cutting a wire is usually longer lasting, but this is not always the case. \ + Note that the corresponding wires and effects are randomized between rounds of the game. \ + You can also attach a signaler to pulse wires remotely." + antag_text = "To avoid suspicion or accidents, practice quietly somewhere out of the way and learn the wires you need before doing it for real." diff --git a/code/modules/crafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm b/code/modules/crafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm index e95480f3597..b0de697909d 100644 --- a/code/modules/crafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm +++ b/code/modules/crafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm @@ -35,7 +35,7 @@ item_desc = "It is a half-built crossbow with a steel backbone and a cell mount installed." progress_message = "You assemble and install a heavy plastic lath onto the crossbow." next_stages = list(/decl/crafting_stage/wiring/crossbow_string) - stack_material = /decl/material/solid/plastic + stack_material = /decl/material/solid/organic/plastic /decl/crafting_stage/wiring/crossbow_string item_icon_state = "crossbowframe5" diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index 2ce6d3b954e..94b579d41a5 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -62,8 +62,9 @@ ignore_gloves = 1 if(!ignore_gloves) - var/obj/item/cover = M.get_covering_equipped_item(M.get_active_held_item_slot()) - if(cover) + var/datum/inventory_slot/gripper/holding_with = M.get_inventory_slot_datum(M.get_active_held_item_slot()) + var/obj/item/cover = istype(holding_with) && M.get_covering_equipped_item(holding_with.covering_slot_flags) + if(istype(cover)) cover.add_fingerprint(M, 1) return diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm index b82eb930fe2..91dc7edb207 100644 --- a/code/modules/detectivework/microscope/_forensic_machine.dm +++ b/code/modules/detectivework/microscope/_forensic_machine.dm @@ -27,7 +27,7 @@ /obj/machinery/forensic/proc/set_sample(var/obj/O) if(O != sample && O) clear_sample() - events_repository.register(/decl/observ/destroyed, O, src, /obj/machinery/forensic/proc/clear_sample) + events_repository.register(/decl/observ/destroyed, O, src, TYPE_PROC_REF(/obj/machinery/forensic, clear_sample)) sample = O update_icon() @@ -107,7 +107,7 @@ remover.put_in_hands(sample) clear_sample() -/obj/machinery/forensic/handle_mouse_drop(var/atom/over, var/mob/user) +/obj/machinery/forensic/handle_mouse_drop(atom/over, mob/user, params) if(user == over) remove_sample(usr) return TRUE diff --git a/code/modules/detectivework/tools/crimekit.dm b/code/modules/detectivework/tools/crimekit.dm index c8f56aad2b9..aac1633ff77 100644 --- a/code/modules/detectivework/tools/crimekit.dm +++ b/code/modules/detectivework/tools/crimekit.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/forensics.dmi' icon_state = "case" item_state = "case" - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth matter = list(/decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_REINFORCEMENT) /obj/item/storage/briefcase/crimekit/WillContain() diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 3248b43deba..44b31951521 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -7,11 +7,11 @@ icon_state = "evidenceobj" item_state = "" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW var/obj/item/stored_item = null -/obj/item/evidencebag/handle_mouse_drop(atom/over, mob/user) +/obj/item/evidencebag/handle_mouse_drop(atom/over, mob/user, params) if(user.get_empty_hand_slot() && isitem(over)) var/obj/item/I = over diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 672341015bc..33a8011201c 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -10,8 +10,7 @@ can_be_placed_into = null item_flags = ITEM_FLAG_NO_BLUDGEON atom_flags = ATOM_FLAG_OPEN_CONTAINER - unacidable = 0 - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes @@ -39,15 +38,15 @@ if(W.isflamesource()) if(on_fire) to_chat(user, SPAN_WARNING("\The [src] is already blazing merrily!")) - return + return TRUE ignite() if(on_fire) visible_message(SPAN_DANGER("\The [user] lights \the [src] with \the [W].")) else to_chat(user, SPAN_WARNING("You attempt to light \the [src] with \the [W], but it doesn't seem to be flammable.")) update_name() - return - . = ..() + return TRUE + return ..() /obj/item/chems/glass/rag/proc/update_name() if(on_fire) @@ -160,6 +159,8 @@ if(exposed_temperature >= 900 + T0C) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) + return + return ..() //rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel. //maybe generalize flammable reagents someday @@ -170,7 +171,7 @@ total_volume += reagents.total_volume for(var/rtype in reagents.reagent_volumes) var/decl/material/R = GET_DECL(rtype) - total_fuel = REAGENT_VOLUME(reagents, rtype) * R.fuel_value + total_fuel += REAGENT_VOLUME(reagents, rtype) * R.accelerant_value . = (total_fuel >= 2 && total_fuel >= total_volume*0.5) /obj/item/chems/glass/rag/proc/ignite() diff --git a/code/modules/detectivework/tools/sample_kits/_sample_kit.dm b/code/modules/detectivework/tools/sample_kits/_sample_kit.dm index 8fa87b124bd..07bc721c4ce 100644 --- a/code/modules/detectivework/tools/sample_kits/_sample_kit.dm +++ b/code/modules/detectivework/tools/sample_kits/_sample_kit.dm @@ -40,7 +40,7 @@ to_chat(user, SPAN_WARNING("You are unable to locate any [evidence_type]s on \the [A].")) . = ..() -/obj/item/forensics/sample_kit/handle_mouse_drop(atom/over, mob/user) +/obj/item/forensics/sample_kit/handle_mouse_drop(atom/over, mob/user, params) if(ismob(loc)) afterattack(over, user, TRUE) return TRUE diff --git a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm index 8e88d53625f..a55a01a76dd 100644 --- a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm +++ b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm @@ -1,7 +1,7 @@ /obj/item/forensics/sample_kit/powder name = "fingerprint powder" - desc = "A jar containing alumiinum powder and a specialized brush." + desc = "A jar containing aluminium powder and a specialized brush." icon_state = "dust" evidence_type = "fingerprint" evidence_path = /obj/item/forensics/sample/print @@ -21,7 +21,7 @@ icon_state = "fingerprint0" item_state = "paper" possible_evidence_types = list(/datum/forensics/fingerprints) - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/plastic /obj/item/forensics/sample/print/on_update_icon() . = ..() @@ -33,7 +33,7 @@ /obj/item/forensics/sample/print/merge_evidence_list(var/list/new_evidence) for(var/datum/fingerprint/newprint in new_evidence) for(var/datum/fingerprint/F in evidence) - if(F.merge(newprint)) + if(F.merge(newprint)) new_evidence -= newprint break ..() diff --git a/code/modules/detectivework/tools/sample_kits/swabs.dm b/code/modules/detectivework/tools/sample_kits/swabs.dm index 3d606aa8c89..06dacd7627f 100644 --- a/code/modules/detectivework/tools/sample_kits/swabs.dm +++ b/code/modules/detectivework/tools/sample_kits/swabs.dm @@ -10,9 +10,9 @@ /datum/forensics/trace_dna, /datum/forensics/blood_dna ) - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/cloth = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, ) diff --git a/code/modules/detectivework/tools/scene_cards.dm b/code/modules/detectivework/tools/scene_cards.dm index d3ef9a1f5ce..d3b712342a2 100644 --- a/code/modules/detectivework/tools/scene_cards.dm +++ b/code/modules/detectivework/tools/scene_cards.dm @@ -29,7 +29,7 @@ w_class = ITEM_SIZE_TINY randpixel = 1 layer = ABOVE_HUMAN_LAYER //so you can mark bodies - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/number = 1 /obj/item/csi_marker/Initialize(mapload) diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 51021bffb85..1b5c3a86b71 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -7,7 +7,7 @@ w_class = ITEM_SIZE_SMALL action_button_name = "Toggle UV light" material = /decl/material/solid/metal/steel - origin_tech = "{'magnets':1,'engineering':1}" + origin_tech = @'{"magnets":1,"engineering":1}' z_flags = ZMM_MANGLE_PLANES var/list/scanned = list() var/list/stored_alpha = list() @@ -51,17 +51,20 @@ if(scanned.len) for(var/atom/O in scanned) O.set_invisibility(scanned[O]) - if(O.fluorescent == 2) O.fluorescent = 1 + if(O.fluorescent == FLUORESCENT_GLOWING) + O.fluorescent = FLUORESCENT_GLOWS scanned.Cut() if(stored_alpha.len) for(var/atom/O in stored_alpha) O.alpha = stored_alpha[O] - if(O.fluorescent == 2) O.fluorescent = 1 + if(O.fluorescent == FLUORESCENT_GLOWING) + O.fluorescent = FLUORESCENT_GLOWS stored_alpha.Cut() if(reset_objects.len) for(var/obj/item/I in reset_objects) I.overlays -= I.blood_overlay - if(I.fluorescent == 2) I.fluorescent = 1 + if(I.fluorescent == FLUORESCENT_GLOWING) + I.fluorescent = FLUORESCENT_GLOWS reset_objects.Cut() /obj/item/uv_light/Process() @@ -74,11 +77,11 @@ for(var/turf/T in range(range, origin)) var/use_alpha = 255 - (step_alpha * get_dist(origin, T)) for(var/atom/A in T.contents) - if(A.fluorescent == 1) - A.fluorescent = 2 //To prevent light crosstalk. + if(A.fluorescent == FLUORESCENT_GLOWS) + A.fluorescent = FLUORESCENT_GLOWING //To prevent light crosstalk. if(A.invisibility) scanned[A] = A.invisibility - A.set_invisibility(0) + A.set_invisibility(INVISIBILITY_NONE) stored_alpha[A] = A.alpha A.alpha = use_alpha if(istype(A, /obj/item)) diff --git a/code/modules/economy/cael/ATM.dm b/code/modules/economy/cael/ATM.dm index 97863816303..af75a724103 100644 --- a/code/modules/economy/cael/ATM.dm +++ b/code/modules/economy/cael/ATM.dm @@ -11,7 +11,7 @@ anchored = TRUE idle_power_usage = 10 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/datum/money_account/authenticated_account var/number_incorrect_tries = 0 diff --git a/code/modules/economy/cael/EFTPOS.dm b/code/modules/economy/cael/EFTPOS.dm index b82e5eb2a39..12bd6028311 100644 --- a/code/modules/economy/cael/EFTPOS.dm +++ b/code/modules/economy/cael/EFTPOS.dm @@ -3,7 +3,7 @@ desc = "Swipe your ID card to make purchases electronically." icon = 'icons/obj/items/device/eftpos.dmi' icon_state = "eftpos" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT) var/machine_id = "" var/eftpos_name = "Default EFTPOS scanner" @@ -35,10 +35,10 @@ txt += "2. Lock the new transaction. If you want to modify or cancel the transaction, you simply have to reset your EFTPOS device.
    " txt += "3. Give the EFTPOS device to your customer, he/she must finish the transaction by swiping their ID card or a charge card with enough funds.
    " txt += "4. If everything is done correctly, the money will be transferred. To unlock the device you will have to reset the EFTPOS device.
    " - + var/obj/item/paper/R = new(src.loc, null, txt, "Steps to success: Correct EFTPOS Usage") R.apply_custom_stamp( - overlay_image('icons/obj/bureaucracy.dmi', icon_state = "paper_stamp-boss", flags = RESET_COLOR), + overlay_image('icons/obj/bureaucracy.dmi', icon_state = "paper_stamp-boss", flags = RESET_COLOR), "by \the [src]") //by default, connect to the station account @@ -46,14 +46,14 @@ linked_account = station_account /obj/item/eftpos/proc/print_reference() - var/obj/item/paper/R = new(src.loc, null, - "[eftpos_name] reference

    Access code: [access_code]

    Do not lose or misplace this code.
    ", + var/obj/item/paper/R = new(src.loc, null, + "[eftpos_name] reference

    Access code: [access_code]

    Do not lose or misplace this code.
    ", "Reference: [eftpos_name]") R.apply_custom_stamp( - overlay_image('icons/obj/bureaucracy.dmi', icon_state = "paper_stamp-boss", flags = RESET_COLOR), + overlay_image('icons/obj/bureaucracy.dmi', icon_state = "paper_stamp-boss", flags = RESET_COLOR), "by the [src]") - - + + var/obj/item/parcel/D = new(R.loc, null, R, "EFTPOS access code") D.attach_label(usr, null, "EFTPOS access code") diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index dd94cbbf3c8..a6d4ed7b6b8 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -11,7 +11,7 @@ throw_speed = 1 throw_range = 2 w_class = ITEM_SIZE_TINY - material = /decl/material/solid/cardboard //#TODO: Replace with paper + material = /decl/material/solid/organic/plastic var/currency var/absolute_worth = 0 var/can_flip = TRUE // Cooldown tracker for single-coin flips. @@ -152,6 +152,7 @@ /obj/item/cash/c200 absolute_worth = 200 + w_class = ITEM_SIZE_SMALL // so that the money freezer doesn't overflow bc this is a pile instead of single bill /obj/item/cash/c500 absolute_worth = 500 @@ -174,7 +175,7 @@ icon_state = ICON_STATE_WORLD desc = "A digital stick that holds an amount of money." w_class = ITEM_SIZE_TINY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, /decl/material/solid/silicon = MATTER_AMOUNT_TRACE) var/max_worth = 5000 var/loaded_worth = 0 @@ -191,6 +192,11 @@ currency = global.using_map.default_currency update_name_desc() set_extension(src, lock_type) + + if(grade && grade != "peasant") + var/image/I = image(icon, "[icon_state]-[grade]") + I.appearance_flags |= RESET_COLOR + add_overlay(I, TRUE) update_icon() /obj/item/charge_stick/proc/update_name_desc() @@ -206,6 +212,7 @@ loaded_worth += amt if(loaded_worth < 0) loaded_worth = 0 + update_icon() /obj/item/charge_stick/examine(mob/user, distance) . = ..(user) @@ -268,14 +275,53 @@ var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) return lock.locked +/** + Given a number, returns a representation fit for a 3-digit display. + + Assumes that besides the digits themselves, display provides + decimal point on the highest digit, plus (for overflow) and minus signs. + Returns lists indexed by (power of ten)+1, that is, with [1] showing ones, + [2] tens, [3] hundreds. + Valid values are `-99` to `99`, with `++` and `---` for over and underflow, + where is the maximal provided decimal postfix (k, M, B, T, etc). +*/ +/proc/number_to_3digits(value, var/list/postfixes = list("k", "M")) + var/list/digits[3] + var/lim = 1000 + if (value < 0) // negatives + digits[3] = "-" + value *= -1 + lim = 100 + else + for(var/s in postfixes) + if (value < lim) + break + value /= 1000 + digits[1] = s + lim = 100 + if (value >= lim) // over/underflow + if (!digits[3]) + digits[3] = "+" + if (!digits[1]) + digits[1] = digits[3] + digits[2] = digits[3] + else + if ((lim == 100) && !digits[3]) // suffix on + if (value < 1) // . + digits[3] = "." + value *= 100 // .X => 0X0 + else // just suffix + value *= 10 // XX => XX0 + if (!digits[1]) + digits[1] = value % 10 + digits[2] = (value / 10) % 10 + if (!digits[3]) + digits[3] = (value / 100) % 10 + return digits + /obj/item/charge_stick/on_update_icon() . = ..() - if(grade && grade != "peasant") - var/image/I = image(icon, "[icon_state]-[grade]") - I.appearance_flags |= RESET_COLOR - overlays += I - if(get_world_inventory_state() == ICON_STATE_WORLD) return @@ -283,18 +329,13 @@ if(lock.locked) return - if(loaded_worth > 999999) - overlays += image(icon, "9__") - overlays += image(icon, "_9_") - overlays += image(icon, "__9") - return + var/decl/currency/cur = GET_DECL(currency) + var/displayed_worth = loaded_worth / cur.absolute_value // Denominated in stick currency + var/list/digits = number_to_3digits(displayed_worth) + add_overlay("__[digits[1]]") + add_overlay("_[digits[2]]_") + add_overlay("[digits[3]]__") - var/h_thou = loaded_worth / 100000 - var/t_thou = (loaded_worth - (FLOOR(h_thou) * 100000)) / 10000 - var/thou = (loaded_worth - (FLOOR(h_thou) * 100000) - (FLOOR(t_thou) * 10000)) / 1000 - overlays += image(icon, "[FLOOR(h_thou)]__") - overlays += image(icon, "_[FLOOR(t_thou)]_") - overlays += image(icon, "__[FLOOR(thou)]") /obj/item/charge_stick/copper grade = "copper" diff --git a/code/modules/economy/worth_currency.dm b/code/modules/economy/worth_currency.dm index 7ebe5b30ebb..b9bdff6e541 100644 --- a/code/modules/economy/worth_currency.dm +++ b/code/modules/economy/worth_currency.dm @@ -14,7 +14,7 @@ name = "[value_name] [currency.name_singular] [name || "piece"]" state = state || "cash" marked_value = value - overlay = image(currency, state) + overlay = image(currency.icon, state) overlay.color = colour overlay.appearance_flags |= RESET_COLOR overlay.plane = FLOAT_PLANE @@ -45,7 +45,7 @@ var/name_prefix var/name_suffix var/icon = 'icons/obj/items/money.dmi' - var/material = /decl/material/solid/plastic + var/material = /decl/material/solid/organic/plastic var/absolute_value = 1 // Divisor for cash pile worth. Should never be <1 or non-integer (think of it like cents). var/list/denominations = list() var/list/denominations_by_value = list() diff --git a/code/modules/economy/worth_items.dm b/code/modules/economy/worth_items.dm index 90d27fd35d2..bcea92fe798 100644 --- a/code/modules/economy/worth_items.dm +++ b/code/modules/economy/worth_items.dm @@ -16,12 +16,14 @@ var/largest_tech_val = 0 var/list/tech = cached_json_decode(origin_tech) for(var/t in tech) - var/next_tech_val = (tech[t]**2) * 5 + if(tech[t] <= 1) + continue + var/next_tech_val = ((tech[t] - 1)**2) * 5 if(next_tech_val > largest_tech_val) largest_tech_val = next_tech_val - . += largest_tech_val + . += largest_tech_val - if(force) + if((item_flags & ITEM_FLAG_IS_WEAPON) && force) var/weapon_value = ((get_max_weapon_value() * 15) * (1 + max(sharp, edge))) if(attack_cooldown <= FAST_WEAPON_COOLDOWN) weapon_value *= 1.5 diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm index 90598baaa78..c6fd0855eeb 100644 --- a/code/modules/emotes/definitions/_mob.dm +++ b/code/modules/emotes/definitions/_mob.dm @@ -42,19 +42,7 @@ /decl/emote/audible/choke, /decl/emote/audible/moan, /decl/emote/audible/gnarl - ) - -/mob/living/carbon/brain - default_emotes = list( - /decl/emote/audible/alarm, - /decl/emote/audible/alert, - /decl/emote/audible/notice, - /decl/emote/audible/whistle, - /decl/emote/audible/synth, - /decl/emote/audible/boop, - /decl/emote/visible/blink, - /decl/emote/visible/flash - ) + ) /mob/living/carbon/human default_emotes = list( @@ -168,4 +156,4 @@ /decl/emote/audible/synth/deny, /decl/emote/audible/synth/security, /decl/emote/audible/synth/security/halt - ) + ) diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm index 24f6c9dfdb9..7713886e073 100644 --- a/code/modules/emotes/emote_mob.dm +++ b/code/modules/emotes/emote_mob.dm @@ -10,8 +10,8 @@ /mob/living/check_mob_can_emote(var/emote_type) return ..() && !(HAS_STATUS(src, STAT_SILENCE) && emote_type == AUDIBLE_MESSAGE) -/mob/living/carbon/brain/check_mob_can_emote(var/emote_type) - return ..() && (istype(container, /obj/item/mmi) || istype(loc, /obj/item/organ/internal/posibrain)) +/mob/living/brain/check_mob_can_emote(var/emote_type) + return ..() && istype(get_container(), /obj/item/organ/internal/brain_interface) /mob/proc/emote(var/act, var/m_type, var/message) set waitfor = FALSE diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 2e61914c580..39f8dc118d9 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -44,17 +44,9 @@ var/global/regex/actual_error_file_line //Handle cooldowns and silencing spammy errors var/silencing = FALSE - // We can runtime before config is initialized because BYOND initialize objs/map before a bunch of other stuff happens. - // This is a bunch of workaround code for that. Hooray! - - var/configured_error_cooldown = initial(config.error_cooldown) - var/configured_error_limit = initial(config.error_limit) - var/configured_error_silence_time = initial(config.error_silence_time) - if(config) - configured_error_cooldown = config.error_cooldown - configured_error_limit = config.error_limit - configured_error_silence_time = config.error_silence_time - + var/configured_error_cooldown = get_config_value(/decl/config/num/debug_error_cooldown) + var/configured_error_limit = get_config_value(/decl/config/num/debug_error_limit) + var/configured_error_silence_time = get_config_value(/decl/config/num/debug_error_silence_time) //Each occurence of an unique error adds to its cooldown time... cooldown = max(0, cooldown - (world.time - last_seen)) + configured_error_cooldown diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index d08af79ce53..4cf335faab0 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -126,14 +126,9 @@ var/global/datum/error_viewer/error_cache/error_cache // Show the error to admins with debug messages turned on, but only if one // from the same source hasn't been shown too recently if (error_source.next_message_at <= world.time) - var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly + //var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly //log_debug("Runtime in [e.file], line [e.line]: [html_encode(e.name)] [error_entry.make_link(viewtext)]") - var/err_msg_delay - if(config) - err_msg_delay = config.error_msg_delay - else - err_msg_delay = initial(config.error_msg_delay) - error_source.next_message_at = world.time + err_msg_delay + error_source.next_message_at = world.time + get_config_value(/decl/config/num/debug_error_msg_delay) /datum/error_viewer/error_source var/list/errors = list() diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index fde3b27d545..a2cf955a797 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -64,17 +64,17 @@ var/global/list/carp_count = list() // a list of Z levels (string), associated w else M = new /mob/living/simple_animal/hostile/carp/pike(T) I += 3 - events_repository.register(/decl/observ/death, M,src,/datum/event/carp_migration/proc/reduce_carp_count) - events_repository.register(/decl/observ/destroyed, M,src,/datum/event/carp_migration/proc/reduce_carp_count) + events_repository.register(/decl/observ/death, M,src, TYPE_PROC_REF(/datum/event/carp_migration, reduce_carp_count)) + events_repository.register(/decl/observ/destroyed, M,src, TYPE_PROC_REF(/datum/event/carp_migration, reduce_carp_count)) LAZYADD(global.carp_count[num2text(Z)], M) spawned_carp ++ - M.throw_at(get_random_edge_turf(global.reverse_dir[direction],TRANSITIONEDGE + 2, Z), 250, speed, callback = CALLBACK(src,/datum/event/carp_migration/proc/check_gib,M)) + M.throw_at(get_random_edge_turf(global.reverse_dir[direction],TRANSITIONEDGE + 2, Z), 250, speed, callback = CALLBACK(src, TYPE_PROC_REF(/datum/event/carp_migration, check_gib), M)) I++ if(no_show) break /datum/event/carp_migration/proc/check_gib(var/mob/living/simple_animal/hostile/carp/M) //awesome road kills - if(M.health <= 0 && prob(60)) + if(M.current_health <= 0 && prob(60)) M.gib() /proc/get_random_edge_turf(var/direction, var/clearance = TRANSITIONEDGE + 1, var/Z) @@ -97,8 +97,8 @@ var/global/list/carp_count = list() // a list of Z levels (string), associated w if(M in L) LAZYREMOVE(L,M) break - events_repository.unregister(/decl/observ/death, M,src,/datum/event/carp_migration/proc/reduce_carp_count) - events_repository.unregister(/decl/observ/destroyed, M,src,/datum/event/carp_migration/proc/reduce_carp_count) + events_repository.unregister(/decl/observ/death, M,src, TYPE_PROC_REF(/datum/event/carp_migration, reduce_carp_count)) + events_repository.unregister(/decl/observ/destroyed, M,src, TYPE_PROC_REF(/datum/event/carp_migration, reduce_carp_count)) /datum/event/carp_migration/end() log_debug("Carp migration event spawned [spawned_carp] carp.") diff --git a/code/modules/events/disposals_explosion.dm b/code/modules/events/disposals_explosion.dm index cf1cb63a93b..86f470f6d6e 100644 --- a/code/modules/events/disposals_explosion.dm +++ b/code/modules/events/disposals_explosion.dm @@ -24,7 +24,7 @@ // Event listener for the marked pipe's destruction /datum/event/disposals_explosion/proc/pipe_destroyed() - events_repository.unregister(/decl/observ/destroyed, bursting_pipe, src, .proc/pipe_destroyed) + events_repository.unregister(/decl/observ/destroyed, bursting_pipe, src, PROC_REF(pipe_destroyed)) bursting_pipe = null kill() @@ -43,7 +43,7 @@ if(istype(A, /obj/structure/disposalpipe/segment)) bursting_pipe = A // Subscribe to pipe destruction facts - events_repository.register(/decl/observ/destroyed, A, src, .proc/pipe_destroyed) + events_repository.register(/decl/observ/destroyed, A, src, PROC_REF(pipe_destroyed)) break if(isnull(bursting_pipe)) @@ -70,7 +70,7 @@ if(isnull(bursting_pipe)) return - events_repository.unregister(/decl/observ/destroyed, bursting_pipe, src, .proc/pipe_destroyed) + events_repository.unregister(/decl/observ/destroyed, bursting_pipe, src, PROC_REF(pipe_destroyed)) if(bursting_pipe.health < 5) // Make a disposals holder for the trash diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 4a41dbf3d31..0686eee43d9 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -43,7 +43,7 @@ var/penalty = 100 // A simple penalty gives admins the ability to increase the weight to again be part of the random event selection /datum/event_meta/extended_penalty/get_weight() - return ..() - (istype(SSticker.mode, /datum/game_mode/extended) ? penalty : 0) + return ..() - (istype(SSticker.mode, /decl/game_mode/extended) ? penalty : 0) /datum/event_meta/no_overmap/get_weight() //these events have overmap equivalents, and shouldn't fire randomly if overmap is used return length(global.using_map.overmap_ids) ? 0 : ..() diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index e67279c59e5..d404c07a42c 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -15,7 +15,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT if(!next_event_time) set_event_delay() - if(delayed || !config.allow_random_events) + if(delayed || !get_config_value(/decl/config/toggle/allow_random_events)) next_event_time += (world.time - last_world_time) else if(world.time > next_event_time) start_event() @@ -71,17 +71,18 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT var/last_time = last_event_time[EM] if(last_time) var/time_passed = world.time - last_time - var/weight_modifier = max(0, round((config.expected_round_length - time_passed) / 300)) + var/weight_modifier = max(0, round(((get_config_value(/decl/config/num/expected_round_length) HOURS) - time_passed) / 300)) weight = weight - weight_modifier return weight /datum/event_container/proc/set_event_delay() // If the next event time has not yet been set and we have a custom first time start - if(next_event_time == 0 && config.event_first_run[severity]) - var/lower = config.event_first_run[severity]["lower"] - var/upper = config.event_first_run[severity]["upper"] - var/event_delay = rand(lower, upper) + var/list/event_first_run = get_config_value(/decl/config/lists/event_first_run) + if(next_event_time == 0 && event_first_run[severity]) + var/lower = event_first_run[severity]["lower"] + var/upper = event_first_run[severity]["upper"] + var/event_delay = rand(lower, upper) MINUTES next_event_time = world.time + event_delay // Otherwise, follow the standard setup process else @@ -99,7 +100,9 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT playercount_modifier = 0.8 playercount_modifier = playercount_modifier * delay_modifier - var/event_delay = rand(config.event_delay_lower[severity], config.event_delay_upper[severity]) * playercount_modifier + var/list/event_delay_lower = get_config_value(/decl/config/lists/event_delay_lower) + var/list/event_delay_upper = get_config_value(/decl/config/lists/event_delay_upper) + var/event_delay = (rand(event_delay_lower[severity], event_delay_upper[severity]) * playercount_modifier) MINUTES next_event_time = world.time + event_delay log_debug("Next event of severity [severity_to_string[severity]] in [(next_event_time - world.time)/600] minutes.") diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 94d4290d4ff..2bf3dd6ead1 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -2,7 +2,7 @@ var/global/list/event_last_fired = list() //Always triggers an event when called, dynamically chooses events based on job population /proc/spawn_dynamic_event() - if(!config.allow_random_events) + if(!get_config_value(/decl/config/toggle/allow_random_events)) return var/minutes_passed = world.time/600 diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm index dc894d839de..9b1887f118f 100644 --- a/code/modules/ext_scripts/irc.dm +++ b/code/modules/ext_scripts/irc.dm @@ -1,30 +1,36 @@ /proc/send2irc(var/channel, var/msg) - export2irc(list(type="msg", mesg=msg, chan=channel, pwd=config.comms_password)) + export2irc(list(type="msg", mesg=msg, chan=channel, pwd=get_config_value(/decl/config/text/comms_password))) /proc/export2irc(params) - if(config.use_irc_bot && config.irc_bot_host) + if(!get_config_value(/decl/config/toggle/use_irc_bot)) + return + var/irc_bot_host = get_config_value(/decl/config/text/irc_bot_host) + if(irc_bot_host) spawn(-1) // spawn here prevents hanging in the case that the bot isn't reachable - world.Export("http://[config.irc_bot_host]:45678?[list2params(params)]") + world.Export("http://[irc_bot_host]:45678?[list2params(params)]") /proc/runtimes2irc(runtimes, revision) - export2irc(list(pwd=config.comms_password, type="runtime", runtimes=runtimes, revision=revision)) + export2irc(list(pwd=get_config_value(/decl/config/text/comms_password), type="runtime", runtimes=runtimes, revision=revision)) /proc/send2mainirc(var/msg) - if(config.main_irc) - send2irc(config.main_irc, msg) + var/main_irc = get_config_value(/decl/config/text/main_irc) + if(main_irc) + send2irc(main_irc, msg) return /proc/send2adminirc(var/msg) - if(config.admin_irc) - send2irc(config.admin_irc, msg) + var/admin_irc = get_config_value(/decl/config/text/admin_irc) + if(admin_irc) + send2irc(admin_irc, msg) return /proc/adminmsg2adminirc(client/source, client/target, msg) - if(config.admin_irc) + var/admin_irc = get_config_value(/decl/config/text/admin_irc) + if(admin_irc) var/list/params[0] - params["pwd"] = config.comms_password - params["chan"] = config.admin_irc + params["pwd"] = get_config_value(/decl/config/text/comms_password) + params["chan"] = admin_irc params["msg"] = msg params["src_key"] = source.key params["src_char"] = source.mob.real_name || source.mob.name @@ -42,13 +48,7 @@ export2irc(params) /proc/get_world_url() - . = "byond://" - if(config.serverurl) - . += config.serverurl - else if(config.server) - . += config.server - else - . += "[world.address]:[world.port]" + return "byond://[get_config_value(/decl/config/text/server) || get_config_value(/decl/config/text/serverurl) || "[world.address]:[world.port]"]" /hook/startup/proc/ircNotify() send2mainirc("Server starting up on [get_world_url()]") diff --git a/code/modules/fabrication/designs/_design.dm b/code/modules/fabrication/designs/_design.dm index b3ec5719dc3..8d381868fe1 100644 --- a/code/modules/fabrication/designs/_design.dm +++ b/code/modules/fabrication/designs/_design.dm @@ -55,17 +55,6 @@ for(var/mat in building_cost) resources[mat] = building_cost[mat] * FABRICATOR_EXTRA_COST_FACTOR -/obj/building_cost() - . = ..() - if(length(matter)) - for(var/material in matter) - var/decl/material/M = GET_DECL(material) - if(istype(M)) - .[M.type] = matter[material] - if(reagents && length(reagents.reagent_volumes)) - for(var/R in reagents.reagent_volumes) - .[R] = FLOOR(REAGENT_VOLUME(reagents, R) / REAGENT_UNITS_PER_MATERIAL_UNIT) - /datum/fabricator_recipe/proc/build(var/turf/location, var/datum/fabricator_build_order/order) . = list() if(ispath(path, /obj/item/stack)) diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 49ad3f1f867..5f7065dbaaa 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -107,7 +107,7 @@ /datum/fabricator_recipe/fiberglass/get_resources() resources = list( /decl/material/solid/glass = CEILING((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), - /decl/material/solid/plastic = CEILING((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + /decl/material/solid/organic/plastic = CEILING((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) ) /datum/fabricator_recipe/struts @@ -125,7 +125,7 @@ /datum/fabricator_recipe/struts/plastic/get_resources() resources = list( - /decl/material/solid/plastic = CEILING((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)), + /decl/material/solid/organic/plastic = CEILING((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)), ) /datum/fabricator_recipe/struts/aluminium @@ -162,5 +162,12 @@ /datum/fabricator_recipe/package_wrapper path = /obj/item/stack/package_wrap -/datum/fabricator_recipe/gift_wrapper - path = /obj/item/stack/package_wrap/gift \ No newline at end of file + +/datum/fabricator_recipe/package_wrapper/gift + path = /obj/item/stack/package_wrap/gift + +/datum/fabricator_recipe/clothes_iron + path = /obj/item/ironingiron + +/datum/fabricator_recipe/ironing_board + path = /obj/item/roller/ironingboard \ No newline at end of file diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index f26e6361ca5..badc05f81c0 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -218,9 +218,6 @@ /datum/fabricator_recipe/imprinter/circuit/chemical_dispenser path = /obj/item/stock_parts/circuitboard/chemical_dispenser -/datum/fabricator_recipe/imprinter/circuit/atmos_control - path = /obj/item/stock_parts/circuitboard/atmoscontrol - /datum/fabricator_recipe/imprinter/circuit/pipe_dispenser path = /obj/item/stock_parts/circuitboard/pipedispensor @@ -338,6 +335,9 @@ /datum/fabricator_recipe/imprinter/circuit/washer path = /obj/item/stock_parts/circuitboard/washer +/datum/fabricator_recipe/imprinter/circuit/autoclave + path = /obj/item/stock_parts/circuitboard/autoclave + /datum/fabricator_recipe/imprinter/circuit/microwave path = /obj/item/stock_parts/circuitboard/microwave @@ -483,4 +483,16 @@ path = /obj/item/stock_parts/circuitboard/holomap /datum/fabricator_recipe/imprinter/circuit/geothermal_generator - path = /obj/item/stock_parts/circuitboard/geothermal \ No newline at end of file + path = /obj/item/stock_parts/circuitboard/geothermal + +/datum/fabricator_recipe/imprinter/circuit/area_atmos + path = /obj/item/stock_parts/circuitboard/area_atmos + +/datum/fabricator_recipe/imprinter/circuit/area_atmos_control + path = /obj/item/stock_parts/circuitboard/area_atmos/area + +/datum/fabricator_recipe/imprinter/circuit/tag_scrubber_control + path = /obj/item/stock_parts/circuitboard/area_atmos/tag + +/datum/fabricator_recipe/imprinter/circuit/central_atmos + path = /obj/item/stock_parts/circuitboard/central_atmos diff --git a/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm b/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm index 1c4f1849691..f2cb06e6080 100644 --- a/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm +++ b/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm @@ -78,9 +78,27 @@ category = "Exosuit Equipment" path = /obj/item/mech_equipment/clamp +/datum/fabricator_recipe/industrial/exosuit_gear/flash + path = /obj/item/mech_equipment/flash + /datum/fabricator_recipe/industrial/exosuit_gear/gravity_catapult path = /obj/item/mech_equipment/catapult +/datum/fabricator_recipe/industrial/exosuit_gear/ionjets + path = /obj/item/mech_equipment/ionjets + +/datum/fabricator_recipe/industrial/exosuit_gear/camera + path = /obj/item/mech_equipment/camera + +/datum/fabricator_recipe/industrial/exosuit_gear/shields + path = /obj/item/mech_equipment/shields + +/datum/fabricator_recipe/industrial/exosuit_gear/ballistic_shield + path = /obj/item/mech_equipment/ballistic_shield + +/datum/fabricator_recipe/industrial/exosuit_gear/atmos_shields + path = /obj/item/mech_equipment/atmos_shields + /datum/fabricator_recipe/industrial/exosuit_gear/drill path = /obj/item/mech_equipment/drill @@ -93,14 +111,16 @@ if(!ispath(path, /obj/item/mech_equipment/mounted_system)) return var/obj/item/mech_equipment/mounted_system/system = path - - var/mounted_type = initial(system.holding_type) + var/mounted_type = initial(system.holding) if(!mounted_type) return var/list/mounted_cost = atom_info_repository.get_matter_for(mounted_type) for(var/mat in mounted_cost) resources[mat] += mounted_cost[mat] * FABRICATOR_EXTRA_COST_FACTOR +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/machete + path = /obj/item/mech_equipment/mounted_system/melee/machete + /datum/fabricator_recipe/industrial/exosuit_gear/mounted/plasma path = /obj/item/mech_equipment/mounted_system/taser/plasma @@ -110,6 +130,9 @@ /datum/fabricator_recipe/industrial/exosuit_gear/mounted/laser path = /obj/item/mech_equipment/mounted_system/taser/laser +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/autoplasma + path = /obj/item/mech_equipment/mounted_system/taser/autoplasma + /datum/fabricator_recipe/industrial/exosuit_gear/mounted/smg path = /obj/item/mech_equipment/mounted_system/projectile @@ -128,9 +151,6 @@ /datum/fabricator_recipe/industrial/exosuit_gear/mounted/extinguisher path = /obj/item/mech_equipment/mounted_system/extinguisher -/datum/fabricator_recipe/industrial/exosuit_gear/mounted/mechshields - path = /obj/item/mech_equipment/shields - /datum/fabricator_recipe/industrial/exosuit_ammo category = "Exosuit Ammunition" path = /obj/item/ammo_magazine/mech/smg_top diff --git a/code/modules/fabrication/designs/protolathe/designs_machine_intelligence.dm b/code/modules/fabrication/designs/protolathe/designs_machine_intelligence.dm index e2a471367ec..3b52762f8f9 100644 --- a/code/modules/fabrication/designs/protolathe/designs_machine_intelligence.dm +++ b/code/modules/fabrication/designs/protolathe/designs_machine_intelligence.dm @@ -1,15 +1,15 @@ /datum/fabricator_recipe/protolathe/brains category = "Machine Intelligence" - path = /obj/item/mmi + path = /obj/item/organ/internal/brain_interface/empty /datum/fabricator_recipe/protolathe/brains/get_product_name() . = "intelligence storage ([..()])" +/datum/fabricator_recipe/protolathe/brains/robotic + path = /obj/item/organ/internal/brain/robotic + /datum/fabricator_recipe/protolathe/brains/mmi_radio - path = /obj/item/mmi/radio_enabled - -/datum/fabricator_recipe/protolathe/brains/posibrain - path = /obj/item/organ/internal/posibrain + path = /obj/item/organ/internal/brain_interface/radio_enabled/empty /datum/fabricator_recipe/protolathe/brains/paicard path = /obj/item/paicard diff --git a/code/modules/fabrication/designs/robotics/designs_organs.dm b/code/modules/fabrication/designs/robotics/designs_organs.dm index 534d079db18..10bd93793a0 100644 --- a/code/modules/fabrication/designs/robotics/designs_organs.dm +++ b/code/modules/fabrication/designs/robotics/designs_organs.dm @@ -10,13 +10,13 @@ for(var/key in resources) if(!ispath(key, /decl/material/solid)) resources -= key - var/meat_amount = LAZYACCESS(resources, /decl/material/solid/meat) + var/meat_amount = LAZYACCESS(resources, /decl/material/solid/organic/meat) if(meat_amount) if(LAZYACCESS(resources, /decl/material/solid/metal/steel)) resources[/decl/material/solid/metal/steel] += meat_amount else LAZYSET(resources, /decl/material/solid/metal/steel, meat_amount) - LAZYREMOVE(resources, /decl/material/solid/meat) + LAZYREMOVE(resources, /decl/material/solid/organic/meat) /datum/fabricator_recipe/robotics/organ/build(turf/location, datum/fabricator_build_order/order) . = ..() diff --git a/code/modules/fabrication/designs/robotics/designs_prosthetics.dm b/code/modules/fabrication/designs/robotics/designs_prosthetics.dm index 663198ca351..a35d78e4a9e 100644 --- a/code/modules/fabrication/designs/robotics/designs_prosthetics.dm +++ b/code/modules/fabrication/designs/robotics/designs_prosthetics.dm @@ -31,12 +31,17 @@ } \ /datum/fabricator_recipe/robotics/prosthetic/model_##MODEL_ID/groin { \ path = /obj/item/organ/external/groin; \ -} -/* Readd if FBP construction is desirable +} \ /datum/fabricator_recipe/robotics/prosthetic/model_##MODEL_ID/chest { \ path = /obj/item/organ/external/chest; \ } \ -*/ +/datum/fabricator_recipe/robotics/prosthetic/model_##MODEL_ID/head { \ + path = /obj/item/organ/external/head; \ +} \ +/datum/fabricator_recipe/robotics/prosthetic/model_##MODEL_ID/groin { \ + path = /obj/item/organ/external/groin; \ +} + /datum/fabricator_recipe/robotics/prosthetic var/model @@ -70,13 +75,13 @@ for(var/key in resources) if(!ispath(key, /decl/material/solid)) resources -= key - var/meat_amount = LAZYACCESS(resources, /decl/material/solid/meat) + var/meat_amount = LAZYACCESS(resources, /decl/material/solid/organic/meat) if(meat_amount) if(LAZYACCESS(resources, /decl/material/solid/metal/steel)) resources[/decl/material/solid/metal/steel] += meat_amount else LAZYSET(resources, /decl/material/solid/metal/steel, meat_amount) - LAZYREMOVE(resources, /decl/material/solid/meat) + LAZYREMOVE(resources, /decl/material/solid/organic/meat) /datum/fabricator_recipe/robotics/prosthetic/get_product_name() . = "prosthetic limb ([..()])" diff --git a/code/modules/fabrication/designs/textile/armor.dm b/code/modules/fabrication/designs/textile/armor.dm index fa4141cec8f..6d98d22eca6 100644 --- a/code/modules/fabrication/designs/textile/armor.dm +++ b/code/modules/fabrication/designs/textile/armor.dm @@ -5,7 +5,7 @@ /datum/fabricator_recipe/textiles/armor/hos path = /obj/item/clothing/suit/armor/hos - + /datum/fabricator_recipe/textiles/armor/jensen path = /obj/item/clothing/suit/armor/hos/jensen @@ -17,7 +17,7 @@ /datum/fabricator_recipe/textiles/armor/plate/medium path = /obj/item/clothing/accessory/armor/plate/medium - + /datum/fabricator_recipe/textiles/armor/plate/tactical path = /obj/item/clothing/accessory/armor/plate/tactical @@ -71,7 +71,7 @@ /datum/fabricator_recipe/textiles/armor/helmet category = "Armor - Helmets" path = /obj/item/clothing/head/helmet - + /datum/fabricator_recipe/textiles/helmet/tactical path = /obj/item/clothing/head/helmet/tactical @@ -99,8 +99,8 @@ var/global/list/melee_mats = list( /decl/material/solid/metal/titanium = ARMOR_MELEE_VERY_HIGH, /decl/material/solid/metal/steel = ARMOR_MELEE_MAJOR, /decl/material/solid/metal/iron = ARMOR_MELEE_KNIVES, - /decl/material/solid/leather = ARMOR_MELEE_KNIVES, - /decl/material/solid/plastic = ARMOR_MELEE_SMALL + /decl/material/solid/organic/leather = ARMOR_MELEE_KNIVES, + /decl/material/solid/organic/plastic = ARMOR_MELEE_SMALL ) var/global/list/bullet_mats = list( @@ -109,6 +109,6 @@ var/global/list/bullet_mats = list( /decl/material/solid/metal/titanium = ARMOR_BALLISTIC_RESISTANT, /decl/material/solid/metal/steel = ARMOR_BALLISTIC_PISTOL, /decl/material/solid/metal/iron = ARMOR_BALLISTIC_SMALL, - /decl/material/solid/leather = ARMOR_BALLISTIC_MINOR, - /decl/material/solid/plastic = ARMOR_BALLISTIC_MINOR + /decl/material/solid/organic/leather = ARMOR_BALLISTIC_MINOR, + /decl/material/solid/organic/plastic = ARMOR_BALLISTIC_MINOR ) diff --git a/code/modules/fabrication/fabricator_food.dm b/code/modules/fabrication/fabricator_food.dm index 65a3f51f109..b275ddc8f4c 100644 --- a/code/modules/fabrication/fabricator_food.dm +++ b/code/modules/fabrication/fabricator_food.dm @@ -13,15 +13,15 @@ return ..() var/true_text = lowertext(html_decode(text)) if(findtext(true_text, "status")) - addtimer(CALLBACK(src, /obj/machinery/fabricator/replicator/proc/state_status), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/fabricator/replicator, state_status)), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) else if(findtext(true_text, "menu")) - addtimer(CALLBACK(src, /obj/machinery/fabricator/replicator/proc/state_menu), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - else + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/fabricator/replicator, state_menu)), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + else for(var/datum/fabricator_recipe/recipe in design_cache) if(recipe.hidden && !(fab_status_flags & FAB_HACKED)) continue if(findtext(true_text, lowertext(recipe.name))) - addtimer(CALLBACK(src, /obj/machinery/fabricator/proc/try_queue_build, recipe, 1), 2 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/fabricator, try_queue_build), recipe, 1), 2 SECONDS) break ..() diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index 8baaf1b6ee7..eef97ba19ee 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -66,7 +66,7 @@ adding_mat_overlay.color = mat_colour material_overlays += adding_mat_overlay update_icon() - addtimer(CALLBACK(src, /obj/machinery/fabricator/proc/remove_mat_overlay, adding_mat_overlay), 1 SECOND) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/fabricator, remove_mat_overlay), adding_mat_overlay), 1 SECOND) if(stack_ref && stacks_used) stack_ref.use(stacks_used) diff --git a/code/modules/fabrication/fabricator_pipe.dm b/code/modules/fabrication/fabricator_pipe.dm index c3cd5055a16..a552ff4f1ac 100644 --- a/code/modules/fabrication/fabricator_pipe.dm +++ b/code/modules/fabrication/fabricator_pipe.dm @@ -50,7 +50,7 @@ base_type = /obj/machinery/fabricator/pipe/disposal //Allow you to drag-drop disposal pipes into it -/obj/machinery/fabricator/pipe/disposal/receive_mouse_drop(var/atom/dropping, mob/user) +/obj/machinery/fabricator/pipe/disposal/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && istype(dropping, /obj/structure/disposalconstruct)) qdel(dropping) diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm deleted file mode 100644 index 08cbc66cf1d..00000000000 --- a/code/modules/flufftext/Dreaming.dm +++ /dev/null @@ -1,18 +0,0 @@ - -/mob/living/carbon/proc/dream() - set waitfor = FALSE - dreaming = 1 - - for(var/i = rand(1,4),i > 0, i--) - to_chat(src, "... [pick(SSlore.dreams)] ...") - sleep(rand(40,70)) - if(!HAS_STATUS(src, STAT_PARA)) - dreaming = 0 - return - dreaming = 0 - -/mob/living/carbon/proc/handle_dreams() - if(client && !dreaming && prob(5)) - dream() - -/mob/living/carbon/var/dreaming = 0 diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index cee197930c0..8c6fda78496 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -3,7 +3,7 @@ desc = "A standard 16\" checkerboard. Well used." //Goddamn imperial system. icon = 'icons/obj/pieces.dmi' icon_state = "board" - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood var/num = 0 var/board_icons = list() @@ -164,65 +164,99 @@ //Checkers -/obj/item/chems/food/checker +/obj/item/checker name = "checker" desc = "It is plastic and shiny." icon = 'icons/obj/pieces.dmi' icon_state = "checker_black" w_class = ITEM_SIZE_TINY - center_of_mass = @"{'x':16,'y':16}" - nutriment_desc = list("a choking hazard" = 4) - nutriment_amt = 1 + center_of_mass = @'{"x":16,"y":16}' var/piece_color ="black" -/obj/item/chems/food/checker/Initialize() +// Override these to let people eat checkers. +/obj/item/checker/is_edible(mob/eater) + return TRUE + +/obj/item/checker/is_food_empty(mob/eater) + return FALSE + +/obj/item/checker/transfer_eaten_material(mob/eater, amount) + if(isliving(eater)) + var/mob/living/living_eater = eater + living_eater.get_ingested_reagents()?.add_reagent(/decl/material/solid/organic/plastic, 3) + +/obj/item/checker/play_feed_sound(mob/user, consumption_method = EATING_METHOD_EAT) + return + +/obj/item/checker/show_food_consumed_message(mob/user, mob/target) + return + +/obj/item/checker/show_feed_message_start(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You begin trying to swallow \the [target].")) + else + user.visible_message(SPAN_NOTICE("\The [user] attempts to force \the [target] to swallow \the [src]!")) + +/obj/item/checker/show_feed_message_end(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You swallow \the [src].")) + else + user.visible_message(SPAN_NOTICE("\The [user] forces \the [target] to swallow \the [src]!")) + +// End food overrides. + +/obj/item/checker/Initialize() . = ..() icon_state = "[name]_[piece_color]" name = "[piece_color] [name]" -/obj/item/chems/food/checker/red +/obj/item/checker/red piece_color ="red" //Chess -/obj/item/chems/food/checker/pawn +/obj/item/checker/pawn name = "pawn" desc = "How many pawns will die in your war?" -/obj/item/chems/food/checker/pawn/red +/obj/item/checker/pawn/red piece_color ="red" -/obj/item/chems/food/checker/knight +/obj/item/checker/knight name = "knight" desc = "The piece chess deserves, and needs to actually play." -/obj/item/chems/food/checker/knight/red +/obj/item/checker/knight/red piece_color ="red" -/obj/item/chems/food/checker/bishop +/obj/item/checker/bishop name = "bishop" desc = "What corruption occured, urging holy men to fight?" -/obj/item/chems/food/checker/bishop/red +/obj/item/checker/bishop/red piece_color ="red" -/obj/item/chems/food/checker/rook +/obj/item/checker/rook name = "rook" desc = "Representing ancient moving towers. So powerful and fast they were banned from wars, forever." -/obj/item/chems/food/checker/rook/red +/obj/item/checker/rook/red piece_color ="red" -/obj/item/chems/food/checker/queen +/obj/item/checker/queen name = "queen" desc = "A queen of battle and pain. She dances across the battlefield." -/obj/item/chems/food/checker/queen/red +/obj/item/checker/queen/red piece_color ="red" -/obj/item/chems/food/checker/king +/obj/item/checker/king name = "king" desc = "Why does a chess game end when the king dies?" -/obj/item/chems/food/checker/king/red +/obj/item/checker/king/red piece_color ="red" \ No newline at end of file diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 243342ab29c..b25438de00d 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -21,7 +21,7 @@ var/global/list/card_decks = list() /obj/item/deck w_class = ITEM_SIZE_SMALL icon = 'icons/obj/items/playing_cards.dmi' - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard var/list/cards = list() /obj/item/deck/Initialize() @@ -63,7 +63,7 @@ var/global/list/card_decks = list() name = "card box" desc = "A small leather case to show how classy you are compared to everyone else." icon_state = "card_holder" - material = /decl/material/solid/leather + material = /decl/material/solid/organic/leather /obj/item/deck/cards name = "deck of cards" @@ -264,7 +264,7 @@ var/global/list/card_decks = list() cards = shuffle(cards) user.visible_message("\The [user] shuffles [src].") -/obj/item/deck/handle_mouse_drop(atom/over, mob/user) +/obj/item/deck/handle_mouse_drop(atom/over, mob/user, params) if(over == user && (loc == user || in_range(src, user)) && user.get_empty_hand_slot()) user.put_in_hands(src) return TRUE @@ -276,7 +276,7 @@ var/global/list/card_decks = list() icon_state = "card_pack" icon = 'icons/obj/items/playing_cards.dmi' w_class = ITEM_SIZE_TINY - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard var/list/cards = list() @@ -297,7 +297,7 @@ var/global/list/card_decks = list() icon = 'icons/obj/items/playing_cards.dmi' icon_state = "empty" w_class = ITEM_SIZE_TINY - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard var/concealed = 0 var/list/datum/playingcard/cards = list() diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 2728becaa1c..73f2aade08a 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -1,5 +1,4 @@ -// This system is used to grab a ghost from observers with the required preferences -// and lack of bans set. See posibrain.dm for an example of how they are called/used. +// This system is used to grab a ghost from observers with the required preferences and lack of bans set. /decl/ghosttrap var/name var/minutes_since_death = 0 // If non-zero the ghost must have been dead for this many minutes to be allowed to spawn @@ -30,7 +29,7 @@ /decl/ghosttrap/proc/request_player(var/mob/target, var/request_string, var/request_timeout) if(request_timeout) LAZYSET(request_timeouts, target, world.time + request_timeout) - events_repository.register(/decl/observ/destroyed, target, src, /decl/ghosttrap/proc/unregister_target) + events_repository.register(/decl/observ/destroyed, target, src, TYPE_PROC_REF(/decl/ghosttrap, unregister_target)) else unregister_target(target) @@ -44,7 +43,7 @@ /decl/ghosttrap/proc/unregister_target(var/target) LAZYREMOVE(request_timeouts, target) - events_repository.unregister(/decl/observ/destroyed, target, src, /decl/ghosttrap/proc/unregister_target) + events_repository.unregister(/decl/observ/destroyed, target, src, TYPE_PROC_REF(/decl/ghosttrap, unregister_target)) // Handles a response to request_player(). /decl/ghosttrap/Topic(href, href_list) @@ -57,7 +56,7 @@ return if(candidate != usr) return - + var/timeout = LAZYACCESS(request_timeouts, target) if(!isnull(timeout) && world.time > timeout) to_chat(candidate, "This occupation request is no longer valid.") @@ -95,33 +94,42 @@ target.SetName(target.real_name) /*********************************** -* Positronic brains. * +* Computer intelligence cores. * ***********************************/ -/decl/ghosttrap/positronic_brain - name = "positronic brain" +/decl/ghosttrap/machine_intelligence + name = "machine intelligence" ban_checks = list("AI",ASSIGNMENT_ROBOT) - pref_check = "ghost_posibrain" - ghost_trap_message = "They are occupying a positronic brain now." + pref_check = "ghost_machine_intelligence" + ghost_trap_message = "They are occupying a computer intelligence core now." + +/decl/ghosttrap/machine_intelligence/transfer_personality(mob/candidate, mob/target) + if(assess_candidate(candidate)) + + var/obj/item/organ/internal/brain/robotic/brain = target.loc?.loc + if(!istype(brain)) + return FALSE + + brain.transfer_key_to_brainmob(candidate, update_brainmob = FALSE) + brain.searching = FALSE + brain.update_icon() + announce_ghost_joinleave(candidate, 0, "[ghost_trap_message]") + + var/mob/living/brainmob = brain.get_brainmob(create_if_missing = TRUE) + if(brainmob) + welcome_candidate(brainmob) + return TRUE -/decl/ghosttrap/positronic_brain/forced(var/mob/user) - var/obj/item/organ/internal/posibrain/brain = new(get_turf(user)) - if(!brain.brainmob) - brain.init() - request_player(brain.brainmob, "Someone is requesting a personality for a positronic brain.", 60 SECONDS) +/decl/ghosttrap/machine_intelligence/forced(var/mob/user) + var/obj/item/organ/internal/brain/robotic/brain = new(get_turf(user)) + request_player(brain.get_brainmob(create_if_missing = TRUE), "Someone is requesting a player for a machine intelligence.", 60 SECONDS) -/decl/ghosttrap/positronic_brain/welcome_candidate(var/mob/target) - to_chat(target, "You are a positronic brain, brought into existence on [station_name()].") +/decl/ghosttrap/machine_intelligence/welcome_candidate(var/mob/target) + to_chat(target, "You are a machine intelligence, brought into existence on [station_name()].") to_chat(target, "As a synthetic intelligence, you answer to all crewmembers, as well as the AI.") to_chat(target, "Remember, the purpose of your existence is to serve the crew and the [station_name()]. Above all else, do no harm.") to_chat(target, "Use say [target.get_language_prefix()]b to speak to other artificial intelligences.") var/turf/T = get_turf(target) - var/obj/item/organ/internal/posibrain/P = target.loc - T.visible_message("\The [P] chimes quietly.") - if(!istype(P)) //wat - return - P.searching = 0 - P.SetName("positronic brain ([P.brainmob.name])") - P.update_icon() + T.visible_message(SPAN_NOTICE("\The [target] beeps loudly.")) /*********************************** * Walking mushrooms and such. * @@ -131,7 +139,7 @@ ban_checks = list("Botany Roles") pref_check = "ghost_plant" ghost_trap_message = "They are occupying a living plant now." - + /decl/ghosttrap/sentient_plant/forced(var/mob/user) request_player(new /mob/living/simple_animal/mushroom(get_turf(user)), "Someone is harvesting a walking mushroom.", 15 SECONDS) diff --git a/code/modules/goals/_goal.dm b/code/modules/goals/_goal.dm index 41a179c1a9b..fbcf0e55f67 100644 --- a/code/modules/goals/_goal.dm +++ b/code/modules/goals/_goal.dm @@ -8,7 +8,7 @@ /datum/goal/New(var/_owner) owner = _owner - events_repository.register(/decl/observ/destroyed, owner, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/destroyed, owner, src, TYPE_PROC_REF(/datum, qdel_self)) if(istype(owner, /datum/mind)) var/datum/mind/mind = owner LAZYADD(mind.goals, src) diff --git a/code/modules/goals/definitions/department_clerical.dm b/code/modules/goals/definitions/department_clerical.dm index 22cb85f0d03..0f5ac8c07d8 100644 --- a/code/modules/goals/definitions/department_clerical.dm +++ b/code/modules/goals/definitions/department_clerical.dm @@ -25,21 +25,21 @@ ..() -/datum/goal/department/paperwork/proc/get_spawn_turfs() +/datum/goal/department/paperwork/proc/get_paper_spawn_turfs() return -/datum/goal/department/paperwork/proc/get_end_areas() +/datum/goal/department/paperwork/proc/get_paper_end_areas() return /datum/goal/department/paperwork/try_initialize() - var/list/start_candidates = get_spawn_turfs() + var/list/start_candidates = get_paper_spawn_turfs() if(!length(start_candidates)) PRINT_STACK_TRACE("Paperwork goal [type] initialized with no spawn landmarks mapped!") SSgoals.pending_goals -= src return FALSE - var/list/end_candidates = get_end_areas() + var/list/end_candidates = get_paper_end_areas() if(!length(end_candidates)) PRINT_STACK_TRACE("Paperwork goal [type] initialized with no end landmarks mapped!") SSgoals.pending_goals -= src @@ -100,7 +100,7 @@ desc = "This densely typed sheaf of documents is filled with legalese and jargon. You can't make heads or tails of them." icon = 'icons/obj/goal_paperwork.dmi' icon_state = "generic" - material = /decl/material/solid/cardboard //#TODO: replace with paper + material = /decl/material/solid/organic/paper var/datum/goal/department/paperwork/associated_goal var/list/all_signatories diff --git a/code/modules/goals/definitions/personal_achievement_movement.dm b/code/modules/goals/definitions/personal_achievement_movement.dm index 7f5fb6f69bc..5e1e650a0c3 100644 --- a/code/modules/goals/definitions/personal_achievement_movement.dm +++ b/code/modules/goals/definitions/personal_achievement_movement.dm @@ -3,7 +3,7 @@ ..() if(owner) var/datum/mind/mind = owner - events_repository.register(/decl/observ/moved, mind.current, src, .proc/owner_moved) + events_repository.register(/decl/observ/moved, mind.current, src, PROC_REF(owner_moved)) /datum/goal/movement/proc/owner_moved() return @@ -40,7 +40,7 @@ /datum/goal/movement/walk/check_success() return (steps >= required_steps) - + /datum/goal/movement/walk/update_strings() description = "Stave off microgravity muscle atrophy by walking at least [required_steps] step\s this shift." diff --git a/code/modules/hallucinations/_hallucination.dm b/code/modules/hallucinations/_hallucination.dm new file mode 100644 index 00000000000..399fd5dfc0e --- /dev/null +++ b/code/modules/hallucinations/_hallucination.dm @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +//Hallucination effects datums +////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/hallucination + var/mob/living/holder + var/allow_duplicates = 1 + var/duration = 0 + var/min_power = 0 //at what levels of hallucination power mobs should get it + var/max_power = INFINITY + var/activated = FALSE + +/datum/hallucination/proc/start() + SHOULD_CALL_PARENT(TRUE) + activated = TRUE + +/datum/hallucination/proc/end() + SHOULD_CALL_PARENT(TRUE) + activated = FALSE + +/datum/hallucination/proc/can_affect(var/mob/living/victim) + if(!victim.client) + return FALSE + if(min_power > victim.hallucination_power) + return FALSE + if(max_power < victim.hallucination_power) + return FALSE + if(!allow_duplicates && (locate(type) in victim._hallucinations)) + return FALSE + return TRUE + +/datum/hallucination/Destroy() + if(holder) + LAZYREMOVE(holder._hallucinations, src) + holder = null + if(activated) + end() + return ..() + +/datum/hallucination/proc/activate_hallucination() + set waitfor = FALSE + if(!holder || !holder.client || activated) + return + LAZYADD(holder._hallucinations, src) + start() + sleep(duration) + if(!QDELETED(src)) + qdel(src) diff --git a/code/modules/hallucinations/hallucination_fakeattack.dm b/code/modules/hallucinations/hallucination_fakeattack.dm new file mode 100644 index 00000000000..70ba9d36a04 --- /dev/null +++ b/code/modules/hallucinations/hallucination_fakeattack.dm @@ -0,0 +1,20 @@ +//Fake attack +/datum/hallucination/fakeattack + min_power = 30 + +/datum/hallucination/fakeattack/can_affect(var/mob/living/victim) + . = ..() && (locate(/mob/living) in oview(victim,1)) + +/datum/hallucination/fakeattack/start() + . = ..() + for(var/mob/living/assailant in oview(holder,1)) + to_chat(holder, SPAN_DANGER("\The [assailant] has punched \the [holder]!")) + holder.playsound_local(get_turf(holder),"punch",50) + +//Fake injection +/datum/hallucination/fakeattack/hypo + min_power = 30 + +/datum/hallucination/fakeattack/hypo/start() + . = ..() + to_chat(holder, SPAN_NOTICE("You feel a tiny prick!")) diff --git a/code/modules/hallucinations/hallucination_gunfire.dm b/code/modules/hallucinations/hallucination_gunfire.dm new file mode 100644 index 00000000000..d41d6289e65 --- /dev/null +++ b/code/modules/hallucinations/hallucination_gunfire.dm @@ -0,0 +1,31 @@ +//Hearing someone being shot twice +/datum/hallucination/gunfire + duration = 15 + min_power = 30 + var/gunshot + var/turf/origin + var/static/list/gunshot_sounds = list( + 'sound/weapons/gunshot/gunshot_strong.ogg', + 'sound/weapons/gunshot/gunshot2.ogg', + 'sound/weapons/gunshot/shotgun.ogg', + 'sound/weapons/gunshot/gunshot.ogg', + 'sound/weapons/Taser.ogg' + ) + +/datum/hallucination/gunfire/start() + . = ..() + gunshot = pick(gunshot_sounds) + var/turf/holder_turf = get_turf(holder) + if(isturf(holder_turf)) + origin = locate(holder_turf.x + rand(4,8), holder_turf.y + rand(4,8), holder_turf.z) + if(origin) + holder.playsound_local(origin, gunshot, 50) + +/datum/hallucination/gunfire/end() + . = ..() + if(holder && origin) + holder.playsound_local(origin, gunshot, 50) + +/datum/hallucination/gunfire/Destroy() + origin = null + return ..() \ No newline at end of file diff --git a/code/modules/hallucinations/hallucination_mirage.dm b/code/modules/hallucinations/hallucination_mirage.dm new file mode 100644 index 00000000000..279e8db3594 --- /dev/null +++ b/code/modules/hallucinations/hallucination_mirage.dm @@ -0,0 +1,76 @@ +//Seeing stuff +/datum/hallucination/mirage + duration = 30 SECONDS + max_power = 30 + var/number = 1 + var/list/things = list() //list of images to display + var/static/list/trash_states = icon_states('icons/obj/trash.dmi') + +/datum/hallucination/mirage/proc/generate_mirage() + return image('icons/obj/trash.dmi', pick(trash_states), layer = BELOW_TABLE_LAYER) + +/datum/hallucination/mirage/start() + . = ..() + var/list/possible_points = list() + for(var/turf/simulated/floor/F in view(holder, world.view+1)) + possible_points += F + if(possible_points.len) + for(var/i = 1 to number) + var/image/thing = generate_mirage() + things += thing + thing.loc = pick(possible_points) + if(holder?.client && length(things)) + holder.client.images += things + +/datum/hallucination/mirage/end() + if(holder?.client) + holder.client.images -= things + return ..() + +//Blood and aftermath of firefight +/datum/hallucination/mirage/carnage + min_power = 50 + number = 10 + var/static/list/carnage_states = list( + "mfloor1", + "mfloor2", + "mfloor3", + "mfloor4", + "mfloor5", + "mfloor6", + "mfloor7" + ) + +/datum/hallucination/mirage/carnage/generate_mirage() + var/image/I + if(prob(50)) + I = image('icons/effects/blood.dmi', pick(carnage_states), layer = BELOW_TABLE_LAYER) + I.color = COLOR_BLOOD_HUMAN + else + I = image('icons/obj/ammo.dmi', "s-casing-spent", layer = BELOW_TABLE_LAYER) + I.layer = BELOW_TABLE_LAYER + I.dir = pick(global.alldirs) + I.pixel_x = rand(-10,10) + I.pixel_y = rand(-10,10) + return I + +//LOADSEMONEY +/datum/hallucination/mirage/money + min_power = 20 + max_power = 45 + number = 2 + var/static/obj/item/cash/cash + +/datum/hallucination/mirage/money/New() + if(!cash) + cash = new /obj/item/cash/c500 + cash.update_icon() + cash.compile_overlays() + ..() + +/datum/hallucination/mirage/money/generate_mirage() + var/image/I = new + I.appearance = cash + I.layer = BELOW_TABLE_LAYER + qdel(cash) + return I diff --git a/code/modules/hallucinations/hallucination_skitters.dm b/code/modules/hallucinations/hallucination_skitters.dm new file mode 100644 index 00000000000..2ab7f1fdf35 --- /dev/null +++ b/code/modules/hallucinations/hallucination_skitters.dm @@ -0,0 +1,4 @@ +//Spiderling skitters +/datum/hallucination/skitter/start() + . = ..() + to_chat(holder, SPAN_NOTICE("The spiderling skitters[pick(" away"," around","")].")) diff --git a/code/modules/hallucinations/hallucination_sound.dm b/code/modules/hallucinations/hallucination_sound.dm new file mode 100644 index 00000000000..82e2389713b --- /dev/null +++ b/code/modules/hallucinations/hallucination_sound.dm @@ -0,0 +1,71 @@ +//Playing a random sound +/datum/hallucination/imagined_sound/proc/get_imagined_sounds() + var/static/list/sounds = list( + 'sound/machines/airlock.ogg', + 'sound/effects/explosionfar.ogg', + 'sound/machines/windowdoor.ogg', + 'sound/machines/twobeep.ogg' + ) + return sounds + +/datum/hallucination/imagined_sound/start() + . = ..() + var/turf/holder_turf = get_turf(holder) + if(holder_turf) + holder_turf = locate(holder_turf.x + rand(6,11), holder_turf.y + rand(6,11), holder_turf.z) + if(holder_turf) + holder.playsound_local(holder_turf, pick(get_imagined_sounds()) ,70) + +/datum/hallucination/imagined_sound/tools/get_imagined_sounds() + var/static/list/imagined_sounds = list( + 'sound/items/Ratchet.ogg', + 'sound/items/Welder.ogg', + 'sound/items/Crowbar.ogg', + 'sound/items/Screwdriver.ogg' + ) + return imagined_sounds + +/datum/hallucination/imagined_sound/danger + min_power = 30 + +/datum/hallucination/imagined_sound/danger/get_imagined_sounds() + var/static/list/imagined_sounds = list( + 'sound/effects/Explosion1.ogg', + 'sound/effects/Explosion2.ogg', + 'sound/effects/Glassbr1.ogg', + 'sound/effects/Glassbr2.ogg', + 'sound/effects/Glassbr3.ogg', + 'sound/weapons/smash.ogg' + ) + return imagined_sounds + +/datum/hallucination/imagined_sound/spooky + min_power = 50 + +/datum/hallucination/imagined_sound/spooky/get_imagined_sounds() + var/static/list/imagined_sounds = list( + 'sound/effects/ghost.ogg', + 'sound/effects/ghost2.ogg', + 'sound/effects/Heart Beat.ogg', + 'sound/effects/screech.ogg', + 'sound/hallucinations/behind_you1.ogg', + 'sound/hallucinations/behind_you2.ogg', + 'sound/hallucinations/far_noise.ogg', + 'sound/hallucinations/growl1.ogg', + 'sound/hallucinations/growl2.ogg', + 'sound/hallucinations/growl3.ogg', + 'sound/hallucinations/im_here1.ogg', + 'sound/hallucinations/im_here2.ogg', + 'sound/hallucinations/i_see_you1.ogg', + 'sound/hallucinations/i_see_you2.ogg', + 'sound/hallucinations/look_up1.ogg', + 'sound/hallucinations/look_up2.ogg', + 'sound/hallucinations/over_here1.ogg', + 'sound/hallucinations/over_here2.ogg', + 'sound/hallucinations/over_here3.ogg', + 'sound/hallucinations/turn_around1.ogg', + 'sound/hallucinations/turn_around2.ogg', + 'sound/hallucinations/veryfar_noise.ogg', + 'sound/hallucinations/wail.ogg' + ) + return imagined_sounds diff --git a/code/modules/hallucinations/hallucination_spiderbabies.dm b/code/modules/hallucinations/hallucination_spiderbabies.dm new file mode 100644 index 00000000000..f7b4b3bb94a --- /dev/null +++ b/code/modules/hallucinations/hallucination_spiderbabies.dm @@ -0,0 +1,11 @@ +//Spiders in your body +/datum/hallucination/spiderbabies + min_power = 40 + +/datum/hallucination/spiderbabies/start() + . = ..() + var/list/limbs = holder.get_external_organs() + if(!LAZYLEN(limbs)) + return + var/obj/O = pick(limbs) + to_chat(holder, SPAN_WARNING("You feel something [pick("moving","squirming","skittering")] inside of your [O.name]!")) diff --git a/code/modules/hallucinations/hallucination_talking.dm b/code/modules/hallucinations/hallucination_talking.dm new file mode 100644 index 00000000000..a472010a2f3 --- /dev/null +++ b/code/modules/hallucinations/hallucination_talking.dm @@ -0,0 +1,41 @@ +//Hearing someone talking to/about you. +/datum/hallucination/talking/can_affect(var/mob/living/victim) + return ..() && (locate(/mob/living) in oview(victim)) + +/datum/hallucination/talking/start() + . = ..() + var/sanity = 5 //even insanity needs some sanity + for(var/mob/living/talker in oview(holder)) + if(talker.stat) + continue + var/message + if(prob(80)) + var/list/names = list() + var/lastname = copytext(holder.real_name, findtext(holder.real_name, " ")+1) + var/firstname = copytext(holder.real_name, 1, findtext(holder.real_name, " ")) + if(lastname) names += lastname + if(firstname) names += firstname + if(!names.len) + names += holder.real_name + var/add = prob(20) ? ", [pick(names)]" : "" + var/list/phrases = list("[prob(50) ? "Hey, " : ""][pick(names)]!","[prob(50) ? "Hey, " : ""][pick(names)]?","Get out[add]!","Go away[add].","What are you doing[add]?","Where's your ID[add]?") + if(holder.hallucination_power > 50) + phrases += list("What did you come here for[add]?","Don't touch me[add].","You're not getting out of here[add].", "You are a failure, [pick(names)].","Just kill yourself already, [pick(names)].","Put on some clothes[add].","Take off your clothes[add].") + message = pick(phrases) + to_chat(holder,"[talker.name] [holder.say_quote(message)], \"[message]\"") + else + to_chat(holder,"[talker.name] points at [holder.name]") + to_chat(holder,"[talker.name] says something softly.") + + var/speech_state = holder.check_speech_punctuation_state(message) + if(speech_state) + var/image/speech_bubble = image('icons/mob/talk.dmi', talker, speech_state) + addtimer(CALLBACK(src, PROC_REF(qdel_image), speech_bubble), 3 SECONDS) + show_image(holder, speech_bubble) + + sanity-- //don't spam them in very populated rooms. + if(!sanity) + break + +/datum/hallucination/talking/proc/qdel_image(var/image/speech_bubble) + qdel(speech_bubble) diff --git a/code/modules/hallucinations/hallucination_telepathy.dm b/code/modules/hallucinations/hallucination_telepathy.dm new file mode 100644 index 00000000000..36a982c5a36 --- /dev/null +++ b/code/modules/hallucinations/hallucination_telepathy.dm @@ -0,0 +1,42 @@ +//Fake telepathy +/datum/hallucination/telepathy + allow_duplicates = 0 + duration = 20 MINUTES + +/datum/hallucination/telepathy/start() + . = ..() + to_chat(holder, SPAN_NOTICE("You expand your mind outwards.")) + holder.verbs += /mob/living/carbon/human/proc/fakeremotesay + +/datum/hallucination/telepathy/end() + . = ..() + if(holder) + holder.verbs -= /mob/living/carbon/human/proc/fakeremotesay + +/mob/living/carbon/human/proc/fakeremotesay() + set name = "Telepathic Message" + set category = "Superpower" + + if(!hallucination_power) + src.verbs -= /mob/living/carbon/human/proc/fakeremotesay + return + + if(stat) + to_chat(usr, SPAN_WARNING("You're not in any state to use your powers right now!")) + return + + if(has_chemical_effect(CE_MIND, 1)) + to_chat(usr, SPAN_WARNING("Chemicals in your blood prevent you from using your power!")) + + var/list/creatures = list() + for(var/mob/living/carbon/C in SSmobs.mob_list) + creatures += C + creatures -= usr + var/mob/target = input("Who do you want to project your mind to?") as null|anything in creatures + if (isnull(target)) + return + + var/msg = sanitize(input(usr, "What do you wish to transmit")) + show_message(SPAN_NOTICE("You project your mind into [target.name]: \"[msg]\"")) + if(!stat && prob(20)) + say(msg) diff --git a/code/modules/holidays/_holiday.dm b/code/modules/holidays/_holiday.dm index 8e64c191437..ed04429c955 100644 --- a/code/modules/holidays/_holiday.dm +++ b/code/modules/holidays/_holiday.dm @@ -25,10 +25,8 @@ var/global/datum/holiday/current_holiday /proc/set_holiday_data(var/datum/holiday/holiday_data, var/refresh_station_name = FALSE) if(istext(holiday_data)) holiday_data = new(list("name" = holiday_data)) - if(!holiday_data || !istype(holiday_data)) - return - global.current_holiday = holiday_data + if(istype(holiday_data)) + global.current_holiday = holiday_data if(refresh_station_name) - global.using_map.station_name = null - station_name() + global.using_map.station_name = initial(global.using_map.station_name) world.update_status() diff --git a/code/modules/holidays/holiday_hook.dm b/code/modules/holidays/holiday_hook.dm index 766ef3fb3b7..6b6870c5bb0 100644 --- a/code/modules/holidays/holiday_hook.dm +++ b/code/modules/holidays/holiday_hook.dm @@ -1,27 +1,37 @@ -//Uncommenting ALLOW_HOLIDAYS in config.txt will enable this hook. +//Uncommenting ALLOW_HOLIDAYS in configuration will enable this hook. /hook/startup/proc/updateHoliday() - if(config?.allow_holidays) - var/list/holidays = cached_json_decode(safe_file2text("config/holidays.json"), FALSE) - if(length(holidays)) - - var/c_year = text2num(time2text(world.timeofday, "YY")) - var/c_month = text2num(time2text(world.timeofday, "MM")) - var/c_day = text2num(time2text(world.timeofday, "DD")) - var/c_weekday = lowertext(time2text(world.timeofday, "DDD")) - - for(var/list/holiday_data in holidays) - - var/h_year = holiday_data["year"] - var/h_month = holiday_data["month"] - var/h_day = holiday_data["day"] - var/h_weekday = holiday_data["weekday"] - - if((isnull(h_year) || h_year == c_year) && \ - (isnull(h_month) || h_month == c_month) && \ - (isnull(h_day) || h_day == c_day) && \ - (isnull(h_weekday) || h_weekday == c_weekday)) - var/holiday_path = text2path(holiday_data["path"]) || /datum/holiday - set_holiday_data(new holiday_path(holiday_data)) - break - - return 1 \ No newline at end of file + update_holiday() + return TRUE + +/proc/update_holiday() + + if(!get_config_value(/decl/config/toggle/allow_holidays)) + set_holiday_data(null, TRUE) + return FALSE + + var/list/holidays = cached_json_decode(safe_file2text("config/holidays.json"), FALSE) + if(!length(holidays)) + set_holiday_data(null, TRUE) + return FALSE + + var/c_year = text2num(time2text(world.timeofday, "YY")) + var/c_month = text2num(time2text(world.timeofday, "MM")) + var/c_day = text2num(time2text(world.timeofday, "DD")) + var/c_weekday = lowertext(time2text(world.timeofday, "DDD")) + + for(var/list/holiday_data in holidays) + + var/h_year = holiday_data["year"] + var/h_month = holiday_data["month"] + var/h_day = holiday_data["day"] + var/h_weekday = holiday_data["weekday"] + + if((isnull(h_year) || h_year == c_year) && \ + (isnull(h_month) || h_month == c_month) && \ + (isnull(h_day) || h_day == c_day) && \ + (isnull(h_weekday) || h_weekday == c_weekday)) + var/holiday_path = text2path(holiday_data["path"]) || /datum/holiday + set_holiday_data(new holiday_path(holiday_data)) + return TRUE + + return FALSE diff --git a/code/modules/holidays/holiday_name.dm b/code/modules/holidays/holiday_name.dm index b682a49162a..e07e9776a40 100644 --- a/code/modules/holidays/holiday_name.dm +++ b/code/modules/holidays/holiday_name.dm @@ -5,11 +5,13 @@ set category = "Fun" set desc = "Override the default holiday." - if(!check_rights(R_SERVER)) + if(!check_rights(R_SERVER)) return T = sanitize(T, MAX_NAME_LEN) if(T) + if(get_config_value(/decl/config/toggle/allow_holidays)) + set_config_value(/decl/config/toggle/allow_holidays, TRUE) set_holiday_data(T, refresh_station_name = TRUE) to_world("

    [global.current_holiday.announcement]

    ") message_admins(SPAN_NOTICE("ADMIN: Event: [key_name(src)] force-set the holiday to \"[global.current_holiday.name]\"")) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 1cdbbed9a10..51a5e16fb77 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -67,7 +67,7 @@ dat += "([prog])
    " dat += "
    " - dat += "(Turn Off)
    " + dat += "(Turn Off)
    " dat += "
    " dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
    " @@ -198,7 +198,7 @@ if(!checkInteg(linkedholodeck)) damaged = 1 - loadProgram(global.using_map.holodeck_programs["turnoff"], 0) + loadProgram(global.using_map.holodeck_programs[global.using_map.holodeck_default_program[programs_list_id] || "turnoff"], 0) active = 0 update_use_power(POWER_USE_IDLE) visible_message("The holodeck overloads!", null, "You hear electricity arcing!", range = 10) @@ -230,9 +230,9 @@ //Why is it called toggle if it doesn't toggle? /obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0) if(toggleOn) - loadProgram(global.using_map.holodeck_programs["emptycourt"], 0) + loadProgram(global.using_map.holodeck_programs[global.using_map.holodeck_default_program[programs_list_id] || "emptycourt"], 0) else - loadProgram(global.using_map.holodeck_programs["turnoff"], 0) + loadProgram(global.using_map.holodeck_programs[global.using_map.holodeck_default_program[programs_list_id] || "turnoff"], 0) if(!linkedholodeck.has_gravity) linkedholodeck.gravitychange(1) @@ -324,7 +324,7 @@ /obj/machinery/computer/HolodeckControl/proc/emergencyShutdown() //Turn it back to the regular non-holographic room - loadProgram(global.using_map.holodeck_programs["turnoff"], 0) + loadProgram(global.using_map.holodeck_programs[global.using_map.holodeck_default_program[programs_list_id] || "turnoff"], 0) if(!linkedholodeck.has_gravity) linkedholodeck.gravitychange(1,linkedholodeck) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index e6df389246d..3ef581d0c4d 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -98,6 +98,7 @@ icon = 'icons/misc/beach.dmi' base_icon = 'icons/misc/beach.dmi' initial_flooring = null + abstract_type = /turf/simulated/floor/holofloor/beach /turf/simulated/floor/holofloor/beach/sand name = "sand" @@ -206,9 +207,15 @@ visible_message("[src] fades away as it shatters!") qdel(src) -/obj/structure/bed/chair/holochair/attackby(obj/item/W, mob/user) - if(IS_WRENCH(W)) - to_chat(user, ("It's a holochair, you can't dismantle it!")) +/obj/structure/bed/holobed + tool_interaction_flags = 0 + holographic = TRUE + material = /decl/material/solid/metal/aluminium/holographic + +/obj/structure/bed/chair/holochair + tool_interaction_flags = 0 + holographic = TRUE + material = /decl/material/solid/metal/aluminium/holographic /obj/item/holo damtype = PAIN @@ -225,7 +232,7 @@ throw_range = 5 throwforce = 0 w_class = ITEM_SIZE_SMALL - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_BLOOD + atom_flags = ATOM_FLAG_NO_BLOOD base_parry_chance = 50 var/active = 0 var/item_color @@ -270,19 +277,10 @@ return //BASKETBALL OBJECTS - -/obj/item/beach_ball/holoball - icon = 'icons/obj/basketball.dmi' - icon_state = "basketball" - name = "basketball" - item_state = "basketball" - desc = "Here's your chance, do your dance at the Space Jam." - w_class = ITEM_SIZE_LARGE //Stops people from hiding it in their pockets - /obj/structure/holohoop name = "basketball hoop" desc = "Boom, Shakalaka!" - icon = 'icons/obj/basketball.dmi' + icon = 'icons/obj/structures/basketball.dmi' icon_state = "hoop" anchored = TRUE density = TRUE @@ -303,19 +301,10 @@ return ..(mover, target, height, air_group) //VOLEYBALL OBJECTS - -/obj/item/beach_ball/holovolleyball - icon = 'icons/obj/basketball.dmi' - icon_state = "volleyball" - name = "voleyball" - item_state = "volleyball" - desc = "You can be my wingman anytime." - w_class = ITEM_SIZE_LARGE //Stops people from hiding it in their pockets - /obj/structure/holonet name = "net" desc = "Bullshit, you can be mine!" - icon = 'icons/obj/basketball.dmi' + icon = 'icons/obj/structures/volleyball.dmi' icon_state = "volleynet_mid" density = TRUE anchored = TRUE diff --git a/code/modules/holomap/holomap.dm b/code/modules/holomap/holomap.dm index 5d6fe03e1bf..932c0b20048 100644 --- a/code/modules/holomap/holomap.dm +++ b/code/modules/holomap/holomap.dm @@ -13,7 +13,7 @@ construct_state = /decl/machine_construction/default/panel_closed base_type = /obj/machinery/holomap layer = ABOVE_WINDOW_LAYER // Above windows. - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/light_power_on = 1 var/light_range_on = 2 @@ -99,8 +99,8 @@ user.client.images |= holomap_datum.station_map watching_mob = user - events_repository.register(/decl/observ/moved, watching_mob, src, /obj/machinery/holomap/proc/checkPosition) - events_repository.register(/decl/observ/destroyed, watching_mob, src, /obj/machinery/holomap/proc/stopWatching) + events_repository.register(/decl/observ/moved, watching_mob, src, TYPE_PROC_REF(/obj/machinery/holomap, checkPosition)) + events_repository.register(/decl/observ/destroyed, watching_mob, src, TYPE_PROC_REF(/obj/machinery/holomap, stopWatching)) update_use_power(POWER_USE_ACTIVE) if(bogus) @@ -124,7 +124,7 @@ if(watching_mob.client) animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING) var/mob/M = watching_mob - addtimer(CALLBACK(src, .proc/clear_image, M, holomap_datum.station_map), 5, TIMER_CLIENT_TIME)//we give it time to fade out + addtimer(CALLBACK(src, PROC_REF(clear_image), M, holomap_datum.station_map), 5, TIMER_CLIENT_TIME)//we give it time to fade out events_repository.unregister(/decl/observ/moved, watching_mob, src) events_repository.unregister(/decl/observ/destroyed, watching_mob, src) watching_mob = null @@ -174,99 +174,13 @@ if(prob(25)) set_broken() -/obj/screen/levelselect - icon = 'icons/misc/mark.dmi' - layer = HUD_ITEM_LAYER - var/active = TRUE - var/datum/station_holomap/owner = null - -/obj/screen/levelselect/Initialize(mapload, datum/station_holomap/_owner) - . = ..() - owner = _owner - -/obj/screen/levelselect/Click() - return (!usr.incapacitated() && !isghost(usr)) -/obj/screen/levelselect/up - icon_state = "fup" - -/obj/screen/levelselect/up/Click() - if(..()) - if(owner) - owner.set_level(owner.displayed_level - 1) - -/obj/screen/levelselect/down - icon_state = "fdn" - -/obj/screen/levelselect/down/Click() - if(..()) - if(owner) - owner.set_level(owner.displayed_level + 1) - -/obj/screen/legend - icon = null - maptext_height = 128 - maptext_width = 128 - layer = HUD_ITEM_LAYER - pixel_x = HOLOMAP_LEGEND_X - appearance_flags = DEFAULT_APPEARANCE_FLAGS | RESET_COLOR - var/saved_color - var/datum/station_holomap/owner = null - var/has_areas = FALSE - -/obj/screen/legend/cursor - icon = 'icons/misc/holomap_markers.dmi' - icon_state = "you" - maptext_x = 11 - pixel_x = HOLOMAP_LEGEND_X - 3 - has_areas = TRUE - -/obj/screen/legend/Initialize(mapload, map_color, text) - . = ..() - saved_color = map_color - maptext = "[text]" - alpha = 255 - -/obj/screen/legend/Click(location, control, params) - if(!usr.incapacitated() && !isghost(usr)) - if(istype(owner)) - owner.legend_select(src) - -/obj/screen/legend/proc/Setup(z_level) - has_areas = FALSE - //Get the areas for this z level and mark if we're empty - overlays.Cut() - for(var/area/A in SSminimap.holomaps[z_level].holomap_areas) - if(A.holomap_color == saved_color) - var/image/area = image(SSminimap.holomaps[z_level].holomap_areas[A]) - area.pixel_x = ((HOLOMAP_ICON_SIZE / 2) - WORLD_CENTER_X) - pixel_x - area.pixel_y = ((HOLOMAP_ICON_SIZE / 2) - WORLD_CENTER_Y) - pixel_y - overlays += area - has_areas = TRUE - -//What happens when we are clicked on / when another is clicked on -/obj/screen/legend/proc/Select() - //Start blinking - animate(src, alpha = 0, time = 2, loop = -1, easing = JUMP_EASING | EASE_IN | EASE_OUT) - animate(alpha = 254, time = 2, loop = -1, easing = JUMP_EASING | EASE_IN | EASE_OUT) - -/obj/screen/legend/proc/Deselect() - //Stop blinking - animate(src, flags = ANIMATION_END_NOW) - -//Cursor doesnt do anything specific. -/obj/screen/legend/cursor/Setup() - -/obj/screen/legend/cursor/Select() - -/obj/screen/legend/cursor/Deselect() - // Simple datum to keep track of a running holomap. Each machine capable of displaying the holomap will have one. /datum/station_holomap var/image/station_map var/image/cursor - var/list/obj/screen/legend/legend - var/list/obj/screen/maptexts - var/list/obj/screen/levelselect/lbuttons + var/list/obj/screen/holomap_legend/legend + var/list/obj/screen/holomap_text/maptexts + var/list/obj/screen/holomap_level_select/lbuttons var/list/image/levels var/list/z_levels var/z = -1 @@ -293,17 +207,17 @@ if(!LAZYLEN(legend) || reinit) QDEL_LIST_ASSOC_VAL(legend) legend = list( - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_COMMAND, "â–  Command"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_SECURITY, "â–  Security"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_MEDICAL, "â–  Medical"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_SCIENCE, "â–  Research"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_EXPLORATION, "â–  Exploration"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_ENGINEERING, "â–  Engineering"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_CARGO, "â–  Supply"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_AIRLOCK, "â–  Airlock"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_ESCAPE, "â–  Escape"), - new /obj/screen/legend(null, HOLOMAP_AREACOLOR_CREW, "â–  Crew"), - new /obj/screen/legend/cursor(null, HOLOMAP_AREACOLOR_BASE, "You are here") + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_COMMAND, "â–  Command"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_SECURITY, "â–  Security"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_MEDICAL, "â–  Medical"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_SCIENCE, "â–  Research"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_EXPLORATION, "â–  Exploration"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_ENGINEERING, "â–  Engineering"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_CARGO, "â–  Supply"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_AIRLOCK, "â–  Airlock"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_ESCAPE, "â–  Escape"), + new /obj/screen/holomap_legend(null, null, null, null, null, HOLOMAP_AREACOLOR_CREW, "â–  Crew"), + new /obj/screen/holomap_legend/cursor(null, null, null, null, null, HOLOMAP_AREACOLOR_BASE, "You are here") ) if(reinit) QDEL_NULL_LIST(lbuttons) @@ -333,8 +247,8 @@ if(z_count > 1) if(!LAZYLEN(lbuttons)) //Add the buttons for switching levels - LAZYADD(lbuttons, new /obj/screen/levelselect/up(null, src)) - LAZYADD(lbuttons, new /obj/screen/levelselect/down(null, src)) + LAZYADD(lbuttons, new /obj/screen/holomap_level_select/up(null, null, null, null, null, src)) + LAZYADD(lbuttons, new /obj/screen/holomap_level_select/down(null, null, null, null, null, src)) lbuttons[1].pixel_y = HOLOMAP_MARGIN - 22 lbuttons[2].pixel_y = HOLOMAP_MARGIN + 5 lbuttons[1].pixel_x = 254 @@ -358,12 +272,8 @@ //LAZYADD(levels, map_image) LAZYSET(levels, "[O.map_z[level]]", map_image) - var/obj/screen/maptext_overlay = new(null) - maptext_overlay.icon = null - maptext_overlay.layer = HUD_ITEM_LAYER - maptext_overlay.appearance_flags |= RESET_COLOR + var/obj/screen/holomap_text/maptext_overlay = new(null) maptext_overlay.maptext = STYLE_SMALLFONTS_OUTLINE("
    LEVEL [level-1]
    ", 7, COLOR_WHITE, COLOR_BLACK) - maptext_overlay.maptext_width = 96 maptext_overlay.pixel_x = (HOLOMAP_ICON_SIZE / 2) - (maptext_overlay.maptext_width / 2) maptext_overlay.pixel_y = HOLOMAP_MARGIN @@ -389,8 +299,8 @@ //Fix legend position var/pixel_y = HOLOMAP_LEGEND_Y - for(var/obj/screen/legend/element in legend) - element.owner = src + for(var/obj/screen/holomap_legend/element in legend) + element.holomap = src element.pixel_y = pixel_y //Set adjusted pixel y as it will be needed for area placement element.Setup(z_levels[displayed_level]) if(element.has_areas) @@ -403,12 +313,12 @@ if(displayed_level < z_levels.len) station_map.vis_contents += lbuttons[2] -/datum/station_holomap/proc/legend_select(obj/screen/legend/L) +/datum/station_holomap/proc/legend_select(obj/screen/holomap_legend/L) legend_deselect() L.Select() /datum/station_holomap/proc/legend_deselect() - for(var/obj/screen/legend/entry in legend) + for(var/obj/screen/holomap_legend/entry in legend) entry.Deselect() /datum/station_holomap/proc/initialize_holomap_bogus() diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 0c652b9131f..2ae979cefab 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -202,7 +202,7 @@ qdel(H) spawn(50) new /obj/item/honey_frame(loc) - new /obj/item/stack/wax(loc) + new /obj/item/stack/material/bar(loc, 1, /decl/material/solid/organic/wax) honey += processing processing = 0 icon_state = "centrifuge" @@ -231,14 +231,14 @@ icon = 'icons/obj/beekeeping.dmi' icon_state = "honeyframe" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood var/honey = 0 /obj/item/honey_frame/filled name = "filled beehive frame" desc = "A frame for the beehive that the bees have filled with honeycombs." honey = 20 - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/honey_frame/filled/Initialize() . = ..() @@ -249,7 +249,7 @@ desc = "Contains everything you need to build a beehive." icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/beehive_assembly/attack_self(var/mob/user) to_chat(user, "You start assembling \the [src]...") @@ -258,23 +258,12 @@ new /obj/machinery/beehive(get_turf(user)) qdel(src) -/obj/item/stack/wax - name = "wax" - singular_name = "wax piece" - desc = "Soft substance produced by bees. Used to make candles." - icon = 'icons/obj/beekeeping.dmi' - icon_state = "wax" - -var/global/list/wax_recipes = list(new /datum/stack_recipe/candle) -/obj/item/stack/wax/get_recipes() - return global.wax_recipes - /obj/item/bee_pack name = "bee pack" desc = "Contains a queen bee and some worker bees. Everything you'll need to start a hive!" icon = 'icons/obj/beekeeping.dmi' icon_state = "beepack" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/full = 1 /obj/item/bee_pack/Initialize() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1757a7e5d19..e82d24705fe 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -6,7 +6,8 @@ randpixel = 5 desc = "Nutritious! Probably." slot_flags = SLOT_HOLSTER - material = /decl/material/solid/plantmatter + material = /decl/material/solid/organic/plantmatter + is_spawnable_type = FALSE // Use the Spawn-Fruit verb instead. var/plantname = "apple" // Setting as a default in case this is spawned manually. var/datum/seed/seed @@ -125,26 +126,24 @@ fruit_leaves.color = seed.get_trait(TRAIT_PLANT_COLOUR) add_overlay(fruit_leaves) -/obj/item/chems/food/grown/Crossed(var/mob/living/M) - set waitfor = FALSE - if(seed && seed.get_trait(TRAIT_JUICY) == 2) - if(istype(M)) +/obj/item/chems/food/grown/Crossed(atom/movable/AM) + if(!isliving(AM) || !seed || seed.get_trait(TRAIT_JUICY) != 2) + return - if(M.buckled) - return + var/mob/living/M = AM + if(M.buckled || MOVING_DELIBERATELY(M)) + return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) - if(shoes && shoes.item_flags & ITEM_FLAG_NOSLIP) - return + var/obj/item/shoes = M.get_equipped_item(slot_shoes_str) + if(shoes && shoes.item_flags & ITEM_FLAG_NOSLIP) + return - to_chat(M, SPAN_DANGER("You slipped on \the [src]!")) - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - SET_STATUS_MAX(M, STAT_STUN, 8) - SET_STATUS_MAX(M, STAT_WEAK, 5) - seed.thrown_at(src,M) - QDEL_IN(src, 0) + to_chat(M, SPAN_DANGER("You slipped on \the [src]!")) + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + SET_STATUS_MAX(M, STAT_STUN, 8) + SET_STATUS_MAX(M, STAT_WEAK, 5) + seed.thrown_at(src,M) + QDEL_IN(src, 0) /obj/item/chems/food/grown/throw_impact(atom/hit_atom) ..() @@ -152,13 +151,13 @@ seed.thrown_at(src,hit_atom) var/global/list/_wood_materials = list( - /decl/material/solid/wood, - /decl/material/solid/wood/mahogany, - /decl/material/solid/wood/maple, - /decl/material/solid/wood/ebony, - /decl/material/solid/wood/walnut, - /decl/material/solid/wood/bamboo, - /decl/material/solid/wood/yew + /decl/material/solid/organic/wood, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/walnut, + /decl/material/solid/organic/wood/bamboo, + /decl/material/solid/organic/wood/yew ) /obj/item/chems/food/grown/attackby(var/obj/item/W, var/mob/user) diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 1686496381b..e2798fffd15 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -4,7 +4,7 @@ /obj/item/grown // Grown weapons name = "grown_weapon" - material = /decl/material/solid/plantmatter + material = /decl/material/solid/organic/plantmatter var/plantname var/potency = 1 @@ -45,7 +45,7 @@ throwforce = 0 throw_speed = 4 throw_range = 20 - material = /decl/material/solid/plantmatter + material = /decl/material/solid/organic/plantmatter /obj/item/corncob/attackby(obj/item/W, mob/user) ..() @@ -65,5 +65,4 @@ throwforce = 0 throw_speed = 4 throw_range = 20 - material = /decl/material/solid/plantmatter - \ No newline at end of file + material = /decl/material/solid/organic/plantmatter diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 3a359e1582e..c3b8e583319 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -270,7 +270,7 @@ origin_turf.visible_message(SPAN_DANGER("\The [thrown] splatters against [target]!")) splatter(origin_turf,thrown) -/datum/seed/proc/handle_environment(var/turf/current_turf, var/datum/gas_mixture/environment, var/light_supplied, var/check_only) +/datum/seed/proc/handle_plant_environment(var/turf/current_turf, var/datum/gas_mixture/environment, var/light_supplied, var/check_only) var/health_change = 0 // Handle gas consumption. diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 8283e149e65..bdcb31e17a9 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -534,7 +534,7 @@ name = "towercap" seed_name = "towercap" display_name = "towercap thicket" - chems = list(/decl/material/solid/wood = list(10,1)) + chems = list(/decl/material/solid/organic/wood = list(10,1)) mutants = null /datum/seed/mushroom/towercap/New() @@ -1319,7 +1319,7 @@ name = "bamboo" seed_name = "bamboo" display_name = "bamboo thicket" - chems = list(/decl/material/solid/wood/bamboo = list(6,1)) + chems = list(/decl/material/solid/organic/wood/bamboo = list(6,1)) mutants = null /datum/seed/bamboo/New() diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 29813dbc15b..2a86f4f951d 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -45,8 +45,8 @@ pass_flags = PASS_FLAG_TABLE mouse_opacity = MOUSE_OPACITY_NORMAL - var/health = 10 - var/max_health = 100 + health = 10 + max_health = 100 var/growth_threshold = 0 var/growth_type = 0 var/max_growth = 0 @@ -129,7 +129,7 @@ layer = (seed && seed.force_layer) ? seed.force_layer : ABOVE_OBJ_LAYER if(growth_type in list(GROWTH_VINES,GROWTH_BIOMASS)) set_opacity(1) - if(islist(seed.chems) && !isnull(seed.chems[/decl/material/solid/wood])) + if(islist(seed.chems) && !isnull(seed.chems[/decl/material/solid/organic/wood])) set_density(1) set_opacity(1) diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 770a7b64168..6125017277d 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -43,10 +43,10 @@ return //Take damage from bad environment if any - adjust_health(-seed.handle_environment(T,T.return_air(),null,1)) + adjust_health(-seed.handle_plant_environment(T,T.return_air(),null,1)) if(health <= 0) return - + //Vine fight! for(var/obj/effect/vine/other in T) if(other.seed != seed) @@ -76,7 +76,7 @@ var/list/neighbors = get_neighbors() if(neighbors.len) spread_to(pick(neighbors)) - + //Try to settle down if(can_spawn_plant()) plant = new(T,seed) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 48943560d5a..d464c28805f 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -20,9 +20,10 @@ manual_unbuckle(user) return TRUE -/obj/effect/vine/Crossed(atom/movable/O) - if(isliving(O)) - trodden_on(O) +/obj/effect/vine/Crossed(atom/movable/AM) + if(!isliving(AM)) + return + trodden_on(AM) /obj/effect/vine/proc/trodden_on(var/mob/living/victim) wake_neighbors() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 443e71bd6f8..ecd297264b7 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -9,7 +9,7 @@ construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 - atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_NO_CHEM_CHANGE var/mechanical = 1 // Set to 0 to stop it from drawing the alert lights. var/base_name = "tray" @@ -466,11 +466,12 @@ if(weedlevel > 0) user.visible_message("[user] starts uprooting the weeds.", "You remove the weeds from the [src].") weedlevel = 0 + update_icon() if(seed) var/needed_skill = seed.mysterious ? SKILL_ADEPT : SKILL_BASIC if(!user.skill_check(SKILL_BOTANY, needed_skill)) plant_health -= rand(40,60) - check_plant_health(1) + check_plant_health() else to_chat(user, "This plot is completely devoid of weeds. It doesn't need uprooting.") @@ -489,6 +490,7 @@ toxins += spray.toxicity pestlevel -= spray.pest_kill_str weedlevel -= spray.weed_kill_str + update_icon() to_chat(user, "You spray [src] with [O].") playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) qdel(O) diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm index 5d23c92560f..5065d15e7eb 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -84,9 +84,9 @@ // Seed datum handles gasses, light and pressure. if(mechanical && closed_system) - plant_health -= seed.handle_environment(T,environment,tray_light) + plant_health -= seed.handle_plant_environment(T,environment,tray_light) else - plant_health -= seed.handle_environment(T,environment) + plant_health -= seed.handle_plant_environment(T,environment) // If we're attached to a pipenet, then we should let the pipenet know we might have modified some gasses if (closed_system && get_port()) @@ -119,7 +119,7 @@ // Handle life and death. // When the plant dies, weeds thrive and pests die off. - check_plant_health(0) + check_plant_health(FALSE) // If enough time (in cycles, not ticks) has passed since the plant was harvested, we're ready to harvest again. if((age > seed.get_trait(TRAIT_MATURATION)) && \ diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm index 636f7fdf38d..27fcb183e3d 100644 --- a/code/modules/hydroponics/trays/tray_reagents.dm +++ b/code/modules/hydroponics/trays/tray_reagents.dm @@ -8,7 +8,7 @@ w_class = ITEM_SIZE_SMALL throw_speed = 2 throw_range = 10 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/toxicity = 4 var/pest_kill_str = 0 var/weed_kill_str = 0 @@ -60,7 +60,7 @@ toxicity = 0 pest_kill_str = 0 weed_kill_str = 0 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/plantspray/weedkiller/triclopyr name = "bottle of glyphosate" diff --git a/code/modules/integrated_electronics/core/analyzer.dm b/code/modules/integrated_electronics/core/analyzer.dm index 6df7b94d739..ecc918cf4c2 100644 --- a/code/modules/integrated_electronics/core/analyzer.dm +++ b/code/modules/integrated_electronics/core/analyzer.dm @@ -1,12 +1,12 @@ /obj/item/integrated_electronics/analyzer name = "circuit analyzer" desc = "This tool can scan an assembly and generate code necessary to recreate it in a circuit printer." - icon = 'icons/obj/assemblies/electronic_tools.dmi' - icon_state = "analyzer" + icon = 'icons/obj/assemblies/circuit_analyzer.dmi' + icon_state = ICON_STATE_WORLD matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/integrated_electronics/analyzer/afterattack(var/atom/A, var/mob/living/user) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index c4ee720a076..70bf4641b9e 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -109,8 +109,8 @@ P.make_energy() var/power_failure = FALSE - if(initial(health)/health < 0.5 && prob(5)) - visible_message("\The [src] shudders and sparks") + if(max_health/health < 0.5 && prob(5)) + visible_message(SPAN_WARNING("\The [src] shudders and sparks.")) power_failure = TRUE // Now spend it. for(var/I in assembly_components) @@ -119,7 +119,7 @@ if(power_failure || !draw_power(IC.power_draw_idle)) IC.power_fail() -/obj/item/electronic_assembly/receive_mouse_drop(atom/dropping, mob/user) +/obj/item/electronic_assembly/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && user == dropping) interact(user) diff --git a/code/modules/integrated_electronics/core/debugger.dm b/code/modules/integrated_electronics/core/debugger.dm index 6c05c91e994..2c74e56a5c9 100644 --- a/code/modules/integrated_electronics/core/debugger.dm +++ b/code/modules/integrated_electronics/core/debugger.dm @@ -13,7 +13,7 @@ matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/integrated_electronics/debugger/attack_self(mob/user) diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index 88f434f03d5..79c81561699 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -9,7 +9,7 @@ matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/scanning_color = FALSE var/detail_color = COLOR_ASSEMBLY_WHITE diff --git a/code/modules/integrated_electronics/core/prefab/prefabs.dm b/code/modules/integrated_electronics/core/prefab/prefabs.dm index 6a8663042e0..0efa5181a66 100644 --- a/code/modules/integrated_electronics/core/prefab/prefabs.dm +++ b/code/modules/integrated_electronics/core/prefab/prefabs.dm @@ -1,6 +1,6 @@ /decl/prefab/ic_assembly/hand_teleporter assembly_name = "hand-teleporter" - data = {"{'assembly':{'type':'type-a electronic mechanism','name':'Hand Teleporter', 'detail_color':'#5d99be'},'components':\[{'type':'teleporter locator'},{'type':'wormhole generator'},{'type':'button','name':'Open Wormhole'}\],'wires':\[\[\[1,'O',1\],\[2,'I',1\]\],\[\[2,'A',1\],\[3,'A',1\]\]\]}"} + data = @'{"assembly":{"type":"type-a electronic mechanism","name":"Hand Teleporter", "detail_color":"#5d99be"},"components":[{"type":"teleporter locator"},{"type":"wormhole generator"},{"type":"button","name":"Open Wormhole"}],"wires":[[[1,"O",1],[2,"I",1]],[[2,"A",1],[3,"A",1]]]}' power_cell_type = /obj/item/cell/hyper /obj/prefab/hand_teleporter diff --git a/code/modules/integrated_electronics/core/prefab/test/testprefabs.dm b/code/modules/integrated_electronics/core/prefab/test/testprefabs.dm index b58cf8d309e..c045f16f4a6 100644 --- a/code/modules/integrated_electronics/core/prefab/test/testprefabs.dm +++ b/code/modules/integrated_electronics/core/prefab/test/testprefabs.dm @@ -1,6 +1,6 @@ /decl/prefab/ic_assembly/test_heatercooler assembly_name = "heating-cooling-test" - data = {"{'assembly':{'type':'type-c electronic machine'},'components':\[{'type':'starter'},{'type':'reagent funnel'},{'type':'big reagent storage'},{'type':'reagent pump','name':'Hot Pump','inputs':\[\[3,0,5]]},{'type':'reagent pump','name':'Cool Pump','inputs':\[\[3,0,5]]},{'type':'reagent heater','name':'Heater','inputs':\[\[1,0,80]]},{'type':'reagent cooler','name':'Cooler','inputs':\[\[1,0,-50]]},{'type':'button','name':'Heat And Cool'},{'type':'and gate','name':'Heater Active Check','inputs':\[\[1,0,0],\[2,0,1]]},{'type':'and gate','name':'Cooler Active Check','inputs':\[\[1,0,0],\[2,0,1]]},{'type':'custom delay circuit','name':'Heater Delay','inputs':\[\[1,0,100]]},{'type':'custom delay circuit','name':'Cooler Delay','inputs':\[\[1,0,100]]}],'wires':\[\[\[1,'A',1],\[3,'A',1]],\[\[1,'A',1],\[6,'A',3]],\[\[1,'A',1],\[7,'A',3]],\[\[2,'I',1],\[3,'O',2]],\[\[3,'O',2],\[4,'I',1]],\[\[3,'O',2],\[5,'I',1]],\[\[4,'I',2],\[6,'O',4]],\[\[4,'A',1],\[8,'A',1]],\[\[4,'A',2],\[6,'A',1]],\[\[5,'I',2],\[7,'O',4]],\[\[5,'A',1],\[8,'A',1]],\[\[5,'A',2],\[7,'A',1]],\[\[6,'O',3],\[9,'I',1]],\[\[6,'A',1],\[11,'A',2]],\[\[6,'A',2],\[9,'A',1]],\[\[7,'O',3],\[10,'I',1]],\[\[7,'A',1],\[12,'A',2]],\[\[7,'A',2],\[10,'A',1]],\[\[9,'A',2],\[11,'A',1]],\[\[10,'A',2],\[12,'A',1]]]}"} + data = @'{"assembly":{"type":"type-c electronic machine"},"components":[{"type":"starter"},{"type":"reagent funnel"},{"type":"big reagent storage"},{"type":"reagent pump","name":"Hot Pump","inputs":[[3,0,5]]},{"type":"reagent pump","name":"Cool Pump","inputs":[[3,0,5]]},{"type":"reagent heater","name":"Heater","inputs":[[1,0,80]]},{"type":"reagent cooler","name":"Cooler","inputs":[[1,0,-50]]},{"type":"button","name":"Heat And Cool"},{"type":"and gate","name":"Heater Active Check","inputs":[[1,0,0],[2,0,1]]},{"type":"and gate","name":"Cooler Active Check","inputs":[[1,0,0],[2,0,1]]},{"type":"custom delay circuit","name":"Heater Delay","inputs":[[1,0,100]]},{"type":"custom delay circuit","name":"Cooler Delay","inputs":[[1,0,100]]}],"wires":[[[1,"A",1],[3,"A",1]],[[1,"A",1],[6,"A",3]],[[1,"A",1],[7,"A",3]],[[2,"I",1],[3,"O",2]],[[3,"O",2],[4,"I",1]],[[3,"O",2],[5,"I",1]],[[4,"I",2],[6,"O",4]],[[4,"A",1],[8,"A",1]],[[4,"A",2],[6,"A",1]],[[5,"I",2],[7,"O",4]],[[5,"A",1],[8,"A",1]],[[5,"A",2],[7,"A",1]],[[6,"O",3],[9,"I",1]],[[6,"A",1],[11,"A",2]],[[6,"A",2],[9,"A",1]],[[7,"O",3],[10,"I",1]],[[7,"A",1],[12,"A",2]],[[7,"A",2],[10,"A",1]],[[9,"A",2],[11,"A",1]],[[10,"A",2],[12,"A",1]]]}' power_cell_type = /obj/item/cell/hyper /obj/prefab/test_heatcool diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 5ac88803f88..8a33268251d 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -156,7 +156,7 @@ HTML += jointext(dat, "; ") HTML += ".

    " - if(config.allow_ic_printing || debug) + if(get_config_value(/decl/config/toggle/on/allow_ic_printing) || debug) HTML += "Assembly cloning: [can_clone ? (fast_clone ? "Instant" : "Available") : "Unavailable"].
    " HTML += "Circuits available: [upgraded || debug ? "Advanced":"Regular"]." @@ -164,7 +164,7 @@ HTML += "
    Crossed out circuits mean that the printer is not sufficiently upgraded to create that circuit." HTML += "
    " - if((can_clone && config.allow_ic_printing) || debug) + if((can_clone && get_config_value(/decl/config/toggle/on/allow_ic_printing)) || debug) HTML += "Here you can load script for your assembly.
    " if(!cloning) HTML += " {Load Program} " @@ -218,14 +218,8 @@ if(!build_type || !ispath(build_type)) return TRUE - var/list/cost - if(ispath(build_type, /obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/E = SScircuit.cached_assemblies[build_type] - cost = E.matter - else if(ispath(build_type, /obj/item/integrated_circuit)) - var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type] - cost = IC.matter - else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])) + var/list/cost = atom_info_repository.get_matter_for(build_type) + if(!ispath(build_type, /obj/item/electronic_assembly) && !ispath(build_type, /obj/item/integrated_circuit) && !(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])) return if(!debug && !subtract_material_costs(cost, usr)) @@ -243,7 +237,7 @@ playsound(src, 'sound/items/jaws_pry.ogg', 50, TRUE) if(href_list["print"]) - if(!config.allow_ic_printing && !debug) + if(!get_config_value(/decl/config/toggle/on/allow_ic_printing) && !debug) to_chat(usr, "Your facility has disabled printing of custom circuitry due to recent allegations of copyright infringement.") return if(!can_clone) // Copying and printing ICs is cloning @@ -308,7 +302,7 @@ to_chat(usr, "You begin printing a custom assembly. This will take approximately [round(cloning_time/10)] seconds. You can still print \ off normal parts during this time.") playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) - addtimer(CALLBACK(src, .proc/print_program, usr), cloning_time) + addtimer(CALLBACK(src, PROC_REF(print_program), usr), cloning_time) if("cancel") if(!cloning || !program) @@ -338,16 +332,16 @@ desc = "Install this into your integrated circuit printer to enhance it." color = COLOR_GRAY20 label = "label_up" - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/disk/integrated_circuit/upgrade/advanced name = "integrated circuit printer upgrade disk - advanced designs" desc = "Install this into your integrated circuit printer to enhance it. This one adds new, advanced designs to the printer." material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'materials':3,'engineering':3}" + origin_tech = @'{"materials":3,"engineering":3}' /obj/item/disk/integrated_circuit/upgrade/clone name = "integrated circuit printer upgrade disk - instant cloner" desc = "Install this into your integrated circuit printer to enhance it. This one allows the printer to duplicate assemblies instantaneously." - origin_tech = "{'materials':3,'programming':5}" + origin_tech = @'{"materials":3,"programming":5}' diff --git a/code/modules/integrated_electronics/core/wirer.dm b/code/modules/integrated_electronics/core/wirer.dm index 4799d7df3d4..4b0b6749ca3 100644 --- a/code/modules/integrated_electronics/core/wirer.dm +++ b/code/modules/integrated_electronics/core/wirer.dm @@ -13,7 +13,7 @@ matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/datum/integrated_io/selected_io = null var/mode = WIRE @@ -84,7 +84,7 @@ if(selected_io) unselect_io(selected_io) selected_io = io - events_repository.register(/decl/observ/destroyed, selected_io, src, .proc/unselect_io) + events_repository.register(/decl/observ/destroyed, selected_io, src, PROC_REF(unselect_io)) switch(mode) if(UNWIRE) mode = UNWIRING diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 752d155d340..ed18a97e96c 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -120,6 +120,7 @@ ..() /obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change(changetype) + ..() set_pin_data(IC_OUTPUT, 1, reagents.total_volume) push_data() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 634de501f40..14bcd356cda 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -197,15 +197,15 @@ return if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. - + var/current_max_health = H.get_max_health() var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(H, BP_BRAIN) set_pin_data(IC_OUTPUT, 1, (brain && H.stat != DEAD)) set_pin_data(IC_OUTPUT, 2, (H.stat == CONSCIOUS)) - set_pin_data(IC_OUTPUT, 3, damage_to_severity(100 * H.getBruteLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 4, damage_to_severity(100 * H.getFireLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 5, damage_to_severity(100 * H.getToxLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 6, damage_to_severity(100 * H.getOxyLoss() / H.maxHealth)) - set_pin_data(IC_OUTPUT, 7, damage_to_severity(100 * H.getCloneLoss() / H.maxHealth)) + set_pin_data(IC_OUTPUT, 3, damage_to_severity(100 * H.getBruteLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 4, damage_to_severity(100 * H.getFireLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 5, damage_to_severity(100 * H.getToxLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 6, damage_to_severity(100 * H.getOxyLoss() / current_max_health)) + set_pin_data(IC_OUTPUT, 7, damage_to_severity(100 * H.getCloneLoss() / current_max_health)) set_pin_data(IC_OUTPUT, 8, H.get_pulse_as_number()) set_pin_data(IC_OUTPUT, 9, H.get_blood_oxygenation()) set_pin_data(IC_OUTPUT, 10, damage_to_severity(H.get_shock())) @@ -648,7 +648,7 @@ . = ..() set_pin_data(IC_INPUT, 1, frequency) set_pin_data(IC_INPUT, 2, code) - addtimer(CALLBACK(src, .proc/set_frequency,frequency), 40) + addtimer(CALLBACK(src, PROC_REF(set_frequency),frequency), 40) /obj/item/integrated_circuit/input/signaler/Destroy() radio_controller.remove_object(src,frequency) @@ -1038,7 +1038,7 @@ /decl/material/solid/metal/plasteel, /decl/material/solid/metal/titanium, /decl/material/solid/glass, - /decl/material/solid/plastic + /decl/material/solid/organic/plastic ) /obj/item/integrated_circuit/input/matscan/do_work() diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index a75e68f68b8..869bb426379 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -207,7 +207,7 @@ dt = clamp(detonation_time.data, 1, 12)*10 else dt = 15 - addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/activate), dt) + addtimer(CALLBACK(attached_grenade, TYPE_PROC_REF(/obj/item/grenade, activate)), dt) var/atom/holder = loc log_and_message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]") @@ -420,9 +420,9 @@ set_pin_data(IC_OUTPUT, 1, TRUE) pulling = to_pull acting_object.visible_message("\The [acting_object] starts pulling \the [to_pull] around.") - events_repository.register(/decl/observ/moved, to_pull, src, .proc/check_pull) //Whenever the target moves, make sure we can still pull it! - events_repository.register(/decl/observ/destroyed, to_pull, src, .proc/stop_pulling) //Stop pulling if it gets destroyed - events_repository.register(/decl/observ/moved, acting_object, src, .proc/pull) //Make sure we actually pull it. + events_repository.register(/decl/observ/moved, to_pull, src, PROC_REF(check_pull)) //Whenever the target moves, make sure we can still pull it! + events_repository.register(/decl/observ/destroyed, to_pull, src, PROC_REF(stop_pulling)) //Stop pulling if it gets destroyed + events_repository.register(/decl/observ/moved, acting_object, src, PROC_REF(pull)) //Make sure we actually pull it. push_data() if(3) if(pulling) @@ -555,7 +555,7 @@ spawn_flags = IC_SPAWN_RESEARCH action_flags = IC_ACTION_LONG_RANGE - origin_tech = "{'magnets':1,'wormholes':3}" + origin_tech = @'{"magnets":1,"wormholes":3}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, @@ -606,7 +606,7 @@ power_draw_per_use = 20 var/obj/item/aicard activators = list("Upwards" = IC_PINTYPE_PULSE_OUT, "Downwards" = IC_PINTYPE_PULSE_OUT, "Left" = IC_PINTYPE_PULSE_OUT, "Right" = IC_PINTYPE_PULSE_OUT) - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' spawn_flags = IC_SPAWN_RESEARCH /obj/item/integrated_circuit/manipulation/ai/verb/open_menu() @@ -654,7 +654,7 @@ /obj/item/integrated_circuit/manipulation/ai/attackby(var/obj/item/I, var/mob/user) - if(is_type_in_list(I, list(/obj/item/aicard, /obj/item/paicard, /obj/item/mmi))) + if(is_type_in_list(I, list(/obj/item/aicard, /obj/item/paicard, /obj/item/organ/internal/brain_interface))) load_ai(user, I) else return ..() @@ -681,7 +681,7 @@ cooldown_per_use = 2 SECOND power_draw_per_use = 50 spawn_flags = IC_SPAWN_DEFAULT - origin_tech = "{'engineering':2}" + origin_tech = @'{"engineering":2}' /obj/item/integrated_circuit/manipulation/anchoring/do_work(ord) if(!isturf(assembly.loc)) @@ -724,7 +724,7 @@ cooldown_per_use = 2 SECOND power_draw_per_use = 50 spawn_flags = IC_SPAWN_DEFAULT - origin_tech = "{'engineering':2}" + origin_tech = @'{"engineering":2}' var/lock_enabled = FALSE diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 99b07d54192..dcb1964e7df 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -6,10 +6,12 @@ /obj/item/integrated_circuit/reagent category_text = "Reagent" - unacidable = 1 cooldown_per_use = 10 var/volume = 0 +/obj/item/integrated_circuit/reagent/solvent_can_melt(var/solvent_power = MAT_SOLVENT_STRONG) + return FALSE + /obj/item/integrated_circuit/reagent/Initialize() . = ..() if(volume) @@ -48,6 +50,7 @@ var/notified = FALSE /obj/item/integrated_circuit/reagent/smoke/on_reagent_change() + ..() push_vol() /obj/item/integrated_circuit/reagent/smoke/do_work(ord) @@ -107,6 +110,7 @@ var/busy = FALSE /obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype) + ..() push_vol() /obj/item/integrated_circuit/reagent/injector/on_data_written() @@ -184,7 +188,6 @@ if(isliving(AM)) var/mob/living/L = AM var/injection_status = L.can_inject(null, BP_CHEST) - log_world("Injection status? [injection_status]") var/injection_delay = 3 SECONDS if(injection_status == INJECTION_PORT) injection_delay += INJECTION_PORT_DELAY @@ -196,7 +199,7 @@ L.visible_message("\The [acting_object] is trying to inject [L]!", \ "\The [acting_object] is trying to inject you!") busy = TRUE - addtimer(CALLBACK(src, .proc/inject_after, weakref(L)), injection_delay) + addtimer(CALLBACK(src, PROC_REF(inject_after), weakref(L)), injection_delay) return else if(!ATOM_IS_OPEN_CONTAINER(AM)) @@ -226,7 +229,7 @@ C.visible_message("\The [acting_object] is trying to take a blood sample from [C]!", \ "\The [acting_object] is trying to take a blood sample from you!") busy = TRUE - addtimer(CALLBACK(src, .proc/draw_after, weakref(C), tramount), injection_delay) + addtimer(CALLBACK(src, PROC_REF(draw_after), weakref(C), tramount), injection_delay) return else @@ -322,6 +325,7 @@ push_data() /obj/item/integrated_circuit/reagent/storage/on_reagent_change(changetype) + ..() push_vol() /obj/item/integrated_circuit/reagent/storage/big @@ -340,7 +344,7 @@ icon_state = "reagent_storage_cryo" extended_desc = "This is effectively an internal cryo beaker." - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_CHEM_CHANGE complexity = 8 spawn_flags = IC_SPAWN_RESEARCH @@ -512,11 +516,13 @@ "on transfer" = IC_PINTYPE_PULSE_OUT ) - unacidable = 1 spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH complexity = 4 power_draw_per_use = 5 +/obj/item/integrated_circuit/input/funnel/solvent_can_melt(var/solvent_power = MAT_SOLVENT_STRONG) + return FALSE + /obj/item/integrated_circuit/input/funnel/attackby_react(obj/item/I, mob/user, intent) var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) var/obj/item/chems/container = I @@ -595,6 +601,7 @@ push_data() /obj/item/integrated_circuit/reagent/temp/on_reagent_change() + ..() push_vol() /obj/item/integrated_circuit/reagent/temp/power_fail() diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 9012de5054c..25f9dca52a4 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -119,7 +119,7 @@ if(Pl&&islist(Pl)) idc.access = Pl var/turf/a_loc = get_turf(assembly) - var/list/P = AStar(a_loc, locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 200, id=idc, exclude=get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom))) + var/list/P = AStar(a_loc, locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, 200, id=idc, exclude=get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom))) if(!P) activate_pin(3) diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 1ec0d80676f..c9739ceed0a 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -17,7 +17,7 @@ power_draw_per_use = 2 /obj/item/integrated_circuit/time/delay/do_work() - addtimer(CALLBACK(src, .proc/activate_pin, 2), delay) + addtimer(CALLBACK(src, PROC_REF(activate_pin), 2), delay) /obj/item/integrated_circuit/time/delay/five_sec name = "five-sec delay circuit" @@ -98,7 +98,7 @@ /obj/item/integrated_circuit/time/ticker/proc/tick() if(is_running) - addtimer(CALLBACK(src, .proc/tick), delay) + addtimer(CALLBACK(src, PROC_REF(tick)), delay) if(world.time > next_fire) next_fire = world.time + delay activate_pin(1) diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 527e5a11598..6fe32e00f0e 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -15,7 +15,7 @@ if((movement_dir & EAST) && (movement_dir & WEST)) movement_dir &= ~(EAST|WEST) - if(!config.allow_diagonal_movement) + if(!get_config_value(/decl/config/toggle/allow_diagonal_movement)) if(movement_dir & user.last_move_dir_pressed) movement_dir = user.last_move_dir_pressed else diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index f65e26da951..fb56abe3346 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -37,7 +37,7 @@ if(!(next_move_dir_sub & movement)) next_move_dir_add |= movement - if(movement && !config.allow_diagonal_movement) + if(movement && !get_config_value(/decl/config/toggle/allow_diagonal_movement)) last_move_dir_pressed = movement // Client-level keybindings are ones anyone should be able to do at any time diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 891edc643da..8cdb76ed4a6 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -66,18 +66,18 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, var/has_ambience = FALSE - t1 = new_turf - z = new_turf.z + t1 = new_turf.resolve_to_actual_turf() + z = t1.z t1i = oi - if (new_turf.ambient_light) + if (t1.ambient_light) has_ambience = TRUE var/vertical = diagonal & ~(diagonal - 1) // The horizontal directions (4 and 8) are bigger than the vertical ones (1 and 2), so we can reliably say the lsb is the horizontal direction. var/horizontal = diagonal & ~vertical // Now that we know the horizontal one we can get the vertical one. - x = new_turf.x + (horizontal == EAST ? 0.5 : -0.5) - y = new_turf.y + (vertical == NORTH ? 0.5 : -0.5) + x = t1.x + (horizontal == EAST ? 0.5 : -0.5) + y = t1.y + (vertical == NORTH ? 0.5 : -0.5) // My initial plan was to make this loop through a list of all the dirs (horizontal, vertical, diagonal). // Issue being that the only way I could think of doing it was very messy, slow and honestly overengineered. @@ -86,7 +86,7 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, // Diagonal one is easy. - T = get_step(new_turf, diagonal) + T = get_step_resolving_mimic(t1, diagonal) if (T) // In case we're on the map's border. if (!T.corners) T.corners = new(4) @@ -98,7 +98,7 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, has_ambience = TRUE // Now the horizontal one. - T = get_step(new_turf, horizontal) + T = get_step_resolving_mimic(t1, horizontal) if (T) // Ditto. if (!T.corners) T.corners = new(4) @@ -110,7 +110,7 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, has_ambience = TRUE // And finally the vertical one. - T = get_step(new_turf, vertical) + T = get_step_resolving_mimic(t1, vertical) if (T) if (!T.corners) T.corners = new(4) @@ -244,28 +244,31 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, var/turf/T var/Ti - if (t1) + if (t1 && (t1.below || HasBelow(t1.z)) && (t1.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t1)) T = t1 Ti = t1i - else if (t2) + else if (t2 && (t2.below || HasBelow(t2.z)) && (t2.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t2)) T = t2 Ti = t2i - else if (t3) + else if (t3 && (t3.below || HasBelow(t3.z)) && (t3.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t3)) T = t3 Ti = t3i - else if (t4) + else if (t4 && (t4.below || HasBelow(t4.z)) && (t4.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(t4)) T = t4 Ti = t4i + // No MZ candidates below, just update. + else if (needs_update || skip_update) + return else - // This should be impossible to reach -- how do we exist without at least one master turf? - CRASH("Corner has no masters!") + // Always queue for this, not important enough to hit the synchronous path. + needs_update = TRUE + SSlighting.corner_queue += src + return var/datum/lighting_corner/below = src - var/turf/lasT - // We init before Z-Mimic, cannot rely on above/below. - while ((lasT = T) && (T = GET_BELOW(T)) && (lasT.z_flags & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) + while ((T = GET_BELOW(T)) && ((below.t1?.z_flags | below.t2?.z_flags | below.t3?.z_flags | below.t4?.z_flags) & ZM_ALLOW_LIGHTING) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) T.ambient_has_indirect = TRUE if (!T.corners || !T.corners[Ti]) diff --git a/code/modules/locks/key.dm b/code/modules/locks/key.dm index 70a2f9869b7..b4ded50c995 100644 --- a/code/modules/locks/key.dm +++ b/code/modules/locks/key.dm @@ -4,21 +4,20 @@ icon = 'icons/obj/items/key.dmi' icon_state = "keys" w_class = ITEM_SIZE_TINY - material = DEFAULT_FURNITURE_MATERIAL + material = /decl/material/solid/metal/brass + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC var/key_data = "" -/obj/item/key/Initialize(mapload,var/data) - . = ..(mapload) - if(data) - key_data = data +/obj/item/key/Initialize(var/mapload, var/material_key, var/new_key_data) + . = ..(mapload, material_key) + if(new_key_data) + key_data = new_key_data /obj/item/key/proc/get_data(var/mob/user) return key_data /obj/item/key/soap - name = "soap key" - desc = "a fragile key made using a bar of soap." - material = /decl/material/liquid/cleaner + material = /decl/material/liquid/cleaner/soap var/uses = 0 /obj/item/key/soap/get_data(var/mob/user) diff --git a/code/modules/locks/lock_construct.dm b/code/modules/locks/lock_construct.dm index 393fd09c1a1..beacb06758b 100644 --- a/code/modules/locks/lock_construct.dm +++ b/code/modules/locks/lock_construct.dm @@ -14,7 +14,7 @@ lock_data = generateRandomString(round(material.integrity/50)) /obj/item/lock_construct/attackby(var/obj/item/I, var/mob/user) - if(istype(I,/obj/item/key)) + if(istype(I, /obj/item/key)) var/obj/item/key/K = I if(!K.key_data) to_chat(user, SPAN_NOTICE("You fashion \the [I] to unlock \the [src].")) diff --git a/code/modules/maps/_map_template.dm b/code/modules/maps/_map_template.dm index 819e05abeb2..2dfee0fa930 100644 --- a/code/modules/maps/_map_template.dm +++ b/code/modules/maps/_map_template.dm @@ -117,12 +117,12 @@ SSshuttle.map_hash_to_areas[map_hash] = initialized_areas_by_type for(var/area/A in initialized_areas_by_type) A.saved_map_hash = map_hash - events_repository.register(/decl/observ/destroyed, A, src, .proc/cleanup_lateloaded_area) + events_repository.register(/decl/observ/destroyed, A, src, PROC_REF(cleanup_lateloaded_area)) SSshuttle.block_queue = pre_init_state SSshuttle.clear_init_queue() // We will flush the queue unless there were other blockers, in which case they will do it. /datum/map_template/proc/cleanup_lateloaded_area(area/destroyed_area) - events_repository.unregister(/decl/observ/destroyed, destroyed_area, src, .proc/cleanup_lateloaded_area) + events_repository.unregister(/decl/observ/destroyed, destroyed_area, src, PROC_REF(cleanup_lateloaded_area)) if(destroyed_area.saved_map_hash) SSshuttle.map_hash_to_areas[destroyed_area.saved_map_hash] -= destroyed_area diff --git a/code/modules/maps/helper_landmarks.dm b/code/modules/maps/helper_landmarks.dm index 12680e46a76..76e4e23cb4b 100644 --- a/code/modules/maps/helper_landmarks.dm +++ b/code/modules/maps/helper_landmarks.dm @@ -98,11 +98,11 @@ /obj/abstract/landmark/delete_on_shuttle/Initialize() . = ..() - events_repository.register_global(/decl/observ/shuttle_added, src, .proc/check_shuttle) + events_repository.register_global(/decl/observ/shuttle_added, src, PROC_REF(check_shuttle)) /obj/abstract/landmark/delete_on_shuttle/proc/check_shuttle(var/shuttle) if(SSshuttle.shuttles[shuttle_name] == shuttle) - events_repository.register(/decl/observ/shuttle_moved, shuttle, src, .proc/delete_everything) + events_repository.register(/decl/observ/shuttle_moved, shuttle, src, PROC_REF(delete_everything)) shuttle_datum = shuttle /obj/abstract/landmark/delete_on_shuttle/proc/delete_everything() @@ -112,9 +112,9 @@ qdel(src) /obj/abstract/landmark/delete_on_shuttle/Destroy() - events_repository.unregister_global(/decl/observ/shuttle_added, src, .proc/check_shuttle) + events_repository.unregister_global(/decl/observ/shuttle_added, src, PROC_REF(check_shuttle)) if(shuttle_datum) - events_repository.unregister(/decl/observ/shuttle_moved, shuttle_datum, src, .proc/delete_everything) + events_repository.unregister(/decl/observ/shuttle_moved, shuttle_datum, src, PROC_REF(delete_everything)) . = ..() // Has a percent chance on spawn to set the specified variable on the specified type to the specified value. diff --git a/code/modules/maps/template_types/random_exoplanet/fauna_generator.dm b/code/modules/maps/template_types/random_exoplanet/fauna_generator.dm index b71e8da04e1..03a66a0da3c 100644 --- a/code/modules/maps/template_types/random_exoplanet/fauna_generator.dm +++ b/code/modules/maps/template_types/random_exoplanet/fauna_generator.dm @@ -100,8 +100,8 @@ /datum/fauna_generator/proc/register_fauna(var/mob/living/A) if(A in live_fauna) return - events_repository.register(/decl/observ/destroyed, A, src, /datum/fauna_generator/proc/on_fauna_death) - events_repository.register(/decl/observ/death, A, src, /datum/fauna_generator/proc/on_fauna_death) + events_repository.register(/decl/observ/destroyed, A, src, TYPE_PROC_REF(/datum/fauna_generator, on_fauna_death)) + events_repository.register(/decl/observ/death, A, src, TYPE_PROC_REF(/datum/fauna_generator, on_fauna_death)) LAZYADD(live_fauna, A) /datum/fauna_generator/proc/on_fauna_death(var/mob/living/A) @@ -111,8 +111,8 @@ /datum/fauna_generator/proc/unregister_fauna(var/mob/living/A) if(!(A in live_fauna)) return - events_repository.unregister(/decl/observ/destroyed, A, src, /datum/fauna_generator/proc/on_fauna_death) - events_repository.unregister(/decl/observ/death, A, src, /datum/fauna_generator/proc/on_fauna_death) + events_repository.unregister(/decl/observ/destroyed, A, src, TYPE_PROC_REF(/datum/fauna_generator, on_fauna_death)) + events_repository.unregister(/decl/observ/death, A, src, TYPE_PROC_REF(/datum/fauna_generator, on_fauna_death)) LAZYREMOVE(live_fauna, A) /datum/fauna_generator/proc/generate_fauna(var/datum/gas_mixture/atmosphere, var/list/breath_gases = list(), var/list/toxic_gases = list()) diff --git a/code/modules/maps/template_types/random_exoplanet/flora_generator.dm b/code/modules/maps/template_types/random_exoplanet/flora_generator.dm index 71a2a82effb..54765963c41 100644 --- a/code/modules/maps/template_types/random_exoplanet/flora_generator.dm +++ b/code/modules/maps/template_types/random_exoplanet/flora_generator.dm @@ -162,6 +162,6 @@ S.set_trait(TRAIT_HARVEST_REPEAT, 1) S.set_trait(TRAIT_LARGE, 1) S.set_trait(TRAIT_LEAVES_COLOUR, color) - S.chems[/decl/material/solid/wood] = 1 //#TODO: Maybe look at Why the seed creates injectable wood? + S.chems[/decl/material/solid/organic/wood] = 1 //#TODO: Maybe look at Why the seed creates injectable wood? adapt_seed(S, atmos) LAZYADD(big_flora_types, S) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm index 2ec87d62a47..0decc6d51af 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm @@ -171,26 +171,27 @@ ..() for(var/x in 1 to limit_x - 1) for(var/y in 1 to limit_y - 1) - var/value = map[get_map_cell(x,y)] + var/value = map[TRANSLATE_COORD(x,y)] if(value != FLOOR_VALUE) continue var/list/neighbors = list() for(var/offset in list(list(0,1), list(0,-1), list(1,0), list(-1,0))) - var/char = map[get_map_cell(x + offset[1], y + offset[2])] + var/tmp_cell = TRANSLATE_COORD(x + offset[1], y+offset[2]) + var/char = LAZYACCESS(map, tmp_cell) if(char == FLOOR_VALUE || char == DOOR_VALUE) - neighbors.Add(get_map_cell(x + offset[1], y + offset[2])) + neighbors.Add(tmp_cell) if(length(neighbors) > 1) continue map[neighbors[1]] = DOOR_VALUE if(artifacts_to_spawn) - map[get_map_cell(x,y)] = ARTIFACT_VALUE + map[TRANSLATE_COORD(x,y)] = ARTIFACT_VALUE artifacts_to_spawn-- var/entrance_x = pick(rand(2,limit_x-1), 1, limit_x) var/entrance_y = pick(1, limit_y) if(entrance_x == 1 || entrance_x == limit_x) entrance_y = rand(2,limit_y-1) - map[get_map_cell(entrance_x,entrance_y)] = DOOR_VALUE + map[TRANSLATE_COORD(entrance_x,entrance_y)] = DOOR_VALUE /datum/random_map/maze/lab/get_appropriate_path(var/value) if(value == ARTIFACT_VALUE) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/grass.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/grass.dm index 47201560a5e..9961918b2ee 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/grass.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/grass.dm @@ -135,7 +135,7 @@ descriptor = "grass exoplanet" land_type = /turf/exterior/wildgrass water_type = /turf/exterior/water - coast_type = /turf/exterior/mud/dark + coast_type = /turf/exterior/mud water_level_min = 3 flora_prob = 10 grass_prob = 50 diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm index 9cebc03c518..22f216e8a0d 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm @@ -135,6 +135,9 @@ dirt_color = "#c40031" footstep_type = /decl/footsteps/mud +/turf/exterior/meat/get_diggable_resources() + return dug ? null : list(/obj/item/stack/material/ore/meat = list(3, 2)) + /turf/exterior/water/stomach name = "juices" desc = "Half-digested chunks of vines are floating in the puddle of some liquid." diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/volcanic.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/volcanic.dm index 643d7496ba7..1fce3f9757d 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/volcanic.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/volcanic.dm @@ -18,7 +18,7 @@ /datum/level_data/planetoid/exoplanet/volcanic base_area = /area/exoplanet/volcanic - base_turf = /turf/exterior/volcanic + base_turf = /turf/exterior/rock/volcanic exterior_atmosphere = null exterior_atmos_temp = null level_generators = list( @@ -111,7 +111,7 @@ /datum/random_map/noise/exoplanet/volcanic descriptor = "volcanic exoplanet" smoothing_iterations = 5 - land_type = /turf/exterior/volcanic + land_type = /turf/exterior/rock/volcanic water_type = /turf/exterior/lava water_level_min = 5 water_level_max = 6 @@ -119,23 +119,7 @@ flora_prob = 3 grass_prob = 0 large_flora_prob = 0 - -//Squashing most of 1 tile lava puddles -/datum/random_map/noise/exoplanet/volcanic/cleanup() - for(var/x = 1, x <= limit_x, x++) - for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) - if(noise2value(map[current_cell]) < water_level) - continue - var/frendos - for(var/dx in list(-1,0,1)) - for(var/dy in list(-1,0,1)) - var/tmp_cell = get_map_cell(x+dx,y+dy) - if(tmp_cell && tmp_cell != current_cell && noise2value(map[tmp_cell]) >= water_level) - frendos = 1 - break - if(!frendos) - map[current_cell] = 1 + smooth_single_tiles = TRUE //////////////////////////////////////////////////////////////////////////// // Areas @@ -143,4 +127,4 @@ /area/exoplanet/volcanic forced_ambience = list('sound/ambience/magma.ogg') - base_turf = /turf/exterior/volcanic + base_turf = /turf/exterior/rock/volcanic diff --git a/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm b/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm index d257df6e411..4c9be31e655 100644 --- a/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm +++ b/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm @@ -379,7 +379,7 @@ /datum/planetoid_data/random/proc/generate_daycycle_data() starts_at_night = (surface_light_level > 0.1) - day_duration = rand(global.config.exoplanet_min_day_duration, global.config.exoplanet_max_day_duration) + day_duration = rand(get_config_value(/decl/config/num/exoplanet_min_day_duration), get_config_value(/decl/config/num/exoplanet_max_day_duration)) MINUTES ///If the planet doesn't have a name defined, a name will be randomly generated for it. (Named this way because a global proc generate_planet_name already exists) /datum/planetoid_data/random/proc/make_planet_name() @@ -484,11 +484,11 @@ //Adjust for species habitability if(habitability_class == HABITABILITY_OKAY || habitability_class == HABITABILITY_IDEAL) - var/decl/species/S = global.get_species_by_key(global.using_map.default_species) + var/decl/species/S = global.get_species_by_key(global.using_map.default_species) if(habitability_class == HABITABILITY_IDEAL) - . = clamp(., S.cold_discomfort_level + rand(1,5), S.heat_discomfort_level - rand(1,5)) //Clamp between comfortable levels since we're ideal + . = clamp(., S.default_bodytype.cold_discomfort_level + rand(1,5), S.default_bodytype.heat_discomfort_level - rand(1,5)) //Clamp between comfortable levels since we're ideal else - . = clamp(., S.cold_level_1 + 1, S.heat_level_1 - 1) //clamp between values species starts taking damages at + . = clamp(., S.default_bodytype.cold_level_1 + 1, S.default_bodytype.heat_level_1 - 1) //clamp between values species starts taking damages at ///Generates a valid surface pressure for the planet's atmosphere matching it's habitability class /datum/planetoid_data/random/proc/generate_surface_pressure() @@ -546,8 +546,8 @@ //Make sure temperature can't damage people on casual planets (Only when not forcing an atmosphere) var/decl/species/S = global.get_species_by_key(global.using_map.default_species) - var/lower_temp = max(S.cold_level_1, atmosphere_gen_temperature_min) - var/higher_temp = min(S.heat_level_1, atmosphere_gen_temperature_max) + var/lower_temp = max(S.default_bodytype.cold_level_1, atmosphere_gen_temperature_min) + var/higher_temp = min(S.default_bodytype.heat_level_1, atmosphere_gen_temperature_max) var/breathed_gas = S.breath_type var/breathed_min_pressure = S.breath_pressure @@ -582,7 +582,7 @@ if(((current_merged_flags & XGM_GAS_OXIDIZER) && (mat.gas_flags & XGM_GAS_FUEL)) || \ ((current_merged_flags & XGM_GAS_FUEL) && (mat.gas_flags & XGM_GAS_OXIDIZER))) continue - + // If we have an ignition point we're basically XGM_GAS_FUEL, kind of. TODO: Combine those somehow? // These don't actually burn but it's still weird to see vaporized skin gas in an oxygen-rich atmosphere, // so skip them. diff --git a/code/modules/maps/template_types/random_exoplanet/random_exoplanet.dm b/code/modules/maps/template_types/random_exoplanet/random_exoplanet.dm index 7bcfccb336d..49aa85ee8f0 100644 --- a/code/modules/maps/template_types/random_exoplanet/random_exoplanet.dm +++ b/code/modules/maps/template_types/random_exoplanet/random_exoplanet.dm @@ -17,3 +17,8 @@ /datum/exoplanet_theme/ruined_city = 5, /datum/exoplanet_theme/robotic_guardians = 10 ) + +/datum/map_template/planetoid/random/exoplanet/preload() + . = ..() + if(.) + tallness = global.using_map.planet_depth \ No newline at end of file diff --git a/code/modules/maps/template_types/random_exoplanet/random_map.dm b/code/modules/maps/template_types/random_exoplanet/random_map.dm index 098b2201437..c3b8a9e729d 100644 --- a/code/modules/maps/template_types/random_exoplanet/random_map.dm +++ b/code/modules/maps/template_types/random_exoplanet/random_map.dm @@ -1,4 +1,5 @@ #define COAST_VALUE (cell_range + 1) +#define TRANSLATE_COORD(X,Y) ((((Y) - 1) * limit_x) + (X)) ///Place down flora/fauna spawners, grass, water, and apply selected land type. /datum/random_map/noise/exoplanet @@ -137,7 +138,7 @@ return for(var/x in 1 to limit_x - 1) for(var/y in 1 to limit_y - 1) - var/mapcell = get_map_cell(x,y) + var/mapcell = TRANSLATE_COORD(x,y) if(noise2value(map[mapcell]) < water_level) var/neighbors = get_neighbors(x, y, TRUE) for(var/cell in neighbors) @@ -152,7 +153,7 @@ /datum/random_map/noise/exoplanet/mantle descriptor = "planetary mantle" smoothing_iterations = 3 - land_type = /turf/exterior/volcanic + land_type = /turf/exterior/rock/volcanic water_type = /turf/exterior/lava water_level_min = 4 water_level_max = 6 @@ -165,6 +166,8 @@ //Random map generator to create rock walls underground /datum/random_map/automata/cave_system/mantle descriptor = "planetary mantle caves" - target_turf_type = /turf/exterior/volcanic //Only let it apply to non-lava turfs + target_turf_type = /turf/exterior/rock/volcanic //Only let it apply to non-lava turfs floor_type = null wall_type = /turf/exterior/wall + +#undef TRANSLATE_COORD \ No newline at end of file diff --git a/code/modules/maps/template_types/random_exoplanet/random_planet_level_data.dm b/code/modules/maps/template_types/random_exoplanet/random_planet_level_data.dm index 80f5b369743..655368256ed 100644 --- a/code/modules/maps/template_types/random_exoplanet/random_planet_level_data.dm +++ b/code/modules/maps/template_types/random_exoplanet/random_planet_level_data.dm @@ -19,7 +19,7 @@ ///Level data for generating underground levels on exoplanets /datum/level_data/planetoid/exoplanet/underground base_area = /area/exoplanet/underground - base_turf = /turf/exterior/volcanic + base_turf = /turf/exterior/rock level_generators = list( /datum/random_map/noise/exoplanet/mantle, /datum/random_map/automata/cave_system/mantle, diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index e9d9ba8360e..34b1cba8ea7 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -60,7 +60,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) //mostly for convenience /obj/proc/get_material_type() var/decl/material/mat = get_material() - . = mat && mat.type + . = mat?.type // Material definition and procs follow. /decl/material @@ -95,7 +95,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/shard_icon // Related to above. var/shard_can_repair = 1 // Can shards be turned into sheets with a welder? var/list/recipes // Holder for all recipes usable with a sheet of this material. - var/list/strut_recipes // Holder for all the recipes you can build with the struct stack type. var/destruction_desc = "breaks apart" // Fancy string for barricades/tables/objects exploding. // Icons @@ -110,7 +109,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/table_icon_base = "metal" var/table_icon_reinforced = "reinf_metal" - var/list/stack_origin_tech = "{'materials':1}" // Research level for stacks. + var/list/stack_origin_tech = @'{"materials":1}' // Research level for stacks. // Attributes /// How rare is this material in exoplanet xenoflora? @@ -129,8 +128,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/boiling_point = 3000 /// kJ/kg, enthalpy of vaporization var/latent_heat = 7000 - /// kg/mol, + /// kg/mol var/molar_mass = 0.06 + /// g/ml + var/liquid_density = 0.997 + /// g/ml + var/solid_density = 0.9168 /// Brute damage to a wall is divided by this value if the wall is reinforced by this material. var/brute_armor = 2 /// Same as above, but for Burn damage type. If blank brute_armor's value is used. @@ -222,6 +225,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/fruit_descriptor // String added to fruit desc if this chemical is present. var/dirtiness = DIRTINESS_NEUTRAL // How dirty turfs are after being exposed to this material. Negative values cause a cleaning/sterilizing effect. + var/decontamination_dose = 0 // Amount required for a decontamination effect, if any. var/solvent_power = MAT_SOLVENT_NONE var/solvent_melt_dose = 0 var/solvent_max_damage = 0 @@ -250,7 +254,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/heating_sound = 'sound/effects/bubbles.ogg' var/list/heating_products var/bypass_heating_products_for_root_type - var/fuel_value = 0 + var/accelerant_value = 0 var/burn_product var/list/vapor_products // If splashed, releases these gasses in these proportions. // TODO add to unit test after solvent PR is merged @@ -337,6 +341,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) #define FALSEWALL_STATE "fwall_open" /decl/material/validate() . = ..() + if(accelerant_value > FUEL_VALUE_NONE && isnull(ignition_point)) + . += "accelerant value larger than zero but null ignition point" + if(!isnull(ignition_point) && accelerant_value <= FUEL_VALUE_NONE) + . += "accelerant value below zero but non-null ignition point" if(length(dissolves_into) && isnull(dissolves_in)) . += "dissolves_into set but dissolves_in is undefined" if(length(heating_products) && isnull(heating_point)) @@ -441,6 +449,19 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) return MAT_PHASE_LIQUID return MAT_PHASE_SOLID +// Returns the number of mols of material for the amount of solid or liquid units passed. +/decl/material/proc/get_mols_from_units(units, phase) + var/ml = units*10 // Rough estimation. + switch(phase) + if(MAT_PHASE_LIQUID) + var/kg = (liquid_density*ml)/1000 + return kg/molar_mass + if(MAT_PHASE_SOLID) + var/kg = (solid_density*ml)/1000 + return kg/molar_mass + else + log_warning("Invalid phase '[phase]' passed to get_mols_from_units!") + return units // Used by walls when qdel()ing to avoid neighbor merging. /decl/material/placeholder name = "placeholder" @@ -544,28 +565,29 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) affectedbook.dat = null to_chat(usr, SPAN_NOTICE("The solution dissolves the ink on the book.")) - if(solvent_power >= MAT_SOLVENT_STRONG && !O.unacidable && (istype(O, /obj/item) || istype(O, /obj/effect/vine)) && (REAGENT_VOLUME(holder, type) > solvent_melt_dose)) - var/obj/effect/decal/cleanable/molten_item/I = new(O.loc) - I.visible_message(SPAN_DANGER("\The [O] dissolves!")) - I.desc = "It looks like it was \a [O] some time ago." - qdel(O) + if(solvent_power >= MAT_SOLVENT_STRONG && O.solvent_can_melt(solvent_power) && (istype(O, /obj/item) || istype(O, /obj/effect/vine)) && (REAGENT_VOLUME(holder, type) > solvent_melt_dose)) + O.visible_message(SPAN_DANGER("\The [O] dissolves!")) + O.melt() holder?.remove_reagent(type, solvent_melt_dose) - - if(dirtiness <= DIRTINESS_STERILE) - O.germ_level -= min(REAGENT_VOLUME(holder, type)*20, O.germ_level) - O.was_bloodied = null - - if(dirtiness <= DIRTINESS_CLEAN) - O.clean_blood() - - if(defoliant && istype(O, /obj/effect/vine)) + else if(defoliant && istype(O, /obj/effect/vine)) qdel(O) + else + if(dirtiness <= DIRTINESS_DECONTAMINATE) + if(amount >= decontamination_dose && istype(O, /obj/item)) + var/obj/item/I = O + if(I.contaminated) + I.decontaminate() + if(dirtiness <= DIRTINESS_STERILE) + O.germ_level -= min(REAGENT_VOLUME(holder, type)*20, O.germ_level) + O.was_bloodied = null + if(dirtiness <= DIRTINESS_CLEAN) + O.clean_blood() #define FLAMMABLE_LIQUID_DIVISOR 7 // This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing. /decl/material/proc/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) - if(fuel_value && amount && istype(M)) - M.fire_stacks += FLOOR((amount * fuel_value)/FLAMMABLE_LIQUID_DIVISOR) + if(accelerant_value != FUEL_VALUE_NONE && amount && istype(M)) + M.fire_stacks += FLOOR((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR) #undef FLAMMABLE_LIQUID_DIVISOR /decl/material/proc/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) // Cleaner cleaning, lube lubbing, etc, all go here @@ -728,34 +750,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) return M.clean_blood() - if(solvent_power >= MAT_SOLVENT_STRONG && removed >= solvent_melt_dose) - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - for(var/slot in global.standard_headgear_slots) - var/obj/item/thing = H.get_equipped_item(slot) - if(!istype(thing)) - continue - if(thing.unacidable || !H.try_unequip(thing)) - to_chat(H, SPAN_NOTICE("Your [thing] protects you from the acid.")) - holder.remove_reagent(type, REAGENT_VOLUME(holder, type)) - return - to_chat(H, SPAN_DANGER("Your [thing] dissolves!")) - qdel(thing) - removed -= solvent_melt_dose - if(removed <= 0) - return - - if(!H.unacidable) - var/screamed - for(var/obj/item/organ/external/affecting in H.get_external_organs()) - if(!screamed && affecting.can_feel_pain()) - screamed = TRUE - H.emote("scream") - affecting.status |= ORGAN_DISFIGURED - - if(!M.unacidable) - M.take_organ_damage(0, min(removed * solvent_power * ((removed < solvent_melt_dose) ? 0.1 : 0.2), solvent_max_damage), override_droplimb = DISMEMBER_METHOD_ACID) + if(solvent_power > MAT_SOLVENT_NONE && removed >= solvent_melt_dose && M.solvent_act(min(removed * solvent_power * ((removed < solvent_melt_dose) ? 0.1 : 0.2), solvent_max_damage), solvent_melt_dose, solvent_power)) + holder.remove_reagent(type, REAGENT_VOLUME(holder, type)) /decl/material/proc/affect_overdose(var/mob/living/M) // Overdose effect. Doesn't happen instantly. M.add_chemical_effect(CE_TOXIN, 1) @@ -818,3 +814,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) total_interacted_units -= interacted_units if(total_interacted_units <= 0) return + +/decl/material/proc/add_burn_product(var/atom/location, var/amount) + var/datum/gas_mixture/environment = istype(location, /datum/gas_mixture) ? location : location?.return_air() + if(!environment || amount <= 0 || !burn_product) + return + environment.adjust_gas(burn_product, amount) diff --git a/code/modules/materials/definitions/gasses/material_gas_mundane.dm b/code/modules/materials/definitions/gasses/material_gas_mundane.dm index a4bc989ec7c..e00322da326 100644 --- a/code/modules/materials/definitions/gasses/material_gas_mundane.dm +++ b/code/modules/materials/definitions/gasses/material_gas_mundane.dm @@ -325,7 +325,7 @@ lore_text = "A radioactive isotope of hydrogen. Useful as a fusion reactor fuel material." mechanics_text = "Tritium is useable as a fuel in some forms of portable generator. It can also be converted into a fuel rod suitable for a R-UST fusion plant injector by using a fuel compressor. It fuses hotter than deuterium but is correspondingly more unstable." color = "#777777" - stack_origin_tech = "{'materials':5}" + stack_origin_tech = @'{"materials":5}' value = 0.45 gas_symbol_html = "T" gas_symbol = "T" @@ -340,7 +340,7 @@ mechanics_text = "Deuterium can be converted into a fuel rod suitable for a R-UST fusion plant injector by using a fuel compressor. It is the most 'basic' fusion fuel." flags = MAT_FLAG_FUSION_FUEL | MAT_FLAG_FISSIBLE color = "#999999" - stack_origin_tech = "{'materials':3}" + stack_origin_tech = @'{"materials":3}' gas_symbol_html = "D" gas_symbol = "D" value = 0.5 diff --git a/code/modules/materials/definitions/liquids/_mat_liquid.dm b/code/modules/materials/definitions/liquids/_mat_liquid.dm index 1d2557498c1..d2ba6fda28f 100644 --- a/code/modules/materials/definitions/liquids/_mat_liquid.dm +++ b/code/modules/materials/definitions/liquids/_mat_liquid.dm @@ -6,6 +6,7 @@ molar_mass = 0.018 //water latent_heat = 2258 abstract_type = /decl/material/liquid + accelerant_value = FUEL_VALUE_RETARDANT // Abstract way of dousing fires with fluid; realistically it should deprive them of oxidizer but heigh ho /decl/material/liquid/Initialize() if(!gas_name) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm b/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm index 0f33519b30f..7d30f721cc9 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm @@ -9,8 +9,8 @@ value = 1.2 solvent_power = MAT_SOLVENT_STRONG + 2 solvent_melt_dose = 10 - boiling_point = 290 CELSIUS - melting_point = 10 CELSIUS + melting_point = 284 + boiling_point = 611 latent_heat = 612 molar_mass = 0.098 @@ -24,8 +24,8 @@ solvent_melt_dose = 8 solvent_max_damage = 30 value = 1.5 - boiling_point = 48 CELSIUS - melting_point = -30 CELSIUS + boiling_point = 382 + melting_point = 160 molar_mass = 0.036 /decl/material/liquid/acid/polyacid @@ -62,7 +62,7 @@ value = 0.1 solvent_power = MAT_SOLVENT_MODERATE toxicity = 3 - boiling_point = 56 CELSIUS - melting_point = -95 CELSIUS + boiling_point = 330 + melting_point = 179 latent_heat = 525 molar_mass = 0.058 diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 6d17f049749..2d6705b8219 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -88,6 +88,8 @@ lore_text = "A highly toxic chemical." taste_mult = 0.6 color = "#cf3600" + melting_point = 261 + boiling_point = 299 toxicity = 20 metabolism = REM * 2 toxicity_targets_organ = BP_HEART @@ -271,6 +273,8 @@ uid = "liquid_mercury" lore_text = "A chemical element." taste_mult = 0 //mercury apparently is tasteless. IDK + melting_point = 234 + boiling_point = 629 color = "#484848" value = 0.5 narcosis = 5 diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 74337d9613c..e68140e2883 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -45,7 +45,7 @@ var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) if(M.mind && godcult.is_antagonist(M.mind)) if(REAGENT_VOLUME(holder, type) > 5) - M.adjustHalLoss(5) + M.adjustHalLoss(5, do_update_health = FALSE) M.adjustBruteLoss(1) if(prob(10)) //Only annoy them a /bit/ to_chat(M,"You feel your insides curdle and burn! \[Give Into Purity\]") diff --git a/code/modules/materials/definitions/solids/materials_solid_elements.dm b/code/modules/materials/definitions/solids/materials_solid_elements.dm index 1c199fb3f45..15f4da448d6 100644 --- a/code/modules/materials/definitions/solids/materials_solid_elements.dm +++ b/code/modules/materials/definitions/solids/materials_solid_elements.dm @@ -2,6 +2,8 @@ name = "boron" uid = "solid_boron" lore_text = "Boron is a chemical element with the symbol B and atomic number 5." + melting_point = 2349 + boiling_point = 4200 flags = MAT_FLAG_FUSION_FUEL | MAT_FLAG_FISSIBLE neutron_cross_section = 10 @@ -18,6 +20,8 @@ name = "lithium" uid = "solid_lithium" lore_text = "A chemical element, used as antidepressant." + melting_point = 453 + boiling_point = 1615 flags = MAT_FLAG_FUSION_FUEL taste_description = "metal" color = "#808080" @@ -28,6 +32,8 @@ name = "carbon" uid = "solid_carbon" lore_text = "A chemical element, the building block of life." + melting_point = 3800 + boiling_point = 4300 taste_description = "sour chalk" taste_mult = 1.5 color = "#1c1300" @@ -46,6 +52,8 @@ name = "phosphorus" uid = "solid_phosphorus" lore_text = "A chemical element, the backbone of biological energy carriers." + melting_point = 317 + boiling_point = 550 taste_description = "vinegar" color = "#832828" value = 0.5 @@ -61,6 +69,8 @@ name = "sodium" uid = "solid_sodium" lore_text = "A chemical element, readily reacts with water." + melting_point = 1687 + boiling_point = 3173 taste_description = "salty metal" color = "#808080" value = 0.5 @@ -69,6 +79,8 @@ name = "sulfur" uid = "solid_sulfur" lore_text = "A chemical element with a pungent smell." + melting_point = 388 + boiling_point = 717 taste_description = "old eggs" color = "#bf8c00" value = 0.5 @@ -77,6 +89,8 @@ name = "potassium" uid = "solid_potassium" lore_text = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + melting_point = 336 + boiling_point = 1032 taste_description = "sweetness" //potassium is bitter in higher doses but sweet in lower ones. color = "#a0a0a0" value = 0.5 diff --git a/code/modules/materials/definitions/solids/materials_solid_exotic.dm b/code/modules/materials/definitions/solids/materials_solid_exotic.dm index 2fef16f05a9..3415cc24846 100644 --- a/code/modules/materials/definitions/solids/materials_solid_exotic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_exotic.dm @@ -4,7 +4,7 @@ lore_text = "When hydrogen is exposed to extremely high pressures and temperatures, such as at the core of gas giants like Jupiter, it can take on metallic properties and - more importantly - acts as a room temperature superconductor. Achieving solid metallic hydrogen at room temperature, though, has proven to be rather tricky." name = "metallic hydrogen" color = "#e6c5de" - stack_origin_tech = "{'materials':6,'powerstorage':6,'magnets':5}" + stack_origin_tech = @'{"materials":6,"powerstorage":6,"magnets":5}' heating_products = list( /decl/material/gas/hydrogen/tritium = 0.7, /decl/material/gas/hydrogen/deuterium = 0.3 @@ -38,7 +38,7 @@ lore_text = "Hypercrystalline supermatter is a subset of non-baryonic 'exotic' matter. It is found mostly in the heart of large stars, and features heavily in all kinds of fringe physics-defying technology." color = "#ffff00" radioactivity = 20 - stack_origin_tech = "{'wormholes':2,'materials':6,'exoticmatter':4}" + stack_origin_tech = @'{"wormholes":2,"materials":6,"exoticmatter":4}' luminescence = 3 value = 3 icon_base = 'icons/turf/walls/stone.dmi' @@ -59,7 +59,7 @@ taste_mult = 1.5 toxicity = 30 touch_met = 5 - fuel_value = 2 + accelerant_value = FUEL_VALUE_VOLATILE vapor_products = list( /decl/material/solid/exotic_matter = 1 ) diff --git a/code/modules/materials/definitions/solids/materials_solid_fission.dm b/code/modules/materials/definitions/solids/materials_solid_fission.dm index a4733fae3f7..f68c8c85673 100644 --- a/code/modules/materials/definitions/solids/materials_solid_fission.dm +++ b/code/modules/materials/definitions/solids/materials_solid_fission.dm @@ -41,6 +41,8 @@ table_icon_base = "stone" icon_reinf = 'icons/turf/walls/reinforced_stone.dmi' wall_flags = 0 //Since we're using an unpaintable icon_base and icon_reinf + melting_point = 910 + boiling_point = 4300 color = "#404c53" value = 0.5 exoplanet_rarity_plant = MAT_RARITY_UNCOMMON @@ -65,6 +67,8 @@ table_icon_base = "stone" icon_reinf = 'icons/turf/walls/reinforced_stone.dmi' wall_flags = 0 //Since we're using an unpaintable icon_base and icon_reinf + melting_point = 912 + boiling_point = 3503 color = "#b5c5a2" value = 3 exoplanet_rarity_plant = MAT_RARITY_UNCOMMON @@ -101,4 +105,4 @@ dissolves_into = list( /decl/material/solid/metal/radium = 0.5, /decl/material/solid/lithium = 0.5 - ) \ No newline at end of file + ) diff --git a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm index ca0fe922c53..2011742fb68 100644 --- a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm +++ b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm @@ -18,9 +18,12 @@ name = "diamond" uid = "solid_diamond" lore_text = "An extremely hard allotrope of carbon. Valued for its use in industrial tools." + melting_point = 4300 + boiling_point = null + ignition_point = null brute_armor = 10 burn_armor = 50 // Diamond walls are immune to fire, therefore it makes sense for them to be almost undamageable by burn damage type. - stack_origin_tech = "{'materials':6}" + stack_origin_tech = @'{"materials":6}' hardness = MAT_VALUE_VERY_HARD + 20 construction_difficulty = MAT_VALUE_VERY_HARD_DIY ore_name = "rough diamonds" diff --git a/code/modules/materials/definitions/solids/materials_solid_glass.dm b/code/modules/materials/definitions/solids/materials_solid_glass.dm index 605e0c9bb46..23e3b308050 100644 --- a/code/modules/materials/definitions/solids/materials_solid_glass.dm +++ b/code/modules/materials/definitions/solids/materials_solid_glass.dm @@ -12,7 +12,7 @@ hardness = MAT_VALUE_RIGID + 10 door_icon_base = "metal" reflectiveness = MAT_VALUE_SHINY - melting_point = 1873 + melting_point = 1674 boiling_point = null ignition_point = null weight = MAT_VALUE_VERY_LIGHT @@ -32,7 +32,7 @@ return ..() && !is_reinforced() /decl/material/solid/glass/borosilicate - name = "borosilicate glass" + name = "heat-resistant glass" codex_name = null uid = "solid_borosilicate_glass" lore_text = "An extremely heat-resistant form of glass." @@ -42,9 +42,9 @@ integrity = 70 brute_armor = 2 burn_armor = 5 - melting_point = T0C + 4000 + melting_point = 4274 color = GLASS_COLOR_SILICATE - stack_origin_tech = "{'materials':4}" + stack_origin_tech = @'{"materials":4}' construction_difficulty = MAT_VALUE_HARD_DIY value = 1.8 @@ -54,11 +54,11 @@ lore_text = "A form of glass-reinforced plastic made from glass fibers and a polymer resin." dissolves_into = list( /decl/material/solid/glass = 0.7, - /decl/material/solid/plastic = 0.3 + /decl/material/solid/organic/plastic = 0.3 ) color = COLOR_OFF_WHITE opacity = 0.6 - melting_point = 1400 + melting_point = 1674 hardness = MAT_VALUE_HARD weight = MAT_VALUE_LIGHT integrity = 120 @@ -69,7 +69,7 @@ door_icon_base = "plastic" hardness = MAT_VALUE_FLEXIBLE weight = MAT_VALUE_LIGHT - stack_origin_tech = "{'materials':3}" + stack_origin_tech = @'{"materials":3}' conductive = 0 construction_difficulty = MAT_VALUE_NORMAL_DIY reflectiveness = MAT_VALUE_MATTE diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index 6e02c04bf18..3f0c17f190a 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -86,8 +86,8 @@ use_name = null codex_name = null heating_products = list( - /decl/material/gas/ammonia = 0.4, - /decl/material/liquid/water = 0.2, + /decl/material/gas/ammonia = 0.05, + /decl/material/liquid/water = 0.55, /decl/material/liquid/ethanol = 0.4 ) uid = "solid_ice_ediroite" @@ -101,10 +101,10 @@ codex_name = null uid = "solid_ice_hydrogen" heating_products = list( - /decl/material/gas/hydrogen = 0.2, - /decl/material/liquid/water = 0.65, - /decl/material/gas/hydrogen/deuterium = 0.1, - /decl/material/gas/hydrogen/tritium = 0.05 + /decl/material/gas/hydrogen = 0.05, + /decl/material/liquid/water = 0.92, + /decl/material/gas/hydrogen/deuterium = 0.02, + /decl/material/gas/hydrogen/tritium = 0.01 ) value = 0.3 sparse_material_weight = 20 @@ -124,13 +124,13 @@ //Little helper macro, since hydrates are all basically the same // DISPLAY_NAME is needed because of compounds with white spaces in their names -#define DECLARE_HYDRATE_DNAME_PATH(PATH, NAME, DISPLAY_NAME) \ -/decl/material/solid/ice/hydrate/##NAME/uid = "solid_hydrate_##NAME"; \ -/decl/material/solid/ice/hydrate/##NAME/Initialize(){ \ - name = "[##DISPLAY_NAME] hydrate"; \ - heating_products = list(PATH = 0.2, /decl/material/liquid/water = 0.8); \ - . = ..(); \ -} \ +#define DECLARE_HYDRATE_DNAME_PATH(PATH, NAME, DISPLAY_NAME) \ +/decl/material/solid/ice/hydrate/##NAME/uid = "solid_hydrate_" + #NAME; \ +/decl/material/solid/ice/hydrate/##NAME/name = #DISPLAY_NAME + " hydrate"; \ +/decl/material/solid/ice/hydrate/##NAME/heating_products = list( \ + PATH = 0.1, \ + /decl/material/liquid/water = 0.9 \ +); \ /decl/material/solid/ice/hydrate/##NAME #define DECLARE_HYDRATE_DNAME(NAME, DISPLAY_NAME) DECLARE_HYDRATE_DNAME_PATH(/decl/material/gas/##NAME, NAME, DISPLAY_NAME) diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index 5fca3b43d5e..8d247963b5f 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -27,6 +27,8 @@ lore_text = "A silvery-white metallic chemical element in the actinide series, weakly radioactive. Commonly used as fuel in fission reactors." mechanics_text = "Uranium can be used as fuel in fission reactors." taste_description = "the inside of a reactor" + melting_point = 1407 + boiling_point = 4074 flags = MAT_FLAG_FISSIBLE radioactivity = 12 icon_base = 'icons/turf/walls/stone.dmi' @@ -35,7 +37,7 @@ icon_reinf = 'icons/turf/walls/reinforced_stone.dmi' color = "#007a00" weight = MAT_VALUE_VERY_HEAVY - stack_origin_tech = "{'materials':5}" + stack_origin_tech = @'{"materials":5}' reflectiveness = MAT_VALUE_MATTE value = 1.5 default_solid_form = /obj/item/stack/material/puck @@ -67,6 +69,8 @@ lore_text = "Radium is an alkaline earth metal. It is extremely radioactive." mechanics_text = "Radium can be used as a neutron source in fission reactors." taste_description = "the color blue, and regret" + melting_point = 1234 + boiling_point = 1414 color = "#c7c7c7" value = 0.5 radioactivity = 18 @@ -76,10 +80,12 @@ codex_name = "elemental gold" uid = "solid_gold" lore_text = "A heavy, soft, ductile metal. Once considered valuable enough to back entire currencies, now predominantly used in corrosion-resistant electronics." + melting_point = 1337 + boiling_point = 2974 color = COLOR_GOLD hardness = MAT_VALUE_FLEXIBLE + 5 integrity = 100 - stack_origin_tech = "{'materials':4}" + stack_origin_tech = @'{"materials":4}' ore_result_amount = 5 ore_name = "native gold" ore_spread_chance = 10 @@ -96,6 +102,8 @@ codex_name = "bronze alloy" uid = "solid_bronze" lore_text = "An alloy of copper and tin. Once used in weapons and laboring tools." + melting_point = 1184 + boiling_point = 2574 color = "#ccbc63" brute_armor = 3 hardness = MAT_VALUE_RIGID + 10 @@ -136,6 +144,8 @@ name = "brass" uid = "solid_brass" lore_text = "An alloy of copper and zinc. Renowned for its golden color." + melting_point = 1174 + boiling_point = 1374 color = "#dab900" reflectiveness = MAT_VALUE_VERY_SHINY value = 1.2 @@ -147,18 +157,22 @@ name = "copper" uid = "solid_copper" lore_text = "A metal used in some components and many alloys. Known for its color-shifting properties when oxidized." + melting_point = 1357 + boiling_point = 2774 color = COLOR_COPPER weight = MAT_VALUE_NORMAL hardness = MAT_VALUE_FLEXIBLE + 10 - stack_origin_tech = "{'materials':2}" + stack_origin_tech = @'{"materials":2}' /decl/material/solid/metal/silver name = "silver" uid = "solid_silver" lore_text = "A soft, white, lustrous transition metal. Has many and varied industrial uses in electronics, solar panels and mirrors." + melting_point = 1234 + boiling_point = 2444 color = "#d1e6e3" hardness = MAT_VALUE_FLEXIBLE + 10 - stack_origin_tech = "{'materials':3}" + stack_origin_tech = @'{"materials":3}' ore_result_amount = 5 ore_spread_chance = 10 ore_name = "native silver" @@ -175,6 +189,8 @@ codex_name = "carbon steel" uid = "solid_steel" lore_text = "A strong, flexible alloy of iron and carbon. Probably the single most fundamentally useful and ubiquitous substance in human space." + melting_point = 1734 + boiling_point = 2774 weight = MAT_VALUE_NORMAL wall_support_value = MAT_VALUE_VERY_HEAVY // Ideal construction material. hardness = MAT_VALUE_HARD @@ -194,27 +210,28 @@ ) default_solid_form = /obj/item/stack/material/sheet -/decl/material/solid/metal/steel/generate_recipes(var/reinforce_material) +/decl/material/solid/metal/steel/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/furniture/closet(src) - . += new/datum/stack_recipe/furniture/tank_dispenser(src) - . += new/datum/stack_recipe/furniture/canister(src) - . += new/datum/stack_recipe/furniture/tank(src) - . += new/datum/stack_recipe/cannon(src) - . += new/datum/stack_recipe_list("tiling", create_recipe_list(/datum/stack_recipe/tile/metal)) - . += new/datum/stack_recipe/furniture/computerframe(src) - . += new/datum/stack_recipe/furniture/machine(src) - . += new/datum/stack_recipe_list("airlock assemblies", create_recipe_list(/datum/stack_recipe/furniture/door_assembly)) - . += new/datum/stack_recipe/grenade(src) - . += new/datum/stack_recipe/light(src) - . += new/datum/stack_recipe/light_small(src) - . += new/datum/stack_recipe/light_switch(src) - . += new/datum/stack_recipe/light_switch/windowtint(src) - . += new/datum/stack_recipe/apc(src) - . += new/datum/stack_recipe/air_alarm(src) - . += new/datum/stack_recipe/fire_alarm(src) + if(!reinforce_material && islist(.)) + if(!ispath(stack_type)) + . += new/datum/stack_recipe/furniture/closet(src) + . += new/datum/stack_recipe/furniture/tank_dispenser(src) + . += new/datum/stack_recipe/furniture/canister(src) + . += new/datum/stack_recipe/furniture/tank(src) + . += new/datum/stack_recipe/cannon(src) + . += new/datum/stack_recipe_list("tiling", create_recipe_list(/datum/stack_recipe/tile/metal)) + . += new/datum/stack_recipe/furniture/computerframe(src) + . += new/datum/stack_recipe_list("airlock assemblies", create_recipe_list(/datum/stack_recipe/furniture/door_assembly)) + . += new/datum/stack_recipe/grenade(src) + . += new/datum/stack_recipe/light(src) + . += new/datum/stack_recipe/light_small(src) + . += new/datum/stack_recipe/light_switch(src) + . += new/datum/stack_recipe/light_switch/windowtint(src) + . += new/datum/stack_recipe/apc(src) + . += new/datum/stack_recipe/air_alarm(src) + . += new/datum/stack_recipe/fire_alarm(src) + else if(ispath(stack_type, /obj/item/stack/material/strut)) + . += new/datum/stack_recipe/furniture/machine(src) /decl/material/solid/metal/steel/holographic name = "holographic steel" @@ -226,13 +243,15 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/metal/steel/holographic/get_recipes(reinf_mat) +/decl/material/solid/metal/steel/holographic/get_recipes(stack_type, reinf_mat) return list() /decl/material/solid/metal/stainlesssteel name = "stainless steel" uid = "solid_stainless_steel" lore_text = "A reflective alloy of steel and chromium. Used for its reflective and sturdy properties." + melting_point = 1784 + boiling_point = null wall_support_value = MAT_VALUE_HEAVY integrity = 175 burn_armor = 10 @@ -252,6 +271,8 @@ name = "aluminium" uid = "solid_aluminium" lore_text = "A low-density ductile metal with a silvery-white sheen." + melting_point = 932 + boiling_point = 2474 integrity = 125 weight = MAT_VALUE_LIGHT icon_base = 'icons/turf/walls/solid.dmi' @@ -263,11 +284,10 @@ taste_description = "metal" default_solid_form = /obj/item/stack/material/shiny -/decl/material/solid/metal/aluminium/generate_recipes(var/reinforce_material) +/decl/material/solid/metal/aluminium/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/grenade(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/grenade(src) /decl/material/solid/metal/aluminium/holographic name = "holoaluminium" @@ -278,7 +298,7 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/metal/aluminium/holographic/get_recipes(reinf_mat) +/decl/material/solid/metal/aluminium/holographic/get_recipes(stack_type, reinf_mat) return list() /decl/material/solid/metal/plasteel @@ -297,7 +317,7 @@ brute_armor = 8 burn_armor = 10 hardness = MAT_VALUE_VERY_HARD - stack_origin_tech = "{'materials':2}" + stack_origin_tech = @'{"materials":2}' hitsound = 'sound/weapons/smash.ogg' value = 1.4 reflectiveness = MAT_VALUE_MATTE @@ -305,13 +325,12 @@ exoplanet_rarity_plant = MAT_RARITY_UNCOMMON exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/metal/plasteel/generate_recipes(var/reinforce_material) +/decl/material/solid/metal/plasteel/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/ai_core(src) - . += new/datum/stack_recipe/furniture/crate(src) - . += new/datum/stack_recipe/grip(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/ai_core(src) + . += new/datum/stack_recipe/furniture/crate(src) + . += new/datum/stack_recipe/grip(src) /decl/material/solid/metal/titanium name = "titanium" @@ -320,7 +339,8 @@ brute_armor = 10 burn_armor = 8 integrity = 200 - melting_point = 3000 + melting_point = 1944 + boiling_point = 3474 weight = MAT_VALUE_LIGHT icon_base = 'icons/turf/walls/metal.dmi' wall_flags = PAINT_PAINTABLE @@ -331,18 +351,17 @@ value = 1.5 explosion_resistance = 25 hardness = MAT_VALUE_VERY_HARD - stack_origin_tech = "{'materials':2}" + stack_origin_tech = @'{"materials":2}' hitsound = 'sound/weapons/smash.ogg' reflectiveness = MAT_VALUE_MATTE default_solid_form = /obj/item/stack/material/reinforced -/decl/material/solid/metal/titanium/generate_recipes(var/reinforce_material) +/decl/material/solid/metal/titanium/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/ai_core(src) - . += new/datum/stack_recipe/furniture/crate(src) - . += new/datum/stack_recipe/grip(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/ai_core(src) + . += new/datum/stack_recipe/furniture/crate(src) + . += new/datum/stack_recipe/grip(src) /decl/material/solid/metal/plasteel/ocp name = "osmium-carbide plasteel" @@ -357,7 +376,7 @@ color = "#9bc6f2" brute_armor = 4 burn_armor = 20 - stack_origin_tech = "{'materials':3}" + stack_origin_tech = @'{"materials":3}' construction_difficulty = MAT_VALUE_VERY_HARD_DIY value = 1.8 exoplanet_rarity_plant = MAT_RARITY_UNCOMMON @@ -367,8 +386,10 @@ name = "osmium" uid = "solid_osmium" lore_text = "An extremely hard form of platinum." + melting_point = 3307 + boiling_point = 5285 color = "#9999ff" - stack_origin_tech = "{'materials':5}" + stack_origin_tech = @'{"materials":5}' construction_difficulty = MAT_VALUE_VERY_HARD_DIY value = 1.3 @@ -376,10 +397,12 @@ name = "platinum" uid = "solid_platinum" lore_text = "A very dense, unreactive, precious metal. Has many industrial uses, particularly as a catalyst." + melting_point = 2041 + boiling_point = 4098 color = "#deddff" weight = MAT_VALUE_VERY_HEAVY wall_support_value = MAT_VALUE_VERY_HEAVY - stack_origin_tech = "{'materials':2}" + stack_origin_tech = @'{"materials":2}' ore_compresses_to = /decl/material/solid/metal/osmium ore_result_amount = 5 ore_spread_chance = 10 @@ -396,6 +419,8 @@ name = "iron" uid = "solid_iron" lore_text = "A ubiquitous, very common metal. The epitaph of stars and the primary ingredient in Earth's core." + melting_point = 1811 + boiling_point = 3134 color = "#5c5454" hitsound = 'sound/weapons/smash.ogg' construction_difficulty = MAT_VALUE_NORMAL_DIY @@ -412,6 +437,8 @@ name = "tin" uid = "solid_tin" lore_text = "A soft metal that can be cut without much force. Used in many alloys." + melting_point = 505 + boiling_point = 2875 color = "#c5c5a8" hardness = MAT_VALUE_SOFT + 10 construction_difficulty = MAT_VALUE_EASY_DIY @@ -421,6 +448,8 @@ name = "lead" uid = "solid_lead" lore_text = "A very soft, heavy and poisonous metal. You probably shouldn't lick it." + melting_point = 600 + boiling_point = 2022 color = "#3f3f4d" hardness = MAT_VALUE_SOFT construction_difficulty = MAT_VALUE_NORMAL_DIY @@ -432,6 +461,8 @@ name = "zinc" uid = "solid_zinc" lore_text = "A dull-looking metal with some use in alloying." + melting_point = 692 + boiling_point = 1180 color = "#92aae4" construction_difficulty = MAT_VALUE_NORMAL_DIY reflectiveness = MAT_VALUE_MATTE @@ -443,7 +474,8 @@ color = "#dadada" integrity = 200 burn_armor = 15 // Strong against laser weaponry, but not as good as OCP. - melting_point = 6000 + melting_point = 2180 + boiling_point = 2944 icon_base = 'icons/turf/walls/solid.dmi' icon_reinf = 'icons/turf/walls/reinforced.dmi' wall_flags = PAINT_PAINTABLE|PAINT_STRIPABLE|WALL_HAS_EDGES diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 37954cec619..61e286145e0 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -13,7 +13,7 @@ ore_spread_chance = 10 ore_name = "pitchblende" ore_scan_icon = "mineral_uncommon" - stack_origin_tech = "{'materials':5}" + stack_origin_tech = @'{"materials":5}' xarch_source_mineral = /decl/material/solid/phosphorus ore_icon_overlay = "nugget" value = 0.8 @@ -38,11 +38,14 @@ ore_icon_overlay = "lump" ore_type_value = ORE_SURFACE ore_data_value = 1 + melting_point = 4074 + boiling_point = 4474 + ignition_point = 774 + accelerant_value = 0.8 burn_product = /decl/material/gas/carbon_monoxide value = 0.8 sparse_material_weight = 35 rich_material_weight = 20 - fuel_value = 0.8 dirtiness = 15 flags = MAT_FLAG_FISSIBLE @@ -66,6 +69,8 @@ ore_spread_chance = 10 ore_scan_icon = "mineral_common" ore_icon_overlay = "lump" + melting_point = 1744 + boiling_point = 2504 color = "#effffe" reflectiveness = MAT_VALUE_SHINY sparse_material_weight = 3 @@ -385,7 +390,8 @@ value = 1.2 sparse_material_weight = 10 rich_material_weight = 5 - fuel_value = 0.9 + ignition_point = 774 + accelerant_value = 0.9 dirtiness = 15 dissolves_into = list( /decl/material/solid/carbon = 0.1, @@ -416,7 +422,6 @@ value = 0.9 sparse_material_weight = 20 rich_material_weight = 10 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/tin = 0.8, /decl/material/solid/metal/tungsten = 0.2 @@ -445,7 +450,6 @@ value = 0.9 sparse_material_weight = 15 rich_material_weight = 10 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/tin = 0.1, /decl/material/solid/metal/tungsten = 0.6, @@ -475,7 +479,6 @@ value = 1.1 sparse_material_weight = 10 rich_material_weight = 5 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/platinum = 0.7, /decl/material/solid/metal/iron = 0.1, @@ -505,7 +508,6 @@ value = 0.8 sparse_material_weight = 25 rich_material_weight = 15 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/zinc = 0.7, /decl/material/solid/metal/iron = 0.2, @@ -534,7 +536,6 @@ value = 0.8 sparse_material_weight = 20 rich_material_weight = 10 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/lead = 0.7, /decl/material/solid/metal/iron = 0.2, @@ -563,7 +564,6 @@ value = 0.8 sparse_material_weight = 5 rich_material_weight = 5 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/gold = 0.7, /decl/material/solid/metal/silver = 0.3 @@ -591,7 +591,6 @@ value = 0.9 sparse_material_weight = 5 rich_material_weight = 10 - fuel_value = 0.8 dissolves_into = list( /decl/material/solid/metal/chromium = 0.6, /decl/material/solid/metal/lead = 0.4 diff --git a/code/modules/materials/definitions/solids/materials_solid_mundane.dm b/code/modules/materials/definitions/solids/materials_solid_mundane.dm index 419072501a4..ba5f63c75d3 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mundane.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mundane.dm @@ -9,12 +9,13 @@ reflectiveness = MAT_VALUE_DULL wall_support_value = MAT_VALUE_LIGHT dissolves_into = list( - /decl/material/solid/sand = 0.5, - /decl/material/solid/metal/iron = 0.2, + /decl/material/solid/sand = 0.3, + /decl/material/solid/clay = 0.2, + /decl/material/solid/metal/iron = 0.2, /decl/material/solid/metal/aluminium = 0.05, - /decl/material/solid/phosphorus = 0.05, - /decl/material/gas/sulfur_dioxide = 0.05, - /decl/material/gas/carbon_dioxide = 0.05 + /decl/material/solid/phosphorus = 0.05, + /decl/material/gas/sulfur_dioxide = 0.05, + /decl/material/gas/carbon_dioxide = 0.05 ) value = 0.1 default_solid_form = /obj/item/stack/material/lump @@ -24,10 +25,11 @@ // Slag can be reclaimed into more useful forms by grinding it up and mixing it with strong acid. dissolves_in = MAT_SOLVENT_STRONG dissolves_into = list( - /decl/material/solid/sand = 0.7, - /decl/material/solid/metal/iron = 0.1, + /decl/material/solid/sand = 0.5, + /decl/material/solid/clay = 0.2, + /decl/material/solid/metal/iron = 0.1, /decl/material/solid/metal/aluminium = 0.05, - /decl/material/solid/phosphorus = 0.05, - /decl/material/gas/sulfur_dioxide = 0.05, - /decl/material/gas/carbon_dioxide = 0.05 + /decl/material/solid/phosphorus = 0.05, + /decl/material/gas/sulfur_dioxide = 0.05, + /decl/material/gas/carbon_dioxide = 0.05 ) diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index c481a2acd62..0e3a7623b34 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -1,4 +1,10 @@ -/decl/material/solid/plastic +/decl/material/solid/organic + abstract_type = /decl/material/solid/organic + ignition_point = T0C+500 // Based on loose ignition temperature of plastic + accelerant_value = 0.1 + burn_product = /decl/material/gas/carbon_monoxide + +/decl/material/solid/organic/plastic name = "plastic" uid = "solid_plastic" lore_text = "A generic polymeric material. Probably the most flexible and useful substance ever created by human science; mostly used to make disposable cutlery." @@ -12,32 +18,54 @@ hardness = MAT_VALUE_FLEXIBLE + 10 weight = MAT_VALUE_LIGHT melting_point = T0C+371 //assuming heat resistant plastic - stack_origin_tech = "{'materials':3}" + stack_origin_tech = @'{"materials":3}' conductive = 0 construction_difficulty = MAT_VALUE_NORMAL_DIY reflectiveness = MAT_VALUE_SHINY wall_support_value = MAT_VALUE_EXTREMELY_LIGHT taste_description = "plastic" - fuel_value = 0.6 - burn_product = /decl/material/gas/carbon_monoxide // placeholder for more appropriate toxins + accelerant_value = 0.6 dooropen_noise = 'sound/effects/doorcreaky.ogg' default_solid_form = /obj/item/stack/material/panel sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/plastic/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/plastic/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/furniture/crate/plastic(src) - . += new/datum/stack_recipe/bag(src) - . += new/datum/stack_recipe/ivbag(src) - . += create_recipe_list(/datum/stack_recipe/cartridge) - . += create_recipe_list(/datum/stack_recipe/tile/light) - . += new/datum/stack_recipe/hazard_cone(src) - . += new/datum/stack_recipe/furniture/flaps(src) - -/decl/material/solid/plastic/holographic + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/furniture/crate/plastic(src) + . += new/datum/stack_recipe/bag(src) + . += new/datum/stack_recipe/ivbag(src) + . += create_recipe_list(/datum/stack_recipe/cartridge) + . += create_recipe_list(/datum/stack_recipe/tile/light) + . += new/datum/stack_recipe/hazard_cone(src) + . += new/datum/stack_recipe/furniture/flaps(src) + +/decl/material/solid/organic/wax + name = "wax" + uid = "solid_wax" + taste_description = "waxy blandness" + lore_text = "A soft, easily melted substance produced by bees. Used to make candles." + accelerant_value = 0.6 + construction_difficulty = MAT_VALUE_NORMAL_DIY + reflectiveness = MAT_VALUE_SHINY + wall_support_value = MAT_VALUE_EXTREMELY_LIGHT + default_solid_form = /obj/item/stack/material/bar + sound_manipulate = 'sound/foley/paperpickup2.ogg' + sound_dropped = 'sound/foley/paperpickup1.ogg' + color = "#fffccc" + door_icon_base = "plastic" + hardness = MAT_VALUE_FLEXIBLE - 10 + weight = MAT_VALUE_LIGHT + melting_point = 363 + ignition_point = 473 + boiling_point = 643 + +// Wax does not use the base recipe list. +/decl/material/solid/organic/wax/generate_recipes() + . = list(new /datum/stack_recipe/candle(src)) + +/decl/material/solid/organic/plastic/holographic name = "holographic plastic" uid = "solid_holographic_plastic" shard_type = SHARD_NONE @@ -45,10 +73,10 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/plastic/holographic/get_recipes(reinf_mat) +/decl/material/solid/organic/plastic/holographic/get_recipes(stack_type, reinf_mat) return list() -/decl/material/solid/cardboard +/decl/material/solid/organic/cardboard name = "cardboard" uid = "solid_cardboard" lore_text = "What with the difficulties presented by growing plants in orbit, a stock of cardboard in space is probably more valuable than gold." @@ -64,7 +92,7 @@ weight = MAT_VALUE_EXTREMELY_LIGHT - 5 ignition_point = T0C+232 //"the temperature at which book-paper catches fire, and burns." close enough melting_point = T0C+232 //temperature at which cardboard walls would be destroyed - stack_origin_tech = "{'materials':1}" + stack_origin_tech = @'{"materials":1}' door_icon_base = "wood" destruction_desc = "crumples" conductive = 0 @@ -77,21 +105,20 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/cardboard/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/cardboard/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += create_recipe_list(/datum/stack_recipe/box) - . += new/datum/stack_recipe/cardborg_suit(src) - . += new/datum/stack_recipe/cardborg_helmet(src) - . += new/datum/stack_recipe_list("folders", create_recipe_list(/datum/stack_recipe/folder)) - -/decl/material/solid/paper + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += create_recipe_list(/datum/stack_recipe/box) + . += new/datum/stack_recipe/cardborg_suit(src) + . += new/datum/stack_recipe/cardborg_helmet(src) + . += new/datum/stack_recipe_list("folders", create_recipe_list(/datum/stack_recipe/folder)) + +/decl/material/solid/organic/paper name = "paper" uid = "solid_paper" lore_text = "Low tech writing medium made from cellulose fibers. Also used in wrappings and packaging." color = "#cfcece" - stack_origin_tech = "{'materials':1}" + stack_origin_tech = @'{"materials":1}' door_icon_base = "wood" destruction_desc = "tears" icon_base = 'icons/turf/walls/solid.dmi' @@ -117,18 +144,17 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/paper/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/paper/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/paper_sheets(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/paper_sheets(src) -/decl/material/solid/cloth //todo +/decl/material/solid/organic/cloth //todo name = "cotton" uid = "solid_cotton" use_name = "cotton" color = "#ffffff" - stack_origin_tech = "{'materials':2}" + stack_origin_tech = @'{"materials":2}' door_icon_base = "wood" ignition_point = T0C+232 melting_point = T0C+300 @@ -147,77 +173,76 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/cloth/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/cloth/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/cloak(src) - . += new/datum/stack_recipe/banner(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/cloak(src) + . += new/datum/stack_recipe/banner(src) -/decl/material/solid/cloth/yellow +/decl/material/solid/organic/cloth/yellow name = "yellow" uid = "solid_cotton_yellow" use_name = "yellow cloth" adjective_name = "yellow" color = "#ffbf00" -/decl/material/solid/cloth/teal +/decl/material/solid/organic/cloth/teal name = "teal" uid = "solid_cotton_teal" use_name = "teal cloth" adjective_name = "teal" color = "#00e1ff" -/decl/material/solid/cloth/black +/decl/material/solid/organic/cloth/black name = "black" uid = "solid_cotton_black" use_name = "black cloth" adjective_name = "black" color = "#505050" -/decl/material/solid/cloth/green +/decl/material/solid/organic/cloth/green name = "green" uid = "solid_cotton_green" use_name = "green cloth" adjective_name = "green" color = "#b7f27d" -/decl/material/solid/cloth/purple +/decl/material/solid/organic/cloth/purple name = "purple" uid = "solid_cotton_purple" use_name = "purple cloth" adjective_name = "purple" color = "#9933ff" -/decl/material/solid/cloth/blue +/decl/material/solid/organic/cloth/blue name = "blue" uid = "solid_cotton_blue" use_name = "blue cloth" adjective_name = "blue" color = "#46698c" -/decl/material/solid/cloth/beige +/decl/material/solid/organic/cloth/beige name = "beige" uid = "solid_cotton_beige" use_name = "beige cloth" adjective_name = "beige" color = "#ceb689" -/decl/material/solid/cloth/lime +/decl/material/solid/organic/cloth/lime name = "lime" uid = "solid_cotton_lime" use_name = "lime cloth" adjective_name = "lime" color = "#62e36c" -/decl/material/solid/cloth/red +/decl/material/solid/organic/cloth/red name = "red" uid = "solid_cotton_red" use_name = "red cloth" adjective_name = "red" color = "#9d2300" -/decl/material/solid/carpet +/decl/material/solid/organic/carpet name = "red" uid = "solid_carpet" use_name = "red upholstery" @@ -239,7 +264,7 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/plantmatter +/decl/material/solid/organic/plantmatter name = "plant matter" uid = "solid_plantmatter" color = COLOR_GREEN_GRAY @@ -260,7 +285,7 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/meat +/decl/material/solid/organic/meat name = "meat" uid = "solid_meat" color = COLOR_DARK_RED @@ -282,7 +307,7 @@ sound_dropped = 'sound/foley/meat2.ogg' hitsound = 'sound/effects/squelch1.ogg' -/decl/material/solid/skin +/decl/material/solid/organic/skin name = "skin" uid = "solid_skin" color = "#9e8c72" @@ -304,31 +329,30 @@ sound_dropped = 'sound/foley/meat2.ogg' hitsound = "punch" exoplanet_rarity_gas = MAT_RARITY_NOWHERE - var/tans_to = /decl/material/solid/leather + var/tans_to = /decl/material/solid/organic/leather -/decl/material/solid/skin/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/skin/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/cloak(src) - . += new/datum/stack_recipe/banner(src) - . += new/datum/stack_recipe/shoes(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/cloak(src) + . += new/datum/stack_recipe/banner(src) + . += new/datum/stack_recipe/shoes(src) -/decl/material/solid/skin/lizard +/decl/material/solid/organic/skin/lizard name = "lizardskin" uid = "solid_lizardskin" color = "#626952" - tans_to = /decl/material/solid/leather/lizard + tans_to = /decl/material/solid/organic/leather/lizard hardness = MAT_VALUE_FLEXIBLE weight = MAT_VALUE_VERY_LIGHT exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/skin/insect +/decl/material/solid/organic/skin/insect name = "chitin" uid = "solid_chitin" color = "#7a776d" - tans_to = /decl/material/solid/leather/chitin + tans_to = /decl/material/solid/organic/leather/chitin integrity = 75 hardness = MAT_VALUE_RIGID weight = MAT_VALUE_VERY_LIGHT @@ -336,56 +360,56 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/skin/fur +/decl/material/solid/organic/skin/fur name = "fur" uid = "solid_fur" color = "#7a726d" - tans_to = /decl/material/solid/leather/fur + tans_to = /decl/material/solid/organic/leather/fur default_solid_form = /obj/item/stack/material/skin/pelt sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/skin/fur/gray +/decl/material/solid/organic/skin/fur/gray uid = "solid_fur_gray" -/decl/material/solid/skin/fur/white +/decl/material/solid/organic/skin/fur/white uid = "solid_fur_white" -/decl/material/solid/skin/fur/orange +/decl/material/solid/organic/skin/fur/orange color = COLOR_ORANGE uid = "solid_fur_orange" -/decl/material/solid/skin/fur/black +/decl/material/solid/organic/skin/fur/black color = COLOR_GRAY20 uid = "solid_fur_black" -/decl/material/solid/skin/fur/heavy +/decl/material/solid/organic/skin/fur/heavy color = COLOR_GUNMETAL uid = "solid_fur_heavy" -/decl/material/solid/skin/goat +/decl/material/solid/organic/skin/goat color = COLOR_SILVER uid = "solid_skin_goat" -/decl/material/solid/skin/cow +/decl/material/solid/organic/skin/cow color = COLOR_GRAY40 uid = "solid_skin_cow" -/decl/material/solid/skin/shark +/decl/material/solid/organic/skin/shark name = "sharkskin" color = COLOR_PURPLE_GRAY uid = "solid_skin_shark" -/decl/material/solid/skin/fish +/decl/material/solid/organic/skin/fish color = COLOR_BOTTLE_GREEN name = "fishskin" uid = "solid_skin_fish" -/decl/material/solid/skin/fish/purple +/decl/material/solid/organic/skin/fish/purple color = COLOR_PALE_PURPLE_GRAY uid = "solid_skin_carp" -/decl/material/solid/skin/feathers +/decl/material/solid/organic/skin/feathers name = "feathers" uid = "solid_feathers" color = COLOR_SILVER @@ -393,31 +417,31 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/skin/feathers/purple +/decl/material/solid/organic/skin/feathers/purple color = COLOR_PALE_PURPLE_GRAY uid = "solid_feathers_purple" -/decl/material/solid/skin/feathers/blue +/decl/material/solid/organic/skin/feathers/blue color = COLOR_SKY_BLUE uid = "solid_feathers_blue" -/decl/material/solid/skin/feathers/green +/decl/material/solid/organic/skin/feathers/green color = COLOR_BOTTLE_GREEN uid = "solid_feathers_green" -/decl/material/solid/skin/feathers/brown +/decl/material/solid/organic/skin/feathers/brown color = COLOR_BEASTY_BROWN uid = "solid_feathers_brown" -/decl/material/solid/skin/feathers/red +/decl/material/solid/organic/skin/feathers/red color = COLOR_RED uid = "solid_feathers_red" -/decl/material/solid/skin/feathers/black +/decl/material/solid/organic/skin/feathers/black color = COLOR_GRAY15 uid = "solid_feathers_black" -/decl/material/solid/bone +/decl/material/solid/organic/bone name = "bone" uid = "solid_bone" color = "#f0edc7" @@ -436,13 +460,24 @@ sound_manipulate = 'sound/foley/stickspickup1.ogg' sound_dropped = 'sound/foley/sticksdrop1.ogg' -/decl/material/solid/bone/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/bone/generate_recipes(stack_type, reinforce_material) . = ..() - if(!reinforce_material && wall_support_value >= 10) + if(!reinforce_material && islist(.) && !ispath(stack_type) && wall_support_value >= 10) . += new/datum/stack_recipe/furniture/girder(src) . += new/datum/stack_recipe/furniture/ladder(src) -/decl/material/solid/bone/fish +// Stub for earrings. TODO: put it in clams +/decl/material/solid/organic/bone/pearl + name = "pearl" + uid = "solid_pearl" + color = "#eae0c8" + default_solid_form = /obj/item/stack/material/lump + hardness = MAT_VALUE_FLEXIBLE + weight = MAT_VALUE_VERY_LIGHT + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + exoplanet_rarity_plant = MAT_RARITY_NOWHERE + +/decl/material/solid/organic/bone/fish name = "fishbone" uid = "solid_fishbone" hardness = MAT_VALUE_FLEXIBLE @@ -450,7 +485,7 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/bone/cartilage +/decl/material/solid/organic/bone/cartilage name = "cartilage" uid = "solid_cartilage" hardness = 0 @@ -458,11 +493,11 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/leather +/decl/material/solid/organic/leather name = "leather" uid = "solid_leather" color = "#5c4831" - stack_origin_tech = "{'materials':2}" + stack_origin_tech = @'{"materials":2}' flags = MAT_FLAG_PADDING ignition_point = T0C+300 melting_point = T0C+300 @@ -480,23 +515,22 @@ sound_manipulate = 'sound/foley/paperpickup2.ogg' sound_dropped = 'sound/foley/paperpickup1.ogg' -/decl/material/solid/leather/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/leather/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - . += new/datum/stack_recipe/cloak(src) - . += new/datum/stack_recipe/banner(src) - . += new/datum/stack_recipe/shoes(src) - . += new/datum/stack_recipe/boots(src) - -/decl/material/solid/leather/synth + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/cloak(src) + . += new/datum/stack_recipe/banner(src) + . += new/datum/stack_recipe/shoes(src) + . += new/datum/stack_recipe/boots(src) + +/decl/material/solid/organic/leather/synth name = "synthleather" uid = "solid_synthleather" color = "#1f1f20" ignition_point = T0C+150 melting_point = T0C+100 -/decl/material/solid/leather/lizard +/decl/material/solid/organic/leather/lizard name = "scaled hide" uid = "solid_scaled_hide" color = "#434b31" @@ -505,11 +539,11 @@ weight = MAT_VALUE_LIGHT reflectiveness = MAT_VALUE_SHINY -/decl/material/solid/leather/fur +/decl/material/solid/organic/leather/fur name = "tanned pelt" uid = "solid_tanned_pelt" -/decl/material/solid/leather/chitin +/decl/material/solid/organic/leather/chitin name = "treated chitin" uid = "solid_treated_chitin" integrity = 100 diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index 836da0059d1..5ab7f90f149 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -18,20 +18,20 @@ /decl/material/solid/silicon = 1 ) -/decl/material/solid/stone/generate_recipes(var/reinforce_material) +/decl/material/solid/stone/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials - return - if(wall_support_value >= 10) - . += new/datum/stack_recipe/furniture/girder(src) - . += new/datum/stack_recipe/furniture/planting_bed(src) - . += new/datum/stack_recipe/fountain(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + if(wall_support_value >= 10) + . += new/datum/stack_recipe/furniture/girder(src) + . += new/datum/stack_recipe/furniture/planting_bed(src) + . += new/datum/stack_recipe/fountain(src) /decl/material/solid/stone/sandstone name = "sandstone" uid = "solid_sandstone" lore_text = "A clastic sedimentary rock. The cost of boosting it to orbit is almost universally much higher than the actual value of the material." value = 1.5 + melting_point = T0C + 600 /decl/material/solid/stone/granite name = "granite" @@ -66,6 +66,7 @@ wall_support_value = MAT_VALUE_VERY_HEAVY hardness = MAT_VALUE_HARD reflectiveness = MAT_VALUE_SHINY + melting_point = T0C + 1200 brute_armor = 3 integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system construction_difficulty = MAT_VALUE_HARD_DIY diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index 6f92c484156..5488975444b 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -1,4 +1,4 @@ -/decl/material/solid/wood +/decl/material/solid/organic/wood name = "wood" uid = "solid_wood" liquid_name = "wood pulp" @@ -22,7 +22,7 @@ weight = MAT_VALUE_NORMAL melting_point = T0C+300 //okay, not melting in this case, but hot enough to destroy wood ignition_point = T0C+288 - stack_origin_tech = "{'materials':1,'biotech':1}" + stack_origin_tech = @'{"materials":1,"biotech":1}' dooropen_noise = 'sound/effects/doorcreaky.ogg' door_icon_base = "wood" destruction_desc = "splinters" @@ -36,14 +36,14 @@ value = 1.5 reflectiveness = MAT_VALUE_DULL wall_support_value = MAT_VALUE_NORMAL - fuel_value = 0.8 + accelerant_value = 0.8 default_solid_form = /obj/item/stack/material/plank sound_manipulate = 'sound/foley/woodpickup1.ogg' sound_dropped = 'sound/foley/wooddrop1.ogg' -/decl/material/solid/wood/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/wood/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) //recipes below don't support composite materials + if(reinforce_material || ispath(stack_type)) return if(wall_support_value >= 10) @@ -76,31 +76,27 @@ . += new/datum/stack_recipe/prosthetic/right_foot(src) . += new/datum/stack_recipe/campfire(src) -/decl/material/solid/wood/mahogany/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/wood/mahogany/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) - return - . += new/datum/stack_recipe/tile/mahogany(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/tile/mahogany(src) -/decl/material/solid/wood/maple/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/wood/maple/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) - return - . += new/datum/stack_recipe/tile/maple(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/tile/maple(src) -/decl/material/solid/wood/ebony/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/wood/ebony/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) - return - . += new/datum/stack_recipe/tile/ebony(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/tile/ebony(src) -/decl/material/solid/wood/walnut/generate_recipes(var/reinforce_material) +/decl/material/solid/organic/wood/walnut/generate_recipes(stack_type, reinforce_material) . = ..() - if(reinforce_material) - return - . += new/datum/stack_recipe/tile/walnut(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new/datum/stack_recipe/tile/walnut(src) -/decl/material/solid/wood/holographic +/decl/material/solid/organic/wood/holographic uid = "solid_holographic_wood" color = WOOD_COLOR_CHOCOLATE //the very concept of wood should be brown shard_type = SHARD_NONE @@ -109,10 +105,10 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/wood/holographic/get_recipes(reinf_mat) +/decl/material/solid/organic/wood/holographic/get_recipes(stack_type, reinf_mat) return list() -/decl/material/solid/wood/mahogany +/decl/material/solid/organic/wood/mahogany name = "mahogany" uid = "solid_mahogany" adjective_name = "mahogany" @@ -121,7 +117,7 @@ construction_difficulty = MAT_VALUE_HARD_DIY value = 1.6 -/decl/material/solid/wood/maple +/decl/material/solid/organic/wood/maple name = "maple" uid = "solid_maple" adjective_name = "maple" @@ -129,7 +125,7 @@ color = WOOD_COLOR_PALE value = 1.8 -/decl/material/solid/wood/ebony +/decl/material/solid/organic/wood/ebony name = "ebony" uid = "solid_ebony" adjective_name = "ebony" @@ -143,7 +139,7 @@ construction_difficulty = MAT_VALUE_VERY_HARD_DIY value = 1.8 -/decl/material/solid/wood/walnut +/decl/material/solid/organic/wood/walnut name = "walnut" uid = "solid_walnut" adjective_name = "walnut" @@ -154,7 +150,7 @@ weight = MAT_VALUE_NORMAL construction_difficulty = MAT_VALUE_HARD_DIY -/decl/material/solid/wood/bamboo +/decl/material/solid/organic/wood/bamboo name = "bamboo" uid = "solid_bamboo" liquid_name = "bamboo pulp" @@ -165,7 +161,7 @@ weight = MAT_VALUE_VERY_LIGHT hardness = MAT_VALUE_RIGID -/decl/material/solid/wood/yew +/decl/material/solid/organic/wood/yew name = "yew" uid = "solid_yew" adjective_name = "yew" diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 3313c1b266f..7945a91df36 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -1,34 +1,45 @@ -/decl/material/proc/get_recipes(var/reinf_mat) - var/key = reinf_mat || "base" - if(!LAZYACCESS(recipes,key)) - LAZYSET(recipes,key,generate_recipes(reinf_mat)) +/decl/material/proc/get_recipes(stack_type, reinf_mat) + var/key = "[reinf_mat || "base"]-[stack_type || "general"]" + if(!LAZYACCESS(recipes, key)) + LAZYSET(recipes, key, generate_recipes(stack_type, reinf_mat)) return recipes[key] -/decl/material/proc/get_strut_recipes(var/reinf_mat) - var/key = reinf_mat || "base" - . = LAZYACCESS(strut_recipes, key) - if(!islist(.)) - LAZYSET(strut_recipes, key, generate_strut_recipes(reinf_mat)) - . = LAZYACCESS(strut_recipes, key) - /decl/material/proc/create_recipe_list(base_type) . = list() for(var/recipe_type in subtypesof(base_type)) . += new recipe_type(src) -/decl/material/proc/generate_recipes(var/reinforce_material) - if(phase_at_temperature() != MAT_PHASE_SOLID) - return list() +/decl/material/proc/generate_recipes(stack_type, reinforce_material) + // By default we don't let anything be crafted with ore, as it's too raw. + // We make an exception for clay as it is being moulded by hand. . = list() + if(ispath(stack_type, /obj/item/stack/material/ore) || phase_at_temperature() != MAT_PHASE_SOLID) + return + + // Struts have their own recipe set, so we return early for them. + if(ispath(stack_type, /obj/item/stack/material/strut)) + if(wall_support_value >= 10) + . += new/datum/stack_recipe/furniture/girder(src) + . += new/datum/stack_recipe/furniture/ladder(src) + . += new/datum/stack_recipe/railing(src) + . += new/datum/stack_recipe/furniture/wall_frame(src) + . += new/datum/stack_recipe/furniture/table_frame(src) + . += new/datum/stack_recipe/furniture/rack(src) + . += new/datum/stack_recipe/butcher_hook(src) + . += new/datum/stack_recipe/furniture/bed(src) + return + + // We assume a non-ore non-strut stack type is a general type that can use general recipes. if(opacity < 0.6) . += new/datum/stack_recipe/furniture/borderwindow(src, reinforce_material) . += new/datum/stack_recipe/furniture/fullwindow(src, reinforce_material) if(integrity > 75 || reinforce_material) . += new/datum/stack_recipe/furniture/windoor(src, reinforce_material) - if(reinforce_material) //recipes below don't support composite materials + //recipes below don't support composite materials + if(reinforce_material) return if(hardness >= MAT_VALUE_FLEXIBLE + 10) @@ -83,17 +94,3 @@ coin_recipes += new /datum/stack_recipe/coin(src, null, denomination) if(length(coin_recipes)) . += new/datum/stack_recipe_list("antique coins", coin_recipes) - -/decl/material/proc/generate_strut_recipes(var/reinforce_material) - . = list() - - if(wall_support_value >= 10) - . += new/datum/stack_recipe/furniture/girder(src) - . += new/datum/stack_recipe/furniture/ladder(src) - . += new/datum/stack_recipe/railing(src) - . += new/datum/stack_recipe/furniture/wall_frame(src) - . += new/datum/stack_recipe/furniture/table_frame(src) - . += new/datum/stack_recipe/furniture/rack(src) - . += new/datum/stack_recipe/butcher_hook(src) - . += new/datum/stack_recipe/furniture/bed(src) - . += new/datum/stack_recipe/furniture/machine(src) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index f09230614d5..104a02420e5 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -1,7 +1,7 @@ // Stacked resources. They use a material datum for a lot of inherited values. /obj/item/stack/material name = "material sheet" - force = 5.0 + force = 5 throwforce = 5 w_class = ITEM_SIZE_LARGE throw_speed = 3 @@ -18,6 +18,8 @@ abstract_type = /obj/item/stack/material is_spawnable_type = FALSE // Mapped subtypes set this so they can be spawned from the verb. var/decl/material/reinf_material + /// Set this to a specific type to restrict the recipes generated by this stack. + var/recipe_stack_type /obj/item/stack/material/Initialize(mapload, var/amount, var/_material, var/_reinf_material) @@ -47,7 +49,7 @@ update_strings() /obj/item/stack/material/get_recipes() - return material.get_recipes(reinf_material && reinf_material.type) + return material.get_recipes(recipe_stack_type, reinf_material?.type) /obj/item/stack/material/get_codex_value() return (material && !material.hidden_from_codex) ? "[lowertext(material.codex_name)] (substance)" : ..() @@ -147,6 +149,13 @@ else icon_state = base_state +/obj/item/stack/material/get_string_for_amount(amount) + . = "[reinf_material ? "reinforced " : null][material.use_name]" + if(amount == 1) + . += " [singular_name]" + return indefinite_article ? "[indefinite_article] [.]" : ADD_ARTICLE(.) + return "[amount] [.] [plural_name]" + /obj/item/stack/material/ingot name = "ingots" singular_name = "ingot" @@ -271,9 +280,12 @@ icon_state = "puck" plural_icon_state = "puck-mult" max_icon_state = "puck-max" - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE stack_merge_type = /obj/item/stack/material/aerogel +// Aerogel melting point is below 0 as it is a physical container for gas; hack around that here. +/obj/item/stack/material/aerogel/ProcessAtomTemperature() + return PROCESS_KILL + /obj/item/stack/material/plank name = "planks" singular_name = "plank" @@ -341,6 +353,7 @@ plural_icon_state = "sheet-strut-mult" max_icon_state = "sheet-strut-max" stack_merge_type = /obj/item/stack/material/strut + recipe_stack_type = /obj/item/stack/material/strut /obj/item/stack/material/strut/cyborg name = "metal strut synthesizer" @@ -353,5 +366,11 @@ max_health = ITEM_HEALTH_NO_DAMAGE is_spawnable_type = FALSE -/obj/item/stack/material/strut/get_recipes() - return material.get_strut_recipes(reinf_material && reinf_material.type) +/obj/item/stack/material/bar + name = "bar" + singular_name = "bar" + plural_name = "bars" + icon_state = "bar" + plural_icon_state = "bar-mult" + max_icon_state = "bar-max" + stack_merge_type = /obj/item/stack/material/bar diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 66a359c2633..6ecd474a92d 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -39,67 +39,67 @@ amount = 50; \ } -STACK_SUBTYPES(tritium, "tritium", gas/hydrogen/tritium, aerogel, null) -STACK_SUBTYPES(deuterium, "deuterium", gas/hydrogen/deuterium, aerogel, null) -STACK_SUBTYPES(iron, "iron", solid/metal/iron, ingot, null) -STACK_SUBTYPES(copper, "copper", solid/metal/copper, ingot, null) -STACK_SUBTYPES(sandstone, "sandstone", solid/stone/sandstone, brick, null) -STACK_SUBTYPES(marble, "marble", solid/stone/marble, brick, null) -STACK_SUBTYPES(graphite, "graphite", solid/graphite, brick, null) -STACK_SUBTYPES(diamond, "diamond", solid/gemstone/diamond, gemstone, null) -STACK_SUBTYPES(uranium, "uranium", solid/metal/uranium, puck, null) -STACK_SUBTYPES(plastic, "plastic", solid/plastic, panel, null) -STACK_SUBTYPES(fiberglass, "fiberglass", solid/fiberglass, reinforced, null) -STACK_SUBTYPES(gold, "gold", solid/metal/gold, ingot, null) -STACK_SUBTYPES(silver, "silver", solid/metal/silver, ingot, null) -STACK_SUBTYPES(platinum, "platinum", solid/metal/platinum, ingot, null) -STACK_SUBTYPES(mhydrogen, "metallic hydrogen", solid/metallic_hydrogen, segment, null) -STACK_SUBTYPES(osmium, "osmium", solid/metal/osmium, ingot, null) -STACK_SUBTYPES(ocp, "osmium-carbide plasteel", solid/metal/plasteel/ocp, reinforced, null) -STACK_SUBTYPES(steel, "steel", solid/metal/steel, sheet, null) -STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, shiny, null) -STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, reinforced, null) -STACK_SUBTYPES(plasteel, "plasteel", solid/metal/plasteel, reinforced, null) -STACK_SUBTYPES(wood, "wood", solid/wood, plank, null) -STACK_SUBTYPES(mahogany, "mahogany", solid/wood/mahogany, plank, null) -STACK_SUBTYPES(maple, "maple", solid/wood/maple, plank, null) -STACK_SUBTYPES(ebony, "ebony", solid/wood/ebony, plank, null) -STACK_SUBTYPES(walnut, "walnut", solid/wood/walnut, plank, null) -STACK_SUBTYPES(bamboo, "bamboo", solid/wood/bamboo, plank, null) -STACK_SUBTYPES(yew, "yew", solid/wood/yew, plank, null) -STACK_SUBTYPES(cardboard, "cardboard", solid/cardboard, cardstock, null) -STACK_SUBTYPES(leather, "leather", solid/leather, skin, null) -STACK_SUBTYPES(synthleather, "synthleather", solid/leather/synth, skin, null) -STACK_SUBTYPES(glass, "glass", solid/glass, pane, null) -STACK_SUBTYPES(borosilicate, "borosilicate glass", solid/glass/borosilicate, pane, null) -STACK_SUBTYPES(aliumium, "aliumium", solid/metal/aliumium, cubes, null) -STACK_SUBTYPES(rglass, "reinforced glass", solid/glass, pane, /decl/material/solid/metal/steel) -STACK_SUBTYPES(rborosilicate, "reinforced borosilicate glass", solid/glass/borosilicate, pane, /decl/material/solid/metal/steel) -STACK_SUBTYPES(zinc, "zinc", solid/metal/zinc, ingot, null) -STACK_SUBTYPES(tin, "tin", solid/metal/tin, ingot, null) -STACK_SUBTYPES(lead, "lead", solid/metal/lead, ingot, null) -STACK_SUBTYPES(brass, "brass", solid/metal/brass, ingot, null) -STACK_SUBTYPES(bronze, "bronze", solid/metal/bronze, ingot, null) -STACK_SUBTYPES(chromium, "chromium", solid/metal/chromium, ingot, null) -STACK_SUBTYPES(blackbronze, "black bronze", solid/metal/blackbronze, ingot, null) -STACK_SUBTYPES(redgold, "red gold", solid/metal/redgold, ingot, null) -STACK_SUBTYPES(stainlesssteel, "stainless steel", solid/metal/stainlesssteel, ingot, null) -STACK_SUBTYPES(ice, "ice", liquid/water, cubes, null) +STACK_SUBTYPES(tritium, "tritium", gas/hydrogen/tritium, aerogel, null) +STACK_SUBTYPES(deuterium, "deuterium", gas/hydrogen/deuterium, aerogel, null) +STACK_SUBTYPES(iron, "iron", solid/metal/iron, ingot, null) +STACK_SUBTYPES(copper, "copper", solid/metal/copper, ingot, null) +STACK_SUBTYPES(sandstone, "sandstone", solid/stone/sandstone, brick, null) +STACK_SUBTYPES(marble, "marble", solid/stone/marble, brick, null) +STACK_SUBTYPES(graphite, "graphite", solid/graphite, brick, null) +STACK_SUBTYPES(diamond, "diamond", solid/gemstone/diamond, gemstone, null) +STACK_SUBTYPES(uranium, "uranium", solid/metal/uranium, puck, null) +STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, panel, null) +STACK_SUBTYPES(fiberglass, "fiberglass", solid/fiberglass, reinforced, null) +STACK_SUBTYPES(gold, "gold", solid/metal/gold, ingot, null) +STACK_SUBTYPES(silver, "silver", solid/metal/silver, ingot, null) +STACK_SUBTYPES(platinum, "platinum", solid/metal/platinum, ingot, null) +STACK_SUBTYPES(mhydrogen, "metallic hydrogen", solid/metallic_hydrogen, segment, null) +STACK_SUBTYPES(osmium, "osmium", solid/metal/osmium, ingot, null) +STACK_SUBTYPES(ocp, "osmium-carbide plasteel", solid/metal/plasteel/ocp, reinforced, null) +STACK_SUBTYPES(steel, "steel", solid/metal/steel, sheet, null) +STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, shiny, null) +STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, reinforced, null) +STACK_SUBTYPES(plasteel, "plasteel", solid/metal/plasteel, reinforced, null) +STACK_SUBTYPES(wood, "wood", solid/organic/wood, plank, null) +STACK_SUBTYPES(mahogany, "mahogany", solid/organic/wood/mahogany, plank, null) +STACK_SUBTYPES(maple, "maple", solid/organic/wood/maple, plank, null) +STACK_SUBTYPES(ebony, "ebony", solid/organic/wood/ebony, plank, null) +STACK_SUBTYPES(walnut, "walnut", solid/organic/wood/walnut, plank, null) +STACK_SUBTYPES(bamboo, "bamboo", solid/organic/wood/bamboo, plank, null) +STACK_SUBTYPES(yew, "yew", solid/organic/wood/yew, plank, null) +STACK_SUBTYPES(cardboard, "cardboard", solid/organic/cardboard, cardstock, null) +STACK_SUBTYPES(leather, "leather", solid/organic/leather, skin, null) +STACK_SUBTYPES(synthleather, "synthleather", solid/organic/leather/synth, skin, null) +STACK_SUBTYPES(glass, "glass", solid/glass, pane, null) +STACK_SUBTYPES(borosilicate, "borosilicate glass", solid/glass/borosilicate, pane, null) +STACK_SUBTYPES(aliumium, "aliumium", solid/metal/aliumium, cubes, null) +STACK_SUBTYPES(rglass, "reinforced glass", solid/glass, pane, /decl/material/solid/metal/steel) +STACK_SUBTYPES(rborosilicate, "reinforced borosilicate glass", solid/glass/borosilicate, pane, /decl/material/solid/metal/steel) +STACK_SUBTYPES(zinc, "zinc", solid/metal/zinc, ingot, null) +STACK_SUBTYPES(tin, "tin", solid/metal/tin, ingot, null) +STACK_SUBTYPES(lead, "lead", solid/metal/lead, ingot, null) +STACK_SUBTYPES(brass, "brass", solid/metal/brass, ingot, null) +STACK_SUBTYPES(bronze, "bronze", solid/metal/bronze, ingot, null) +STACK_SUBTYPES(chromium, "chromium", solid/metal/chromium, ingot, null) +STACK_SUBTYPES(blackbronze, "black bronze", solid/metal/blackbronze, ingot, null) +STACK_SUBTYPES(redgold, "red gold", solid/metal/redgold, ingot, null) +STACK_SUBTYPES(stainlesssteel, "stainless steel", solid/metal/stainlesssteel, ingot, null) +STACK_SUBTYPES(ice, "ice", liquid/water, cubes, null) -STACK_SUBTYPES(cloth, "cloth", solid/cloth, bolt, null) -STACK_SUBTYPES(yellow, "yellow cloth", solid/cloth/yellow, bolt, null) -STACK_SUBTYPES(teal, "teal cloth", solid/cloth/teal, bolt, null) -STACK_SUBTYPES(black, "black cloth", solid/cloth/black, bolt, null) -STACK_SUBTYPES(green, "green cloth", solid/cloth/green, bolt, null) -STACK_SUBTYPES(purple, "purple cloth", solid/cloth/purple, bolt, null) -STACK_SUBTYPES(blue, "blue cloth", solid/cloth/blue, bolt, null) -STACK_SUBTYPES(beige, "beige cloth", solid/cloth/beige, bolt, null) -STACK_SUBTYPES(lime, "lime cloth", solid/cloth/lime, bolt, null) -STACK_SUBTYPES(red, "red cloth", solid/cloth/red, bolt, null) +STACK_SUBTYPES(cloth, "cloth", solid/organic/cloth, bolt, null) +STACK_SUBTYPES(yellow, "yellow cloth", solid/organic/cloth/yellow, bolt, null) +STACK_SUBTYPES(teal, "teal cloth", solid/organic/cloth/teal, bolt, null) +STACK_SUBTYPES(black, "black cloth", solid/organic/cloth/black, bolt, null) +STACK_SUBTYPES(green, "green cloth", solid/organic/cloth/green, bolt, null) +STACK_SUBTYPES(purple, "purple cloth", solid/organic/cloth/purple, bolt, null) +STACK_SUBTYPES(blue, "blue cloth", solid/organic/cloth/blue, bolt, null) +STACK_SUBTYPES(beige, "beige cloth", solid/organic/cloth/beige, bolt, null) +STACK_SUBTYPES(lime, "lime cloth", solid/organic/cloth/lime, bolt, null) +STACK_SUBTYPES(red, "red cloth", solid/organic/cloth/red, bolt, null) -STACK_SUBTYPES(steel, "steel", solid/metal/steel, strut, null) -STACK_SUBTYPES(plastic, "plastic", solid/plastic, strut, null) -STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, strut, null) -STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, strut, null) +STACK_SUBTYPES(steel, "steel", solid/metal/steel, strut, null) +STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, strut, null) +STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, strut, null) +STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, strut, null) #undef STACK_SUBTYPES \ No newline at end of file diff --git a/code/modules/materials/material_synth.dm b/code/modules/materials/material_synth.dm index 5dbdcdef86a..4aa562ea6a1 100644 --- a/code/modules/materials/material_synth.dm +++ b/code/modules/materials/material_synth.dm @@ -22,7 +22,7 @@ /obj/item/stack/material/cyborg/plastic name = "cyborg plastic synthesiser" icon_state = "sheet" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/stack/material/cyborg/steel name = "cyborg steel synthesiser" @@ -37,7 +37,7 @@ /obj/item/stack/material/cyborg/wood name = "cyborg wood synthesiser" icon_state = "sheet-wood" - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/stack/material/cyborg/glass name = "cyborg glass synthesiser" diff --git a/code/modules/materials/materials_ore.dm b/code/modules/materials/materials_ore.dm index 8ee38f987b0..2cc5e51ccc6 100644 --- a/code/modules/materials/materials_ore.dm +++ b/code/modules/materials/materials_ore.dm @@ -18,11 +18,12 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR //Name is handled in override randpixel = 6 is_spawnable_type = TRUE + recipe_stack_type = /obj/item/stack/material/ore ///Associative list of cache key to the generate icons for the ore piles. We pre-generate a pile of all possible ore icon states, and make them available var/static/list/cached_ore_icon_states ///A list of all the existing ore icon states in the ore file - var/static/list/ore_icon_states = icon_states('icons/obj/materials/ore.dmi') //list("shiny", "gems", "dust", "nugget", "lump") + var/static/list/ore_icon_states = icon_states('icons/obj/materials/ore.dmi') ///Returns a cached ore pile icon state /obj/item/stack/material/ore/proc/get_cached_ore_pile_overlay(var/state_name, var/stack_icon_index) @@ -90,9 +91,6 @@ SetName("[(material.ore_name ? material.ore_name : "[material.name] chunk")][(amount > 1? " pile" : "")]") desc = material.ore_desc ? material.ore_desc : "A lump of ore." -/obj/item/stack/material/ore/get_recipes() - return //Can't use recipes with ore - /obj/item/stack/material/ore/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/stack/material) && !is_same(W)) return FALSE //Don't reinforce @@ -119,8 +117,10 @@ material = /decl/material/solid/hematite /obj/item/stack/material/ore/coal material = /decl/material/solid/graphite -/obj/item/stack/material/ore/glass +/obj/item/stack/material/ore/sand material = /decl/material/solid/sand +/obj/item/stack/material/ore/clay + material = /decl/material/solid/clay /obj/item/stack/material/ore/silver material = /decl/material/solid/metal/silver /obj/item/stack/material/ore/gold @@ -157,6 +157,8 @@ material = /decl/material/solid/ice/hydrate/krypton /obj/item/stack/material/ore/xenon material = /decl/material/solid/ice/hydrate/xenon +/obj/item/stack/material/ore/meat + material = /decl/material/solid/organic/meat /client/proc/spawn_ore_pile() set name = "Spawn Ore Pile" diff --git a/code/modules/materials/recipes_furniture.dm b/code/modules/materials/recipes_furniture.dm index e5c406d7273..0328a4cdff1 100644 --- a/code/modules/materials/recipes_furniture.dm +++ b/code/modules/materials/recipes_furniture.dm @@ -158,7 +158,6 @@ /datum/stack_recipe/furniture/machine/spawn_result(mob/user, location, amount) return new result_type(location) - /datum/stack_recipe/furniture/door_assembly time = 50 diff --git a/code/modules/materials/recipes_structures.dm b/code/modules/materials/recipes_structures.dm index dc357da158e..64e546e8b6c 100644 --- a/code/modules/materials/recipes_structures.dm +++ b/code/modules/materials/recipes_structures.dm @@ -46,8 +46,8 @@ var/obj/structure/fire_source/product = ..() for(var/mat in product.matter) var/decl/material/material = GET_DECL(mat) - if(material.fuel_value > 0) - product.fuel += material.fuel_value * round(product.matter[mat] / SHEET_MATERIAL_AMOUNT) + if(material.accelerant_value > FUEL_VALUE_NONE) + product.fuel += material.accelerant_value * round(product.matter[mat] / SHEET_MATERIAL_AMOUNT) return product /datum/stack_recipe/fountain diff --git a/code/modules/mechs/_mech_setup.dm b/code/modules/mechs/_mech_setup.dm index b9a65259b69..4b3f2949bcc 100644 --- a/code/modules/mechs/_mech_setup.dm +++ b/code/modules/mechs/_mech_setup.dm @@ -7,40 +7,3 @@ var/global/list/mech_damage_overlay_cache = list() var/global/list/mech_image_cache = list() var/global/list/mech_icon_cache = list() var/global/list/mech_weapon_overlays = icon_states('icons/mecha/mech_weapon_overlays.dmi') - -#define HARDPOINT_BACK "back" -#define HARDPOINT_LEFT_HAND "left hand" -#define HARDPOINT_RIGHT_HAND "right hand" -#define HARDPOINT_LEFT_SHOULDER "left shoulder" -#define HARDPOINT_RIGHT_SHOULDER "right shoulder" -#define HARDPOINT_HEAD "head" - -// No software required: taser. light, radio. -#define MECH_SOFTWARE_UTILITY "utility equipment" // Plasma torch, clamp, drill. -#define MECH_SOFTWARE_MEDICAL "medical support systems" // Sleeper. -#define MECH_SOFTWARE_WEAPONS "standard weapon systems" // Ballistics and energy weapons. -#define MECH_SOFTWARE_ENGINEERING "advanced engineering systems" // RCD. - -// EMP damage points before various effects occur. -#define EMP_GUI_DISRUPT 5 // 1 ion rifle shot == 8. -#define EMP_MOVE_DISRUPT 10 // 2 shots. -#define EMP_ATTACK_DISRUPT 20 // 3 shots. - -//About components -#define MECH_COMPONENT_DAMAGE_UNDAMAGED 1 -#define MECH_COMPONENT_DAMAGE_DAMAGED 2 -#define MECH_COMPONENT_DAMAGE_DAMAGED_BAD 3 -#define MECH_COMPONENT_DAMAGE_DAMAGED_TOTAL 4 - -//Construction -#define FRAME_REINFORCED 1 -#define FRAME_REINFORCED_SECURE 2 -#define FRAME_REINFORCED_WELDED 3 - -#define FRAME_WIRED 1 -#define FRAME_WIRED_ADJUSTED 2 - -//POWER! -#define MECH_POWER_OFF 0 -#define MECH_POWER_TRANSITION 1 -#define MECH_POWER_ON 2 diff --git a/code/modules/mechs/components/_components.dm b/code/modules/mechs/components/_components.dm index a329cddbf6c..fa8ae476b26 100644 --- a/code/modules/mechs/components/_components.dm +++ b/code/modules/mechs/components/_components.dm @@ -7,7 +7,7 @@ material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/osmium = MATTER_AMOUNT_TRACE ) dir = SOUTH @@ -55,7 +55,7 @@ user.visible_message(SPAN_NOTICE("\The [user] installs \the [thing] in \the [src].")) return 1 -/obj/item/mech_component/proc/update_health() +/obj/item/mech_component/proc/update_component_health() total_damage = brute_damage + burn_damage if(total_damage > max_damage) total_damage = max_damage var/prev_state = damage_state @@ -77,13 +77,13 @@ /obj/item/mech_component/proc/take_brute_damage(var/amt) brute_damage = max(0, brute_damage + amt) - update_health() + update_component_health() if(total_damage == max_damage) take_component_damage(amt,0) /obj/item/mech_component/proc/take_burn_damage(var/amt) burn_damage = max(0, burn_damage + amt) - update_health() + update_component_health() if(total_damage == max_damage) take_component_damage(0,amt) diff --git a/code/modules/mechs/components/armour.dm b/code/modules/mechs/components/armour.dm index 79f3d8213db..b86d67295dc 100644 --- a/code/modules/mechs/components/armour.dm +++ b/code/modules/mechs/components/armour.dm @@ -12,7 +12,7 @@ ARMOR_BIO = ARMOR_BIO_SHIELDED, ARMOR_RAD = ARMOR_RAD_MINOR ) - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel /obj/item/robot_parts/robot_component/armour/exosuit/radproof @@ -27,7 +27,7 @@ ARMOR_BIO = ARMOR_BIO_SHIELDED, ARMOR_RAD = ARMOR_RAD_SHIELDED ) - origin_tech = "{'materials':3}" + origin_tech = @'{"materials":3}' material = /decl/material/solid/metal/steel /obj/item/robot_parts/robot_component/armour/exosuit/em @@ -42,7 +42,7 @@ ARMOR_BIO = ARMOR_BIO_SHIELDED, ARMOR_RAD = ARMOR_RAD_SMALL ) - origin_tech = "{'materials':3}" + origin_tech = @'{"materials":3}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT) @@ -57,7 +57,7 @@ ARMOR_BOMB = ARMOR_BOMB_RESISTANT, ARMOR_BIO = ARMOR_BIO_SHIELDED ) - origin_tech = "{'materials':5}" + origin_tech = @'{"materials":5}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index ad13fe6fc90..5f072a7392e 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -162,7 +162,7 @@ else return ..() -/obj/item/mech_component/chassis/receive_mouse_drop(atom/dropping, mob/user) +/obj/item/mech_component/chassis/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && istype(dropping, /obj/machinery/portable_atmospherics/canister)) var/obj/machinery/portable_atmospherics/canister/C = dropping @@ -180,9 +180,9 @@ update_components() return TRUE -/obj/item/mech_component/chassis/handle_mouse_drop(atom/over, mob/user) +/obj/item/mech_component/chassis/handle_mouse_drop(atom/over, mob/user, params) if(storage_compartment) - return storage_compartment.handle_mouse_drop(over, user) + return storage_compartment.handle_mouse_drop(over, user, params) . = ..() /obj/item/mech_component/chassis/return_diagnostics(mob/user) diff --git a/code/modules/mechs/components/software.dm b/code/modules/mechs/components/software.dm index 1a7a5f1c916..49cc737083d 100644 --- a/code/modules/mechs/components/software.dm +++ b/code/modules/mechs/components/software.dm @@ -6,22 +6,22 @@ /obj/item/stock_parts/circuitboard/exosystem/engineering name = "exosuit circuit (engineering systems)" contains_software = list(MECH_SOFTWARE_ENGINEERING) - origin_tech = "{'programming':1}" + origin_tech = @'{"programming":1}' /obj/item/stock_parts/circuitboard/exosystem/utility name = "exosuit circuit (utility systems)" contains_software = list(MECH_SOFTWARE_UTILITY) icon = 'icons/obj/modules/module_controller.dmi' - origin_tech = "{'programming':1}" + origin_tech = @'{"programming":1}' /obj/item/stock_parts/circuitboard/exosystem/medical name = "exosuit circuit (medical systems)" contains_software = list(MECH_SOFTWARE_MEDICAL) icon = 'icons/obj/modules/module_controller.dmi' - origin_tech = "{'programming':3,'biotech':2}" + origin_tech = @'{"programming":3,"biotech":2}' /obj/item/stock_parts/circuitboard/exosystem/weapons name = "exosuit circuit (basic weapon systems)" contains_software = list(MECH_SOFTWARE_WEAPONS) icon = 'icons/obj/modules/module_mainboard.dmi' - origin_tech = "{'programming':4,'combat':3}" + origin_tech = @'{"programming":4,"combat":3}' diff --git a/code/modules/mechs/equipment/_equipment.dm b/code/modules/mechs/equipment/_equipment.dm index 0822da56c1c..effd53ec4e5 100644 --- a/code/modules/mechs/equipment/_equipment.dm +++ b/code/modules/mechs/equipment/_equipment.dm @@ -6,7 +6,7 @@ icon_state = "" material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/osmium = MATTER_AMOUNT_TRACE ) force = 10 @@ -87,14 +87,14 @@ /obj/item/mech_equipment/proc/MouseUpInteraction() return 0 -/obj/item/mech_equipment/mob_can_unequip(mob/M, slot, disable_warning) +/obj/item/mech_equipment/mob_can_unequip(mob/user, slot, disable_warning = FALSE) . = ..() if(. && owner) //Installed equipment shall not be unequiped. return FALSE /obj/item/mech_equipment/mounted_system - var/holding_type + abstract_type = /obj/item/mech_equipment/mounted_system var/obj/item/holding /obj/item/mech_equipment/mounted_system/attack_self(var/mob/user) @@ -104,26 +104,26 @@ /obj/item/mech_equipment/mounted_system/proc/forget_holding() if(holding) //It'd be strange for this to be called with this var unset - events_repository.unregister(/decl/observ/destroyed, holding, src, .proc/forget_holding) + events_repository.unregister(/decl/observ/destroyed, holding, src, PROC_REF(forget_holding)) holding = null if(!QDELETED(src)) qdel(src) /obj/item/mech_equipment/mounted_system/Initialize() . = ..() - if(holding_type) - holding = new holding_type(src) - events_repository.register(/decl/observ/destroyed, holding, src, .proc/forget_holding) - if(holding) - if(!icon_state) - icon = holding.icon - icon_state = holding.icon_state - SetName(holding.name) - desc = "[holding.desc] This one is suitable for installation on an exosuit." - + if(ispath(holding)) + holding = new holding(src) + events_repository.register(/decl/observ/destroyed, holding, src, PROC_REF(forget_holding)) + if(!istype(holding)) + return + if(!icon_state) + icon = holding.icon + icon_state = holding.icon_state + SetName(holding.name) + desc = "[holding.desc] This one is suitable for installation on an exosuit." /obj/item/mech_equipment/mounted_system/Destroy() - events_repository.unregister(/decl/observ/destroyed, holding, src, .proc/forget_holding) + events_repository.unregister(/decl/observ/destroyed, holding, src, PROC_REF(forget_holding)) if(holding) QDEL_NULL(holding) . = ..() diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index d9352b84228..188c458f3fc 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -2,7 +2,8 @@ name = "mounted electrolaser carbine" desc = "A dual fire mode electrolaser system connected to the exosuit's targetting system." icon_state = "mech_taser" - holding_type = /obj/item/gun/energy/taser/mounted/mech + origin_tech = @'{"combat":1,"magnets":1,"engineering":1}' + holding = /obj/item/gun/energy/taser/mounted/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_WEAPONS) @@ -10,13 +11,15 @@ name = "mounted ion rifle" desc = "An exosuit-mounted ion rifle. Handle with care." icon_state = "mech_ionrifle" - holding_type = /obj/item/gun/energy/ionrifle/mounted/mech + holding = /obj/item/gun/energy/ionrifle/mounted/mech + origin_tech = @'{"combat":2,"powerstorage":2,"magnets":4,"engineering":2}' /obj/item/mech_equipment/mounted_system/taser/laser name = "\improper CH-PS \"Immolator\" laser" desc = "An exosuit-mounted laser rifle. Handle with care." icon_state = "mech_lasercarbine" - holding_type = /obj/item/gun/energy/laser/mounted/mech + holding = /obj/item/gun/energy/laser/mounted/mech + origin_tech = @'{"combat":3,"magnets":2,"engineering":2}' /obj/item/gun/energy/taser/mounted/mech use_external_power = TRUE @@ -36,6 +39,9 @@ self_recharge = TRUE /obj/item/gun/energy/get_hardpoint_maptext() + var/obj/item/cell/power_supply = get_cell() + if(!power_supply) + return 0 return "[round(power_supply.charge / charge_cost)]/[max_shots]" /obj/item/gun/energy/get_hardpoint_status_value() @@ -51,6 +57,7 @@ restricted_hardpoints = list(HARDPOINT_BACK) restricted_software = list(MECH_SOFTWARE_WEAPONS) material = /decl/material/solid/metal/steel + origin_tech = @'{"magnets":3,"powerstorage":4,"materials":2,"engineering":2}' matter = list( /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE @@ -156,7 +163,7 @@ . = ..() add_vis_contents(target, src) set_dir(target.dir) - events_repository.register(/decl/observ/dir_set, user, src, /obj/aura/mechshield/proc/update_dir) + events_repository.register(/decl/observ/dir_set, user, src, TYPE_PROC_REF(/obj/aura/mechshield, update_dir)) /obj/aura/mechshield/proc/update_dir(var/user, var/old_dir, var/dir) set_dir(dir) @@ -169,7 +176,7 @@ /obj/aura/mechshield/Destroy() if(user) - events_repository.unregister(/decl/observ/dir_set, user, src, /obj/aura/mechshield/proc/update_dir) + events_repository.unregister(/decl/observ/dir_set, user, src, TYPE_PROC_REF(/obj/aura/mechshield, update_dir)) remove_vis_contents(user, src) shields = null . = ..() @@ -221,6 +228,8 @@ //Melee! As a general rule I would recommend using regular objects and putting logic in them. /obj/item/mech_equipment/mounted_system/melee + abstract_type = /obj/item/mech_equipment/mounted_system/melee + origin_tech = @'{"combat":1,"materials":1,"engineering":1}' restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_UTILITY) @@ -255,7 +264,7 @@ . = ..() if (user.a_intent != I_HURT) return - var/obj/item/mech_equipment/mounted_system/melee/mechete/MC = loc + var/obj/item/mech_equipment/mounted_system/melee/machete/MC = loc if (istype(MC)) //SPIN BLADE ATTACK GO! var/mob/living/exosuit/E = MC.owner @@ -269,9 +278,9 @@ E.spin(0.65 SECONDS, 0.125 SECONDS) playsound(E, 'sound/mecha/mechturn.ogg', 40, 1) -/obj/item/mech_equipment/mounted_system/melee/mechete +/obj/item/mech_equipment/mounted_system/melee/machete icon_state = "mech_blade" - holding_type = /obj/item/hatchet/machete/mech + holding = /obj/item/hatchet/machete/mech //Ballistic shield @@ -279,14 +288,15 @@ name = "exosuit ballistic shield" desc = "This formidable line of defense, sees widespread use in planetary peacekeeping operations and military formations alike." icon_state = "mech_shield" //Rendering is handled by aura due to layering issues: TODO, figure out a better way to do this + restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) + restricted_software = list(MECH_SOFTWARE_UTILITY) + origin_tech = @'{"materials":2,"engineering":2}' var/obj/aura/mech_ballistic/aura = null var/last_push = 0 var/chance = 60 //For attacks from the front, diminishing returns var/last_max_block = 0 //Blocking during a perfect block window resets this, else there is an anti spam var/max_block = 60 // Should block most things var/blocking = FALSE - restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) - restricted_software = list(MECH_SOFTWARE_UTILITY) /obj/item/mech_equipment/ballistic_shield/installed(mob/living/exosuit/_owner) . = ..() @@ -396,14 +406,14 @@ . = ..() add_vis_contents(target, src) set_dir(target.dir) - global.events_repository.register(/decl/observ/dir_set, user, src, /obj/aura/mech_ballistic/proc/update_dir) + global.events_repository.register(/decl/observ/dir_set, user, src, TYPE_PROC_REF(/obj/aura/mech_ballistic, update_dir)) /obj/aura/mech_ballistic/proc/update_dir(user, old_dir, dir) set_dir(dir) /obj/aura/mech_ballistic/Destroy() if (user) - global.events_repository.unregister(/decl/observ/dir_set, user, src, /obj/aura/mech_ballistic/proc/update_dir) + global.events_repository.unregister(/decl/observ/dir_set, user, src, TYPE_PROC_REF(/obj/aura/mech_ballistic, update_dir)) remove_vis_contents(user, src) shield = null . = ..() @@ -449,7 +459,7 @@ restricted_software = list(MECH_SOFTWARE_WEAPONS) active_power_use = 7 KILOWATTS var/next_use = 0 - origin_tech = "{'magnets':2,'combat':3}" + origin_tech = @'{"magnets":2,"combat":3}' /obj/item/mech_equipment/flash/proc/area_flash() playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) diff --git a/code/modules/mechs/equipment/combat_projectile.dm b/code/modules/mechs/equipment/combat_projectile.dm index 1675de22360..040ff1497f1 100644 --- a/code/modules/mechs/equipment/combat_projectile.dm +++ b/code/modules/mechs/equipment/combat_projectile.dm @@ -28,10 +28,10 @@ /obj/item/mech_equipment/mounted_system/projectile name = "mounted submachine gun" icon_state = "mech_ballistic" - holding_type = /obj/item/gun/projectile/automatic/smg/mech + holding = /obj/item/gun/projectile/automatic/smg/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_WEAPONS) - origin_tech = "{'programming':4,'combat':6,'engineering':5}" + origin_tech = @'{"programming":4,"combat":6,"engineering":5}' /obj/item/gun/projectile/automatic/smg/mech magazine_type = /obj/item/ammo_magazine/mech/smg_top @@ -49,10 +49,10 @@ /obj/item/mech_equipment/mounted_system/projectile/assault_rifle name = "mounted assault rifle" icon_state = "mech_ballistic2" - holding_type = /obj/item/gun/projectile/automatic/assault_rifle/mech + holding = /obj/item/gun/projectile/automatic/assault_rifle/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_WEAPONS) - origin_tech = "{'programming':4,'combat':8,'engineering':6}" + origin_tech = @'{"programming":4,"combat":8,"engineering":6}' /obj/item/gun/projectile/automatic/assault_rifle/mech magazine_type = /obj/item/ammo_magazine/mech/rifle @@ -69,9 +69,10 @@ /obj/item/mech_equipment/mounted_system/projectile/machine name = "mounted machine gun" icon_state = "mech_machine_gun" - holding_type = /obj/item/gun/projectile/automatic/machine/mech + holding = /obj/item/gun/projectile/automatic/machine/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_WEAPONS) + origin_tech = @'{"programming":4,"combat":8,"engineering":6}' /obj/item/gun/projectile/automatic/machine/mech magazine_type = /obj/item/ammo_magazine/mech/rifle/drum diff --git a/code/modules/mechs/equipment/engineering.dm b/code/modules/mechs/equipment/engineering.dm index c9a4f3827f1..37fbe1d4e5a 100644 --- a/code/modules/mechs/equipment/engineering.dm +++ b/code/modules/mechs/equipment/engineering.dm @@ -1,11 +1,12 @@ /obj/item/mech_equipment/mounted_system/rcd icon_state = "mech_rcd" - holding_type = /obj/item/rcd/mounted + holding = /obj/item/rcd/mounted + origin_tech = @'{"engineering":4,"materials":3,"powerstorage":1}' restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_ENGINEERING) material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE ) @@ -38,21 +39,24 @@ /obj/item/mech_equipment/mounted_system/extinguisher icon_state = "mech_exting" - holding_type = /obj/item/chems/spray/extinguisher/mech + holding = /obj/item/chems/spray/extinguisher/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_ENGINEERING) + origin_tech = @'{"engineering":1,"materials":1}' /obj/item/mech_equipment/atmos_shields icon_state = "mech_atmoshield_off" name = "exosuit airshield" - desc = "A 'Zephyros' portable Atmospheric Isolation and Retention Screen. It keeps air where it should be... Most of the time. Press ctrl-click to switch modes" + desc = "A 'Zephyros' portable Atmospheric Isolation and Retention Screen. It keeps air where it should be... most of the time. Press ctrl-click to switch modes." restricted_hardpoints = list(HARDPOINT_BACK) restricted_software = list(MECH_SOFTWARE_ENGINEERING) - var/list/segments equipment_delay = 0.25 SECONDS + origin_tech = @'{"engineering":2,"powerstorage":2,"materials":3}' + var/list/segments var/current_mode = 0 //0 barrier, 1 bubble var/shield_range = 2 +// TODO: convert to alt interaction. /obj/item/mech_equipment/atmos_shields/CtrlClick(mob/user) if (owner && ((user in owner.pilots) || user == owner)) if (active) @@ -71,7 +75,7 @@ anchored = TRUE layer = ABOVE_HUMAN_LAYER density = FALSE - invisibility = 0 + invisibility = INVISIBILITY_NONE atmos_canpass = CANPASS_NEVER var/obj/item/mech_equipment/atmos_shields/shields color = COLOR_SABER_BLUE @@ -140,14 +144,14 @@ if(istype(MS)) MS.shields = src segments += MS - events_repository.register(/decl/observ/moved, MS, src, .proc/on_moved) + events_repository.register(/decl/observ/moved, MS, src, PROC_REF(on_moved)) passive_power_use = 0.8 KILOWATTS * segments.len update_icon() owner.update_icon() - events_repository.register(/decl/observ/moved, owner, src, .proc/on_moved) - events_repository.register(/decl/observ/dir_set, owner, src, .proc/on_turned) + events_repository.register(/decl/observ/moved, owner, src, PROC_REF(on_moved)) + events_repository.register(/decl/observ/dir_set, owner, src, PROC_REF(on_turned)) /obj/item/mech_equipment/atmos_shields/on_update_icon() . = ..() @@ -156,13 +160,13 @@ /obj/item/mech_equipment/atmos_shields/deactivate() for(var/obj/effect/mech_shield/MS in segments) if(istype(MS)) - events_repository.unregister(/decl/observ/moved, MS, src, .proc/on_moved) + events_repository.unregister(/decl/observ/moved, MS, src, PROC_REF(on_moved)) if(segments.len) owner.visible_message(SPAN_WARNING("The energy shields in front of \the [owner] disappear!")) QDEL_NULL_LIST(segments) passive_power_use = 0 - events_repository.unregister(/decl/observ/moved, owner, src, .proc/on_moved) - events_repository.unregister(/decl/observ/dir_set, owner, src, .proc/on_turned) + events_repository.unregister(/decl/observ/moved, owner, src, PROC_REF(on_moved)) + events_repository.unregister(/decl/observ/dir_set, owner, src, PROC_REF(on_turned)) . = ..() update_icon() owner.update_icon() diff --git a/code/modules/mechs/equipment/medical.dm b/code/modules/mechs/equipment/medical.dm index 35473b48113..4dc126c7cc7 100644 --- a/code/modules/mechs/equipment/medical.dm +++ b/code/modules/mechs/equipment/medical.dm @@ -6,7 +6,7 @@ restricted_software = list(MECH_SOFTWARE_MEDICAL) equipment_delay = 30 //don't spam it on people pls active_power_use = 0 //Usage doesn't really require power. We don't want people stuck inside - origin_tech = "{'programming':2,'biotech':3}" + origin_tech = @'{"programming":2,"biotech":3}' passive_power_use = 1.5 KILOWATTS var/obj/machinery/sleeper/mounted/sleeper = null diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index 1a0fbde243f..4873d03fbb6 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -4,7 +4,7 @@ icon_state = "mech_clamp" restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_UTILITY) - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' var/carrying_capacity = 5 var/list/obj/carrying = list() @@ -49,7 +49,7 @@ playsound(FD, 'sound/effects/meteorimpact.ogg', 100, 1) playsound(FD, 'sound/machines/airlock_creaking.ogg', 100, 1) FD.blocked = FALSE - addtimer(CALLBACK(FD, /obj/machinery/door/firedoor/.proc/open, TRUE), 0) + addtimer(CALLBACK(FD, TYPE_PROC_REF(/obj/machinery/door/firedoor, open), TRUE), 0) FD.set_broken(TRUE) FD.visible_message(SPAN_WARNING("\The [owner] tears \the [FD] open!")) else @@ -58,10 +58,10 @@ playsound(FD, 'sound/machines/airlock_creaking.ogg', 100, 1) if(FD.density) FD.visible_message(SPAN_DANGER("\The [owner] forces \the [FD] open!")) - addtimer(CALLBACK(FD, /obj/machinery/door/firedoor/.proc/open, TRUE), 0) + addtimer(CALLBACK(FD, TYPE_PROC_REF(/obj/machinery/door/firedoor, open), TRUE), 0) else FD.visible_message(SPAN_WARNING("\The [owner] forces \the [FD] closed!")) - addtimer(CALLBACK(FD, /obj/machinery/door/firedoor/.proc/close, TRUE), 0) + addtimer(CALLBACK(FD, TYPE_PROC_REF(/obj/machinery/door/firedoor, close), TRUE), 0) return else if(istype(O, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/AD = O @@ -74,7 +74,7 @@ playsound(AD, 'sound/effects/meteorimpact.ogg', 100, 1) playsound(AD, 'sound/machines/airlock_creaking.ogg', 100, 1) AD.visible_message(SPAN_DANGER("\The [owner] tears \the [AD] open!")) - addtimer(CALLBACK(AD, /obj/machinery/door/airlock/.proc/open, TRUE), 0) + addtimer(CALLBACK(AD, TYPE_PROC_REF(/obj/machinery/door/airlock, open), TRUE), 0) AD.set_broken(TRUE) return else @@ -82,12 +82,12 @@ if((AD.is_broken(NOPOWER) || do_after(owner, 5 SECONDS,AD)) && !(AD.operating || AD.welded || AD.locked)) playsound(AD, 'sound/machines/airlock_creaking.ogg', 100, 1) if(AD.density) - addtimer(CALLBACK(AD, /obj/machinery/door/airlock/.proc/open, TRUE), 0) + addtimer(CALLBACK(AD, TYPE_PROC_REF(/obj/machinery/door/airlock, open), TRUE), 0) if(!AD.is_broken(NOPOWER)) AD.set_broken(TRUE) AD.visible_message(SPAN_DANGER("\The [owner] forces \the [AD] open!")) else - addtimer(CALLBACK(AD, /obj/machinery/door/airlock/.proc/close, TRUE), 0) + addtimer(CALLBACK(AD, TYPE_PROC_REF(/obj/machinery/door/airlock, close), TRUE), 0) if(!AD.is_broken(NOPOWER)) AD.set_broken(TRUE) AD.visible_message(SPAN_DANGER("\The [owner] forces \the [AD] closed!")) @@ -197,7 +197,7 @@ item_state = "mech_floodlight" restricted_hardpoints = list(HARDPOINT_HEAD, HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER) mech_layer = MECH_INTERMEDIATE_LAYER - origin_tech = "{'materials':1,'engineering':1}" + origin_tech = @'{"materials":1,"engineering":1}' var/on = 0 var/l_power = 0.9 @@ -251,7 +251,7 @@ var/mode = CATAPULT_SINGLE var/atom/movable/locked equipment_delay = 30 //Stunlocks are not ideal - origin_tech = "{'materials':4,'engineering':4,'magnets':4}" + origin_tech = @'{"materials":4,"engineering":4,"magnets":4}' require_adjacent = FALSE /obj/item/mech_equipment/catapult/get_hardpoint_maptext() @@ -372,7 +372,7 @@ //Drill can have a head var/obj/item/drill_head/drill_head - origin_tech = "{'materials':2,'engineering':2}" + origin_tech = @'{"materials":2,"engineering":2}' /obj/item/mech_equipment/drill/Initialize() . = ..() @@ -435,26 +435,24 @@ if (!..()) // /obj/item/mech_equipment/afterattack implements a usage guard return - if (istype(target, /obj/item/drill_head)) - attach_head(target, user) + if(!target.simulated) return if (!drill_head) - to_chat(user, SPAN_WARNING("\The [src] doesn't have a head!")) + if (istype(target, /obj/item/drill_head)) + attach_head(target, user) + else + to_chat(user, SPAN_WARNING("\The [src] doesn't have a head!")) return if (ismob(target)) - var/mob/tmob = target - if (tmob.unacidable) - to_chat(user, SPAN_WARNING("\The [target] can't be drilled away.")) - return - else - to_chat(tmob, FONT_HUGE(SPAN_DANGER("You're about to get drilled - dodge!"))) + to_chat(target, FONT_HUGE(SPAN_DANGER("You're about to get drilled - dodge!"))) else if (isobj(target)) var/obj/tobj = target - if (tobj.unacidable) - to_chat(user, SPAN_WARNING("\The [target] can't be drilled away.")) + var/decl/material/mat = tobj.get_material() + if (mat && mat.hardness < drill_head.material?.hardness) + to_chat(user, SPAN_WARNING("\The [target] is too hard to be destroyed by [drill_head.material ? "a [drill_head.material.adjective_name]" : "this"] drill.")) return else if (istype(target, /turf/unsimulated)) @@ -495,15 +493,6 @@ scoop_ore(target) return - if (istype(target, /turf/simulated/floor/asteroid)) - for (var/turf/simulated/floor/asteroid/asteroid in RANGE_TURFS(target, 1)) - if (!(get_dir(owner, asteroid) & owner.dir)) - continue - drill_head.durability -= 1 - asteroid.gets_dug() - scoop_ore(target) - return - if (istype(target, /turf/simulated/wall)) var/turf/simulated/wall/wall = target var/wall_hardness = max(wall.material.hardness, wall.reinf_material ? wall.reinf_material.hardness : 0) @@ -512,6 +501,15 @@ drill_head.durability -= 2 return + if(istype(target, /turf)) + for(var/turf/asteroid in RANGE_TURFS(target, 1)) + if (!(get_dir(owner, asteroid) & owner.dir)) + continue + if(asteroid.can_be_dug() && asteroid.drop_diggable_resources()) + drill_head.durability -= 1 + scoop_ore(asteroid) + return + var/audible = "loudly grinding machinery" if (iscarbon(target)) //splorch audible = "a terrible rending of metal and flesh" @@ -546,17 +544,17 @@ name = "mounted plasma cutter" desc = "An industrial plasma cutter mounted onto the chassis of the mech. " icon_state = "mech_plasma" - holding_type = /obj/item/gun/energy/plasmacutter/mounted/mech + holding = /obj/item/gun/energy/plasmacutter/mounted/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND, HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER) restricted_software = list(MECH_SOFTWARE_UTILITY) - origin_tech = "{'materials':4,'engineering':6,'exoticmatter':4,'combat':3}" + origin_tech = @'{"materials":4,"engineering":6,"exoticmatter":4,"combat":3}' /obj/item/mech_equipment/mounted_system/taser/autoplasma icon_state = "mech_energy" - holding_type = /obj/item/gun/energy/plasmacutter/mounted/mech/auto + holding = /obj/item/gun/energy/plasmacutter/mounted/mech/auto restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_UTILITY) - origin_tech = "{'materials':5,'engineering':6,'exoticmatter':4,'combat':4}" + origin_tech = @'{"materials":5,"engineering":6,"exoticmatter":4,"combat":4}' /obj/item/gun/energy/plasmacutter/mounted/mech/auto charge_cost = 13 @@ -578,7 +576,7 @@ passive_power_use = 0 KILOWATTS var/activated_passive_power = 2 KILOWATTS var/movement_power = 75 - origin_tech = "{'magnets':3,'engineering':3,'exoticmatter':3}" + origin_tech = @'{"magnets":3,"engineering":3,"exoticmatter":3}' var/datum/effect/effect/system/trail/ion/ion_trail require_adjacent = FALSE var/stabilizers = FALSE @@ -702,7 +700,7 @@ restricted_software = list(MECH_SOFTWARE_UTILITY) equipment_delay = 10 - origin_tech = "{'materials':1,'engineering':1,'magnets':2}" + origin_tech = @'{"materials":1,"engineering":1,"magnets":2}' /obj/item/mech_equipment/camera/Initialize() diff --git a/code/modules/mechs/interface/_interface.dm b/code/modules/mechs/interface/_interface.dm index 38535387f41..bced208448d 100644 --- a/code/modules/mechs/interface/_interface.dm +++ b/code/modules/mechs/interface/_interface.dm @@ -1,5 +1,3 @@ -#define BAR_CAP 12 - /mob/living/exosuit var/static/list/additional_hud_elements = list( /obj/screen/exosuit/toggle/power_control, @@ -23,11 +21,11 @@ client.screen |= hud_elements /mob/living/exosuit/InitializeHud() - zone_sel = new + zone_sel = new(null, src) if(!LAZYLEN(hud_elements)) var/i = 1 for(var/hardpoint in hardpoints) - var/obj/screen/exosuit/hardpoint/H = new(src, hardpoint) + var/obj/screen/exosuit/hardpoint/H = new(null, src, null, null, null, hardpoint) H.screen_loc = "LEFT:6,TOP-[i]:-16" hud_elements |= H hardpoint_hud_elements[hardpoint] = H @@ -38,26 +36,33 @@ i = 0 var/pos = 7 for(var/additional_hud in additional_hud_elements) - var/obj/screen/exosuit/M = new additional_hud(src) + var/obj/screen/exosuit/M = new additional_hud(null, src) M.screen_loc = "LEFT:6,BOTTOM+[pos]:[i]" hud_elements |= M i -= M.height - hud_health = new /obj/screen/exosuit/health(src) + hud_health = new /obj/screen/exosuit/health(null, src) hud_health.screen_loc = "RIGHT-1:28,CENTER-3:11" hud_elements |= hud_health hud_open = locate(/obj/screen/exosuit/toggle/hatch_open) in hud_elements - hud_power = new /obj/screen/exosuit/power(src) + hud_power = new /obj/screen/exosuit/power(null, src) hud_power.screen_loc = "RIGHT-1:28,CENTER-4:25" hud_elements |= hud_power hud_power_control = locate(/obj/screen/exosuit/toggle/power_control) in hud_elements hud_camera = locate(/obj/screen/exosuit/toggle/camera) in hud_elements - hud_heat = new /obj/screen/exosuit/heat(src) + hud_heat = new /obj/screen/exosuit/heat(null, src) hud_heat.screen_loc = "RIGHT-1:28,CENTER-4" hud_elements |= hud_heat refresh_hud() +/mob/living/exosuit/should_do_hud_updates() + . = ..() + if(!. && length(pilots)) + for(var/mob/living/pilot in pilots) + if(pilot.should_do_hud_updates()) + return TRUE + /mob/living/exosuit/handle_hud_icons() for(var/hardpoint in hardpoint_hud_elements) var/obj/screen/exosuit/hardpoint/H = hardpoint_hud_elements[hardpoint] @@ -122,4 +127,4 @@ if(H) H.color = "#a03b3b" animate(H, color = COLOR_WHITE, time = timeout, easing = CUBIC_EASING | EASE_IN) - addtimer(CALLBACK(src, .proc/reset_hardpoint_color), timeout) \ No newline at end of file + addtimer(CALLBACK(src, PROC_REF(reset_hardpoint_color)), timeout) \ No newline at end of file diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 2dccac4ee91..260efb99c98 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -12,7 +12,7 @@ status_flags = PASSEMOTES a_intent = I_HURT mob_size = MOB_SIZE_LARGE - atom_flags = ATOM_FLAG_SHIELD_CONTENTS | ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_BLOCK_DIAGONAL_FACING + atom_flags = ATOM_FLAG_SHIELD_CONTENTS | ATOM_FLAG_BLOCK_DIAGONAL_FACING meat_type = null meat_amount = 0 @@ -119,8 +119,6 @@ if(source_frame.material) material = source_frame.material - updatehealth() - // Generate hardpoint list. var/list/component_descriptions for(var/obj/item/mech_component/comp in list(arms, legs, head, body)) @@ -177,7 +175,7 @@ for(var/hardpoint in hardpoint_hud_elements) var/obj/screen/exosuit/hardpoint/H = hardpoint_hud_elements[hardpoint] - H.owner = null + H.owner_ref = null H.holding = null qdel(H) hardpoint_hud_elements.Cut() @@ -208,9 +206,9 @@ /mob/living/exosuit/return_air() return (body && body.pilot_coverage >= 100 && hatch_closed && body.cockpit) ? body.cockpit : loc.return_air() -/mob/living/exosuit/GetIdCards() +/mob/living/exosuit/GetIdCards(list/exceptions) . = ..() - if(istype(access_card)) + if(istype(access_card) && !is_type_in_list(access_card, exceptions)) LAZYDISTINCTADD(., access_card) /mob/living/exosuit/set_dir() diff --git a/code/modules/mechs/mech_construction.dm b/code/modules/mechs/mech_construction.dm index 35f6b87b440..8a2bfd3b391 100644 --- a/code/modules/mechs/mech_construction.dm +++ b/code/modules/mechs/mech_construction.dm @@ -45,7 +45,7 @@ if(target == selected_hardpoint) clear_selected_hardpoint() - events_repository.unregister(/decl/observ/destroyed, module_to_forget, src, .proc/forget_module) + events_repository.unregister(/decl/observ/destroyed, module_to_forget, src, PROC_REF(forget_module)) var/obj/screen/exosuit/hardpoint/H = hardpoint_hud_elements[target] H.holding = null @@ -96,7 +96,7 @@ playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1) else return FALSE - events_repository.register(/decl/observ/destroyed, system, src, .proc/forget_module) + events_repository.register(/decl/observ/destroyed, system, src, PROC_REF(forget_module)) system.forceMove(src) hardpoints[system_hardpoint] = system @@ -139,7 +139,7 @@ system.forceMove(get_turf(src)) system.screen_loc = null system.layer = initial(system.layer) - events_repository.unregister(/decl/observ/destroyed, system, src, .proc/forget_module) + events_repository.unregister(/decl/observ/destroyed, system, src, PROC_REF(forget_module)) var/obj/screen/exosuit/hardpoint/H = hardpoint_hud_elements[system_hardpoint] H.holding = null diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 84e74389446..3b8c152f403 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -80,19 +80,22 @@ if(body_armor) . += body_armor -/mob/living/exosuit/updatehealth() - maxHealth = body ? body.mech_health : 0 - health = maxHealth-(getFireLoss()+getBruteLoss()) +/mob/living/exosuit/get_max_health() + return (body ? body.mech_health : 0) -/mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) +/mob/living/exosuit/get_total_life_damage() + return (getFireLoss()+getBruteLoss()) + +/mob/living/exosuit/adjustFireLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head)), var/do_update_health = TRUE) if(MC) MC.take_burn_damage(amount) - MC.update_health() + if(do_update_health) + update_health() // TODO: unify these procs somehow instead of having weird brute-wrapping behavior as the default. -/mob/living/exosuit/adjustBruteLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head))) +/mob/living/exosuit/adjustBruteLoss(var/amount, var/obj/item/mech_component/MC = pick(list(arms, legs, body, head)), var/do_update_health = TRUE) if(MC) MC.take_brute_damage(amount) - MC.update_health() + ..() /mob/living/exosuit/proc/zoneToComponent(var/zone) switch(zone) @@ -152,8 +155,6 @@ if((damagetype == BRUTE || damagetype == BURN) && prob(25+(damage*2))) sparks.set_up(3,0,src) sparks.start() - updatehealth() - return 1 /mob/living/exosuit/rad_act(var/severity) @@ -164,7 +165,7 @@ if(!hatch_closed || (body.pilot_coverage < 100)) //Open, environment is the source return . var/list/after_armor = modify_damage_by_armor(null, ., IRRADIATE, DAM_DISPERSED, src, 0, TRUE) - return after_armor[1] + return after_armor[1] /mob/living/exosuit/getFireLoss() var/total = 0 @@ -200,6 +201,6 @@ for(var/thing in pilots) var/mob/pilot = thing pilot.emp_act(severity) - + /mob/living/exosuit/get_bullet_impact_effect_type(def_zone) return BULLET_IMPACT_METAL diff --git a/code/modules/mechs/mech_damage_immunity.dm b/code/modules/mechs/mech_damage_immunity.dm index 23a69ffd596..067c613d56d 100644 --- a/code/modules/mechs/mech_damage_immunity.dm +++ b/code/modules/mechs/mech_damage_immunity.dm @@ -14,7 +14,8 @@ /mob/living/exosuit/setOxyLoss() return 0 -/mob/living/exosuit/adjustOxyLoss() +/mob/living/exosuit/adjustOxyLoss(var/damage, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) return 0 /mob/living/exosuit/getToxLoss() @@ -23,7 +24,7 @@ /mob/living/exosuit/setToxLoss() return 0 -/mob/living/exosuit/adjustToxLoss() +/mob/living/exosuit/adjustToxLoss(var/amount, var/do_update_health = TRUE) return 0 /mob/living/exosuit/getBrainLoss() @@ -32,7 +33,8 @@ /mob/living/exosuit/setBrainLoss() return 0 -/mob/living/exosuit/adjustBrainLoss() +/mob/living/exosuit/adjustBrainLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) return 0 /mob/living/exosuit/getCloneLoss() @@ -41,7 +43,8 @@ /mob/living/exosuit/setCloneLoss() return 0 -/mob/living/exosuit/adjustCloneLoss() +/mob/living/exosuit/adjustCloneLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) return 0 /mob/living/exosuit/getHalLoss() @@ -50,5 +53,6 @@ /mob/living/exosuit/setHalLoss() return 0 -/mob/living/exosuit/adjustHalLoss() +/mob/living/exosuit/adjustHalLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) return 0 \ No newline at end of file diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 2268f62713d..867f92eed14 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -1,11 +1,11 @@ -/mob/living/exosuit/receive_mouse_drop(atom/dropping, mob/user) +/mob/living/exosuit/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && istype(dropping, /obj/machinery/portable_atmospherics/canister)) - body.receive_mouse_drop(dropping, user) + body.receive_mouse_drop(dropping, user, params) return TRUE -/mob/living/exosuit/handle_mouse_drop(atom/over, mob/user) - if(body?.handle_mouse_drop(over, user)) +/mob/living/exosuit/handle_mouse_drop(atom/over, mob/user, params) + if(body?.handle_mouse_drop(over, user, params)) return TRUE . = ..() @@ -81,12 +81,12 @@ if(!hatch_closed) return max(shared_living_nano_distance(src_object), .) //Either visible to mech(outside) or visible to user (inside) -/mob/living/exosuit/exosuit/CanUseTopic(mob/user, datum/topic_state/state, href_list) +/mob/living/exosuit/CanUseTopic(mob/user, datum/topic_state/state, href_list) if(user in pilots) return STATUS_INTERACTIVE return ..() -/mob/living/exosuit/get_dexterity(var/silent = FALSE) +/mob/living/exosuit/get_dexterity(var/silent) return DEXTERITY_FULL /mob/living/exosuit/ClickOn(var/atom/A, var/params, var/mob/user) diff --git a/code/modules/mechs/mech_life.dm b/code/modules/mechs/mech_life.dm index c000678ca65..ad1964eb516 100644 --- a/code/modules/mechs/mech_life.dm +++ b/code/modules/mechs/mech_life.dm @@ -1,7 +1,16 @@ /mob/living/exosuit/handle_disabilities() return -/mob/living/exosuit/Life() +/mob/living/exosuit/update_lying() + lying = FALSE // Prevent carp from proning us + +/mob/living/exosuit/handle_regular_status_updates() + + if(!body && !QDELETED(src)) + physically_destroyed() + return FALSE + + . = ..() for(var/thing in pilots) var/mob/pilot = thing @@ -12,20 +21,10 @@ UNSETEMPTY(pilots) update_pilots() - if(!body && !QDELETED(src)) - qdel(src) - return - if(radio) radio.on = (head && head.radio && head.radio.is_functional() && get_cell()) - body.update_air(hatch_closed && use_air) - - var/powered = FALSE - if(get_cell()) - powered = get_cell().drain_power(0, 0, calc_power_draw()) > 0 - - if(!powered) + if(!is_suit_powered()) //Shut down all systems if(head) head.active_sensors = FALSE @@ -35,18 +34,11 @@ if(istype(M) && M.active && M.passive_power_use) M.deactivate() - updatehealth() - if(health <= 0 && stat != DEAD) - death() - if(emp_damage > 0) emp_damage -= min(1, emp_damage) //Reduce emp accumulation over time - ..() //Handles stuff like environment - - handle_hud_icons() - lying = FALSE // Fuck off, carp. - handle_vision(powered) +/mob/living/exosuit/proc/is_suit_powered() + return (get_cell()?.drain_power(0, 0, calc_power_draw())) > 0 /mob/living/exosuit/get_cell(force) RETURN_TYPE(/obj/item/cell) @@ -73,7 +65,13 @@ /mob/living/exosuit/handle_environment(var/datum/gas_mixture/environment) ..() - if(!environment) return + + if(body) + body.update_air(hatch_closed && use_air) + + if(!environment) + return + //Mechs and vehicles in general can be assumed to just tend to whatever ambient temperature if(abs(environment.temperature - bodytemperature) > 0 ) bodytemperature += ((environment.temperature - bodytemperature) / 6) @@ -125,14 +123,14 @@ qdel(src) return -/mob/living/exosuit/handle_vision(powered) +/mob/living/exosuit/handle_vision() var/was_blind = sight & BLIND if(head) + var/powered = is_suit_powered() sight = head.get_sight(powered) see_invisible = head.get_invisible(powered) if(body && (body.pilot_coverage < 100 || body.transparent_cabin) || !hatch_closed) sight &= ~BLIND - if(sight & BLIND && !was_blind) for(var/mob/pilot in pilots) to_chat(pilot, SPAN_WARNING("The sensors are not operational and you cannot see a thing!")) diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index a711b680ae9..6f926046cfa 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -184,8 +184,7 @@ /mob/living/exosuit/fall_damage() return 175 //Exosuits are big and heavy -/mob/living/exosuit/handle_fall_effect(var/turf/landing) +/mob/living/exosuit/apply_fall_damage(var/turf/landing) // Return here if for any reason you shouldn´t take damage - ..() if(legs) legs.handle_vehicle_fall() diff --git a/code/modules/mechs/premade/_premade.dm b/code/modules/mechs/premade/_premade.dm index 02caca0a7a7..98c988b32f8 100644 --- a/code/modules/mechs/premade/_premade.dm +++ b/code/modules/mechs/premade/_premade.dm @@ -4,9 +4,22 @@ name = "impossible exosuit" desc = "It seems to be saying 'please let me die'." abstract_type = /mob/living/exosuit/premade + icon = 'icons/mecha/mecha_preview.dmi' + icon_state = "preview" + pixel_x = 0 + pixel_y = 0 var/decal /mob/living/exosuit/premade/Initialize() + + // Reset our mapping helpers. + default_pixel_x = -8 + default_pixel_y = 0 + pixel_x = default_pixel_x + pixel_y = default_pixel_y + icon = null + icon_state = null + if(arms) arms.decal = decal arms.prebuild() diff --git a/code/modules/mechs/premade/powerloader.dm b/code/modules/mechs/premade/powerloader.dm index ef1e7fecc0f..45c7c782aa4 100644 --- a/code/modules/mechs/premade/powerloader.dm +++ b/code/modules/mechs/premade/powerloader.dm @@ -105,7 +105,7 @@ /mob/living/exosuit/premade/powerloader/mechete/spawn_mech_equipment() install_system(new /obj/item/mech_equipment/ballistic_shield(src), HARDPOINT_LEFT_HAND) - install_system(new /obj/item/mech_equipment/mounted_system/melee/mechete(src), HARDPOINT_RIGHT_HAND) + install_system(new /obj/item/mech_equipment/mounted_system/melee/machete(src), HARDPOINT_RIGHT_HAND) /mob/living/exosuit/premade/powerloader/flames_red name = "APLU \"Firestarter\"" diff --git a/code/modules/merchant/merchant_programs.dm b/code/modules/merchant/merchant_programs.dm index b09345aeca2..bd3c35a5a1e 100644 --- a/code/modules/merchant/merchant_programs.dm +++ b/code/modules/merchant/merchant_programs.dm @@ -101,7 +101,7 @@ if(istext(response)) last_comms = T.get_response(response, "No thank you.") else - last_comms = T.get_response("trade_complete", "Thank you!") + last_comms = T.get_response(TRADER_TRADE_COMPLETE, "Thank you!") T.trade(null,num, get_turf(pad)) bank -= response return @@ -124,9 +124,9 @@ return var/response = T.offer_items_for_trade(targets,num, get_turf(pad), skill) if(istext(response)) - last_comms = T.get_response(response,"No, a million times no.") + last_comms = T.get_response(response, "No, a million times no.") else - last_comms = T.get_response("trade_complete","Thanks for your business!") + last_comms = T.get_response(TRADER_TRADE_COMPLETE, "Thanks for your business!") return last_comms = "PAD NOT CONNECTED" @@ -138,7 +138,7 @@ if(istext(response)) last_comms = T.get_response(response, "Nope. Nope nope nope.") else - last_comms = T.get_response("trade_complete", "Glad to be of service!") + last_comms = T.get_response(TRADER_TRADE_COMPLETE, "Glad to be of service!") bank += response return last_comms = "PAD NOT CONNECTED" @@ -214,7 +214,7 @@ var/datum/trader/T = get_current_trader() if(T) if(!T.can_hail()) - last_comms = T.get_response("hail_deny", "No, I'm not speaking with you.") + last_comms = T.get_response(TRADER_HAIL_DENY, "No, I'm not speaking with you.") . = 1 else if(href_list["PRG_hail"]) diff --git a/code/modules/mining/drilling/drill_act.dm b/code/modules/mining/drilling/drill_act.dm index d75e5162716..30c1e1b9259 100644 --- a/code/modules/mining/drilling/drill_act.dm +++ b/code/modules/mining/drilling/drill_act.dm @@ -1,5 +1,7 @@ /turf/proc/drill_act() SHOULD_CALL_PARENT(TRUE) + drop_diggable_resources() + dig_pit() var/base_turf = get_base_turf_by_area(src) if(!istype(src, base_turf)) return ChangeTurf(base_turf) @@ -29,16 +31,3 @@ var/turf/T = GetBelow(src) if(istype(T)) T.drill_act() - -/turf/exterior/drill_act() - var/turf/exterior/digging = ..() - if(istype(digging) && digging.diggable) - new /obj/structure/pit(digging) - digging.diggable = FALSE - return digging - -/turf/simulated/floor/asteroid/drill_act() - var/turf/simulated/floor/asteroid/digging = ..() - if(istype(digging) && !digging.dug) - digging.gets_dug() - return digging \ No newline at end of file diff --git a/code/modules/mining/machinery/_material_processing.dm b/code/modules/mining/machinery/_material_processing.dm index 0d20dfaf71b..f149ec055a4 100644 --- a/code/modules/mining/machinery/_material_processing.dm +++ b/code/modules/mining/machinery/_material_processing.dm @@ -90,7 +90,7 @@ /obj/machinery/material_processing/Destroy() input_turf = null output_turf = null - events_repository.unregister(/decl/observ/moved, src, src, .proc/on_moved) + events_repository.unregister(/decl/observ/moved, src, src, PROC_REF(on_moved)) . = ..() /obj/machinery/material_processing/Initialize() @@ -99,7 +99,7 @@ SET_OUTPUT(output_turf) . = ..() queue_icon_update() - events_repository.register(/decl/observ/moved, src, src, .proc/on_moved) + events_repository.register(/decl/observ/moved, src, src, PROC_REF(on_moved)) /obj/machinery/material_processing/proc/on_moved(atom/moving, atom/old_loc, atom/new_loc) if(istype(input_turf, /turf)) diff --git a/code/modules/mining/machinery/material_extractor.dm b/code/modules/mining/machinery/material_extractor.dm index 65eb7db77b1..2da4d8c8f76 100644 --- a/code/modules/mining/machinery/material_extractor.dm +++ b/code/modules/mining/machinery/material_extractor.dm @@ -1,409 +1,296 @@ -//Machine meant to extra gases from hydrates -// Input is clockwise east, output clockwise west, gas output clockwise south -// The general concept is that it heats up things up to 20c and grabs anything gaseous or liquid at that temp range, with a debuff on liquids, so it doesn't replace more specialized machines. -#define GAS_EXTRACTOR_GAS_TANK 1000 -#define GAS_EXTRACTOR_REAGENTS_TANK 500 -#define GAS_EXTRACTOR_REAGENTS_INPUT_TANK 500 -#define GAS_EXTRACTOR_OPERATING_TEMP T20C + 5 //Temperature the machine heat stuff to.. Has to be 20c + 5 because someone decided ice melted at 20c -#define GAS_EXTRACTOR_LIQUID_EFFICIENCY 0.75 //% efficiency for liquids -#define GAS_EXTRACTOR_MIN_REAGENT_AMOUNT 0.1 //Minimum amount of reagents units we tolerate in the machine to keep things clean - -//Whitelist of items that can be processed by the machine -var/global/list/material_extractor_items_whitelist = list(/obj/item/stack/material/ore) - -//////////////////////////////////////////////////// -// Holder for the reagents_holder. -// Since reagents_holder can't exist on its own for some reasons -//////////////////////////////////////////////////// -/obj/input_holder - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT //We wanna disable those to trigger reactions on our own terms - -//////////////////////////////////////////////////// -// Actual machine -//////////////////////////////////////////////////// -/obj/machinery/atmospherics/unary/material/extractor - name = "gas extractor" - desc = "A machine for extracting liquids and gases from ices and hydrates. Extracts liquids at a reduced efficiency." +#define GAS_EXTRACTOR_OPERATING_TEMP T20C + 15 +#define MAX_INTAKE_ORE_PER_TICK 10 + +/obj/machinery/material_processing/extractor + name = "material extractor" + desc = "A machine for extracting liquids and gases from ices and hydrates." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "extractor" - layer = MOB_LAYER+1 // Overhead - density = TRUE - - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT //We wanna disable those to trigger reactions on our own terms - obj_flags = OBJ_FLAG_ANCHORABLE | OBJ_FLAG_ROTATABLE - use_power = POWER_USE_OFF - idle_power_usage = 25 //WATTS - power_rating = 1 KILOWATTS - power_channel = EQUIP - connect_types = CONNECT_TYPE_REGULAR - - uncreated_component_parts = null - construct_state = /decl/machine_construction/default/panel_closed - required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES - public_variables = list( - /decl/public_access/public_variable/use_power, - /decl/public_access/public_variable/gas, - /decl/public_access/public_variable/pressure, - /decl/public_access/public_variable/temperature, - /decl/public_access/public_variable/reagents, - /decl/public_access/public_variable/reagents/volumes, - /decl/public_access/public_variable/reagents/free_space, - /decl/public_access/public_variable/reagents/total_volume, - /decl/public_access/public_variable/reagents/maximum_volume, - /decl/public_access/public_variable/material_extractor/has_bucket, - ) - public_methods = list( - /decl/public_access/public_method/toggle_power, - /decl/public_access/public_method/material_extractor/flush_gas, - /decl/public_access/public_method/material_extractor/flush_reagents, - ) - var/obj/item/chems/glass/output_container //#TODO: change this when plumbing is a thing - var/obj/input_holder/input_buffer //Since reagent_holder needs a parent object to exist on creation we gotta do this horrible hack - -/obj/machinery/atmospherics/unary/material/extractor/proc/get_output_loc() - return get_step(loc, get_output_dir()) -/obj/machinery/atmospherics/unary/material/extractor/proc/get_output_dir() - return turn(dir, 90) -/obj/machinery/atmospherics/unary/material/extractor/proc/get_input_dir() - return turn(dir, -90) - -/obj/machinery/atmospherics/unary/material/extractor/Initialize(mapload, d = 0, populate_parts = TRUE) + use_ui_template = "material_processing_extractor.tmpl" + atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_NO_REACT | ATOM_FLAG_NO_DISSOLVE + + var/static/list/eating_whitelist = list(/obj/item/stack/material) + + var/datum/gas_mixture/gas_contents + + var/obj/item/chems/glass/output_container + var/dispense_amount = 50 + + // Since reactions and heating products may overfill the reagent tank, the reagent tank has 1.25x this volume. + var/static/max_liquid = 3000 + +/obj/machinery/material_processing/extractor/Initialize() . = ..() - if(populate_parts) - output_container = new/obj/item/chems/glass/bucket(src) - air_contents.volume = GAS_EXTRACTOR_GAS_TANK - if(!reagents) - create_reagents(GAS_EXTRACTOR_REAGENTS_TANK) - if(!input_buffer) - input_buffer = new(src) - input_buffer.create_reagents(GAS_EXTRACTOR_REAGENTS_INPUT_TANK) //Did this here because reimplementing that in the new() proc failed a test for some reasons + if(!gas_contents) + gas_contents = new(800) + set_extension(src, /datum/extension/atmospherics_connection, FALSE, gas_contents) + + create_reagents(round(1.25*max_liquid)) queue_temperature_atoms(src) -/obj/machinery/atmospherics/unary/material/extractor/Destroy() - output_container = null - QDEL_NULL(input_buffer) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/material_processing/extractor/Destroy() + QDEL_NULL(output_container) . = ..() -/obj/machinery/atmospherics/unary/material/extractor/Bumped(var/obj/O) - if(QDELETED(O)) //Because we qdel object at the input if we can process them. And its possible this might happen - return - //We only override for entities touching the machine from the input's direction only - if(get_dir(loc, O.loc) != get_input_dir() || inoperable() || !O.checkpass(PASS_FLAG_TABLE) || O.anchored) - return ..() - - //2 possible cases here. One we got something that we can turn into liquids or gas (with or without accompanying solid reagent at STP) - // OR we get something that only contains matter that's solid at STP, which we should just pass along so whatever else is in the - // conveyor line can process it. - if(can_process_object(O)) - if(calc_resulting_reagents_total_vol(O) > input_tank_free_volume()) - return //If we can process it, but there's no room currently in the input, just don't interact with it for now! - process_ore(O) - else - O.dropInto(get_output_loc()) +/obj/machinery/material_processing/extractor/physically_destroyed(skip_qdel) + var/obj/container = remove_container() + if(container) + container.dropInto(get_turf(src)) + . = ..() -/obj/machinery/atmospherics/unary/material/extractor/ProcessAtomTemperature() - if(operable() && use_power) - //We process temp for the input reagent_holder too - input_buffer.temperature = GAS_EXTRACTOR_OPERATING_TEMP - temperature = GAS_EXTRACTOR_OPERATING_TEMP - return TRUE - return ..() +/obj/machinery/material_processing/extractor/dismantle() + var/obj/container = remove_container() + if(container) + container.dropInto(get_turf(src)) + . = ..() -/obj/machinery/atmospherics/unary/material/extractor/examine(var/mob/user) +/obj/machinery/material_processing/extractor/LateInitialize() . = ..() - //Only display info if the screen is there - if(get_component_of_type(/obj/item/stock_parts/console_screen)) - to_chat(user, SPAN_NOTICE("The processing tank gauge reads [round(input_buffer.reagents.total_volume)]/[input_buffer.reagents.maximum_volume] units of liquid.")) - to_chat(user, SPAN_NOTICE("The internal storage tank gauge reads [round(reagents.total_volume)]/[reagents.maximum_volume] units of liquid.")) - to_chat(user, SPAN_NOTICE("The internal gas tank pressure gauge reads [air_contents.return_pressure()] kPa.")) - - if(is_output_container_full() || is_internal_tank_full()) - to_chat(user, SPAN_WARNING("It is currently idling because one or more of its liquid tanks are full.")) - else - to_chat(user, SPAN_NOTICE("Everything is working correctly.")) - if(output_container) - var/output_desc = SPAN_NOTICE("It has \a [output_container.name] in place to receive reagents.") - if(is_output_container_full()) - output_desc = "[output_desc] [SPAN_WARNING("It's full!")]" - to_chat(user, output_desc) + var/obj/machinery/atmospherics/portables_connector/port = locate() in loc + if(port) + var/datum/extension/atmospherics_connection/connection = get_extension(src, /datum/extension/atmospherics_connection) + if(connection) + connection.connect(port) + + +/obj/machinery/material_processing/extractor/examine(mob/user) + . = ..() + + var/datum/extension/atmospherics_connection/connection = get_extension(src, /datum/extension/atmospherics_connection) + if(connection.connected_port) + to_chat(user, SPAN_NOTICE("It is connected to \the [connection.connected_port].")) else - to_chat(user, SPAN_NOTICE("It has nothing to pour reagents into.")) + to_chat(user, SPAN_NOTICE("It may be connected to an atmospherics connector port with a wrench.")) + + if(output_container) + to_chat(user, SPAN_NOTICE("It has \a [output_container] inserted.")) + +/obj/machinery/material_processing/extractor/Process() + if(!use_power || (stat & (BROKEN|NOPOWER))) + return + + if(reagents?.total_volume >= max_liquid) + return + + if(input_turf) + var/eaten = 0 + for(var/obj/item/eating in input_turf) + if(!eating.simulated || eating.anchored) + continue + if(!can_eat(eating)) + if(output_turf) + eating.dropInto(output_turf) + continue + eaten++ + if(eating.reagents?.total_volume) + eating.reagents.trans_to_obj(src, eating.reagents.total_volume) + for(var/mtype in eating.matter) + reagents.add_reagent(mtype, FLOOR(eating.matter[mtype] * REAGENT_UNITS_PER_MATERIAL_UNIT)) + qdel(eating) + if(eaten >= MAX_INTAKE_ORE_PER_TICK) + break + +/obj/machinery/material_processing/extractor/on_reagent_change() + ..() + + if(!reagents) + return + + var/adjusted_reagents = FALSE + for(var/mtype in reagents.reagent_volumes) + adjusted_reagents = max(adjusted_reagents, process_non_liquid(mtype)) + + if(adjusted_reagents) + if(gas_contents) + gas_contents.update_values() + reagents.update_total() + +/obj/machinery/material_processing/extractor/proc/process_non_liquid(var/mtype) + var/adjusted_reagents = FALSE + var/flashed_warning = FALSE + var/decl/material/mat = GET_DECL(mtype) + // TODO: Change this to ambient/tank pressure when phase changes are properly implemented. + switch(mat.phase_at_temperature(temperature, ONE_ATMOSPHERE)) + if(MAT_PHASE_GAS) + if(gas_contents) + adjusted_reagents = TRUE + var/reagent_vol = REAGENT_VOLUME(reagents, mtype) + var/mols = mat.get_mols_from_units(reagent_vol, MAT_PHASE_LIQUID) + + // Because this generates heated gas, we draw some additional power for heating it + // from the ice temperature, ignoring latent heats. + var/power_draw_per_mol = (temperature - T0C)*mat.gas_specific_heat + + var/avail_power = power_draw_per_mol*mols - max(can_use_power_oneoff(power_draw_per_mol*mols), 0) + var/processed_mols = avail_power/power_draw_per_mol + + if(processed_mols) + // The ratio processed_moles/moles gives us the ratio of the reagent volume to what should be removed + // since the mole to unit conversion is linear. + reagents.remove_reagent(mtype, reagent_vol*(processed_mols/mols), defer_update = TRUE) + + use_power_oneoff(power_draw_per_mol*mols) + // Still somewhat arbitary + gas_contents.adjust_gas_temp(mtype, mols, temperature, FALSE) + + // Some feedback for the user + if(!flashed_warning && processed_mols < mols) + visible_message(SPAN_WARNING("\The [src] flashes an 'Insufficient Power' error!"), range = 2) + flashed_warning = TRUE + // Unlike the smelter or compressor, we don't hold on to solids indefinitely. Spit them out, losing any remainders. + if(MAT_PHASE_SOLID) + if(!can_process_material_name(mtype)) + var/removing = REAGENT_VOLUME(reagents, mtype) || 0 + var/sheets = FLOOR((removing / REAGENT_UNITS_PER_MATERIAL_UNIT) / SHEET_MATERIAL_AMOUNT) + if(sheets > 0) // If we can't process any sheets at all, leave it for manual processing. + adjusted_reagents = TRUE + SSmaterials.create_object(mtype, output_turf, sheets) + reagents.remove_reagent(mtype, removing) + + return adjusted_reagents + +/obj/machinery/material_processing/extractor/attackby(obj/item/I, mob/user) + if(IS_WRENCH(I) && !panel_open) + var/datum/extension/atmospherics_connection/connection = get_extension(src, /datum/extension/atmospherics_connection) + if(connection.disconnect()) + to_chat(user, SPAN_NOTICE("You disconnect \the [src] from the port.")) + return + else + var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector) in loc + if(possible_port) + if(connection.connect(possible_port)) + to_chat(user, SPAN_NOTICE("You connect \the [src] to the port.")) + return + else + to_chat(user, SPAN_WARNING("\The [src] failed to connect to the port.")) + return -/obj/machinery/atmospherics/unary/material/extractor/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/chems/glass)) - add_fingerprint(user) - if(!output_container) + if(isnull(output_container)) if(!user.try_unequip(I, src)) return output_container = I + events_repository.register(/decl/observ/destroyed, output_container, src, TYPE_PROC_REF(/obj/machinery/material_processing/extractor, remove_container)) user.visible_message(SPAN_NOTICE("\The [user] places \a [I] in \the [src]."), SPAN_NOTICE("You place \a [I] in \the [src].")) - update_icon() - return TRUE - return ..() + return -/obj/machinery/atmospherics/unary/material/extractor/physical_attack_hand(var/mob/user) - if(output_container) - user.put_in_hands(output_container) - output_container.update_icon() - output_container = null - update_icon() - return TRUE - return ..() + to_chat(user, SPAN_WARNING("\The [src] already has an output container!")) + return + . = ..() + +/obj/machinery/material_processing/extractor/proc/remove_container() + if(!output_container) + return + . = output_container + events_repository.unregister(/decl/observ/destroyed, output_container, src, TYPE_PROC_REF(/obj/machinery/material_processing/extractor, remove_container)) + output_container = null -/obj/machinery/atmospherics/unary/material/extractor/power_change() +/obj/machinery/material_processing/extractor/OnTopic(var/mob/user, var/list/href_list) . = ..() - if(.) - queue_temperature_atoms(src) -/obj/machinery/atmospherics/unary/material/extractor/on_update_icon() - cut_overlays() + if(href_list["change_amount"]) + var/amount = input(user, "Enter the amount of units to transfer to the container (max 120):", "Units transfer", dispense_amount) as num - var/initial_state = initial(icon_state) - if(!use_power || inoperable()) - icon_state = "[initial_state]-off" - else - icon_state = initial_state + if(!CanInteract(user, global.default_topic_state)) + return TOPIC_HANDLED + + dispense_amount = clamp(amount, 0, 120) + return TOPIC_REFRESH + + if(href_list["dispense"]) + var/reagent_index = text2num(href_list["dispense"]) + if(!reagent_index || length(reagents.reagent_volumes) < reagent_index) + return TOPIC_HANDLED + + var/mtype = reagents.reagent_volumes[reagent_index] + + // Only liquids are allowed to dispense. Otherwise, try to process the reagent. + if(process_non_liquid(mtype)) + if(gas_contents) + gas_contents.update_values() + reagents.update_total() + return TOPIC_REFRESH + + if(!output_container || !output_container.reagents) + return TOPIC_HANDLED + + reagents.trans_type_to(output_container, mtype, dispense_amount) + return TOPIC_REFRESH - if(panel_open) - add_overlay("[initial_state]-open") + if(href_list["eject"]) + var/obj/container = remove_container() + if(!container) + return TOPIC_HANDLED + if(CanPhysicallyInteract(user)) + user.put_in_hands(container) + else + container.dropInto(get_turf(src)) + return TOPIC_REFRESH + +/obj/machinery/material_processing/extractor/get_ui_data(mob/user) + var/list/data = ..() + + data["dispense_amount"] = dispense_amount if(output_container) - add_overlay("[initial_state]-bucket") + var/curr_volume = output_container.reagents?.total_volume || 0 + var/max_volume = output_container.reagents?.maximum_volume || 0 -/obj/machinery/atmospherics/unary/material/extractor/Process() - ..() - if(!is_input_tank_empty()) - update_use_power(POWER_USE_ACTIVE) + data["container"] = "[output_container.name] ([curr_volume] / [max_volume] U)" - //Its crucial that all reactions happen ONLY in the input tank - if(!force_react_input()) - process_input_tank() - input_clear_remainder() //Keep the input tank tidy by removing very small amounts of reagents - else - update_use_power(POWER_USE_IDLE) + data["reagents"] = list() + var/index = 0 + for(var/mtype in reagents.reagent_volumes) + index += 1 + var/decl/material/mat = GET_DECL(mtype) + var/is_liquid = mat.phase_at_temperature(temperature, ONE_ATMOSPHERE) == MAT_PHASE_LIQUID - //Make the internal liquid tank transfer liquids into the output - move_liquids_to_output() + data["reagents"] += list(list("label" = "[mat.liquid_name] ([reagents.reagent_volumes[mtype]] U)", "index" = index, "liquid" = is_liquid)) -//For some reasons that's not in the unary base class... -/obj/machinery/atmospherics/unary/material/extractor/return_air() - return air_contents + data["full"] = reagents.total_volume >= max_liquid + data["gas_pressure"] = gas_contents?.return_pressure() + return data -//Remove trace amounts of reagents from the input tank, to prevent that from causing problems -/obj/machinery/atmospherics/unary/material/extractor/proc/input_clear_remainder() - if(input_buffer.reagents.total_volume >= GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - return - input_buffer.reagents.clear_reagents() - -//Calculate the amount of reagents we can get from this. Returns a list with each materials and the amount of expected reagents -/obj/machinery/atmospherics/unary/material/extractor/proc/gather_resulting_reagents_vol(var/obj/O) - var/list/processable - if(length(O.matter) > 0) - processable = list() - for(var/k in O.matter) - if(can_process_material_name(k)) - processable[k] = MATERIAL_UNITS_TO_REAGENTS_UNITS(O.matter[k]) - O.matter -= k - return processable - -/obj/machinery/atmospherics/unary/material/extractor/proc/calc_resulting_reagents_total_vol(var/obj/O) - var/total = 0 - for(var/k in O.matter) - if(can_process_material_name(k)) - total += MATERIAL_UNITS_TO_REAGENTS_UNITS(O.matter[k]) - return total - -/obj/machinery/atmospherics/unary/material/extractor/proc/input_tank_free_volume() - return round(max(REAGENTS_FREE_SPACE(input_buffer.reagents),0), GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - -/obj/machinery/atmospherics/unary/material/extractor/proc/output_container_free_volume() - return output_container? round(max(REAGENTS_FREE_SPACE(output_container.reagents), 0), GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) : 0 - -/obj/machinery/atmospherics/unary/material/extractor/proc/internal_tank_free_volume() - return round(max(REAGENTS_FREE_SPACE(reagents), 0), GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - -/obj/machinery/atmospherics/unary/material/extractor/proc/is_output_container_full() - return output_container_free_volume() <= 0 - -/obj/machinery/atmospherics/unary/material/extractor/proc/is_input_tank_empty() - return round(input_buffer.reagents.total_volume, GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) == 0 - -/obj/machinery/atmospherics/unary/material/extractor/proc/is_internal_tank_full() - return internal_tank_free_volume() <= 0 - -/obj/machinery/atmospherics/unary/material/extractor/proc/can_process_object(var/obj/O) - if(istype(O) && length(O.matter) && is_type_in_list(O, global.material_extractor_items_whitelist)) - for(var/k in O.matter) - if(can_process_material_name(k)) +/obj/machinery/material_processing/extractor/return_air() + return gas_contents + +/obj/machinery/material_processing/extractor/proc/can_eat(obj/eating) + if(istype(eating) && length(eating.matter) && is_type_in_list(eating, eating_whitelist)) + for(var/mtype in eating.matter) + if(can_process_material_name(mtype)) return TRUE return FALSE -/obj/machinery/atmospherics/unary/material/extractor/proc/can_process_material_name(var/name) - var/decl/material/M = GET_DECL(name) - ASSERT(istype(M)) - return (is_material_extractable(M) || has_extractable_heating_products(M)) +/obj/machinery/material_processing/extractor/proc/can_process_material_name(mtype) + var/decl/material/mat = GET_DECL(mtype) + ASSERT(istype(mat)) + return (is_material_extractable(mat) || has_extractable_heating_products(mat)) -/obj/machinery/atmospherics/unary/material/extractor/proc/has_extractable_heating_products(var/decl/material/M) - for(var/k in M.heating_products) - var/decl/material/P = GET_DECL(k) - ASSERT(istype(P)) - if(is_material_extractable(P)) +/obj/machinery/material_processing/extractor/proc/has_extractable_heating_products(decl/material/M) + for(var/mtype in M.heating_products) + var/decl/material/mat = GET_DECL(mtype) + ASSERT(istype(mat)) + if(is_material_extractable(mat)) return TRUE return FALSE -/obj/machinery/atmospherics/unary/material/extractor/proc/is_material_extractable(var/decl/material/M) +/obj/machinery/material_processing/extractor/proc/is_material_extractable(decl/material/M) //If is gas or liquid at operating temp we can process var/phase = M.phase_at_temperature(temperature) return phase == MAT_PHASE_LIQUID || phase == MAT_PHASE_GAS -//Add ore to contents for processing -/obj/machinery/atmospherics/unary/material/extractor/proc/process_ore(var/obj/O) - var/list/extracted = gather_resulting_reagents_vol(O) +/obj/machinery/material_processing/extractor/ProcessAtomTemperature() + if(use_power && operable()) + temperature = GAS_EXTRACTOR_OPERATING_TEMP + return TRUE + . = ..() - for(var/k in extracted) - input_buffer.reagents.add_reagent(k, extracted[k]) //Put everything we can in the input for further processing +/obj/machinery/material_processing/extractor/power_change() + . = ..() + if(.) + queue_temperature_atoms(src) - //Spit out the stripped ore with whatever we can't process, or otherwise just delete it - if(length(O.matter)) - O.dropInto(get_output_loc()) - else - qdel(O) - -//Force the content of the input reagents_holder to react in one tick, so we can have some control on when the reaction happens -/obj/machinery/atmospherics/unary/material/extractor/proc/force_react_input() - input_buffer.atom_flags &= ~(ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT) - . = input_buffer.reagents.process_reactions() - input_buffer.atom_flags |= ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT - -//Filters all the reagents in the input tank, and send them to the proper output -/obj/machinery/atmospherics/unary/material/extractor/proc/process_input_tank() - for(var/mat in input_buffer.reagents?.reagent_volumes) - var/decl/material/M = GET_DECL(mat) - var/available_volume = round(REAGENT_VOLUME(input_buffer.reagents, M.type), GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - - //Don't bother if we got a really small quatity, and just get rid of it - if(available_volume < GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - input_buffer.reagents.clear_reagent(M.type) - continue - - switch(M.phase_at_temperature(temperature)) - if(MAT_PHASE_SOLID) - dump_solid(M, available_volume) //If for silly reasons anything turns solid while reacting in the input, dump that here - if(MAT_PHASE_LIQUID) - dump_liquid(M, available_volume) - if(MAT_PHASE_GAS) - dump_gas(M, available_volume) - if(MAT_PHASE_PLASMA) - dump_gas(M, available_volume) - -//Called each ticks, tries to fill the output with the content of the liquid tank -/obj/machinery/atmospherics/unary/material/extractor/proc/move_liquids_to_output() - if(!output_container) - return - var/transferred = max(min(output_container_free_volume(), reagents.total_volume), 0) - if(transferred > 0) - reagents.trans_to(output_container, transferred) - -//Used in case some reaction happens in the tank and result in a solid, so it doesn't clog it up -/obj/machinery/atmospherics/unary/material/extractor/proc/dump_solid(var/decl/material/M, var/available_volume) - //Check if we got enough to dump out a single sheet at least - if(available_volume < REAGENT_UNITS_PER_MATERIAL_SHEET) - return - var/expected_sheets = round(available_volume / REAGENT_UNITS_PER_MATERIAL_SHEET) - var/removed_volume = round(expected_sheets * REAGENT_UNITS_PER_MATERIAL_SHEET, GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - M.create_object(get_output_loc(), expected_sheets) - input_buffer.reagents.remove_reagent(M.type, removed_volume) - -/obj/machinery/atmospherics/unary/material/extractor/proc/dump_liquid(var/decl/material/M, var/available_volume) - var/internal_free_vol = internal_tank_free_volume() - var/external_free_vol = output_container_free_volume() - - //Might as well dump directly into the output if there's one, it'll save some extra unneeded processing - if(external_free_vol > 0) - var/transferred = max(min(available_volume, external_free_vol), 0) - if(transferred > 0) - input_buffer.reagents.trans_to(output_container, transferred, GAS_EXTRACTOR_LIQUID_EFFICIENCY) - //log_debug("dump_liquid : dumping [round(transferred * GAS_EXTRACTOR_LIQUID_EFFICIENCY)] units of [M.type] to container with [external_free_vol] units of free space") - else if(internal_free_vol > 0) - var/transferred = max(min(available_volume, internal_free_vol), 0) - if(transferred > 0) - input_buffer.reagents.trans_to_holder(reagents, transferred, GAS_EXTRACTOR_LIQUID_EFFICIENCY) - //log_debug("dump_liquid : dumping [round(transferred * GAS_EXTRACTOR_LIQUID_EFFICIENCY)] units of [M.type] to internal tank with [internal_free_vol] units of free space") - - -//We want to convert a liquid to its gaseous state -//So we want to convert liquid units to moles. -// We need: -// the volume of liquid -// the density of the liquid -// the molar mass of the liquid -//Since we have none of those currently in the material datums, just assume everything is water -// Density: 997.07 g/L -// Molar Mass: 18.02 g/mol -//We'll assume a unit of reagent is 1 mL, so we'll divide the density by 1,000. We get 0.99707 -// 0.99707 / 18.02 => 0.553 mol/ml -#define MOLES_PER_MILILITER_FACTOR 0.553 //placeholder until we can do this properly via phase transitions -/obj/machinery/atmospherics/unary/material/extractor/proc/dump_gas(var/decl/material/M, var/available_volume) - var/datum/gas_mixture/produced = new - var/moles = round(available_volume * MOLES_PER_MILILITER_FACTOR, GAS_EXTRACTOR_MIN_REAGENT_AMOUNT) - input_buffer.reagents.remove_reagent(M.type, available_volume) - produced.adjust_gas(M.type, moles) - air_contents.merge(produced) -#undef MOLES_PER_MILILITER_FACTOR - - -//////////////////////////////////////////////////// -// Verbs -//////////////////////////////////////////////////// -/obj/machinery/atmospherics/unary/material/extractor/verb/FlushReagents() - set name = "Flush Reagents Tank" - set desc = "Empty the content of the internal reagent tank of the machine on the floor." - set category = "Object" - set src in oview(1) - usr.visible_message(SPAN_NOTICE("[usr] empties the liquid tank of \the [src] onto \the [src.loc]!"), SPAN_NOTICE("You empty the liquid tank of the [src] onto \the [src.loc]!")) - src.reagents.trans_to(src.loc, reagents.total_volume) - -/obj/machinery/atmospherics/unary/material/extractor/verb/FlushGas() - set name = "Flush Gas Tank" - set desc = "Empty the content of the internal gas tank of the machine into the air." - set category = "Object" - set src in oview(1) - usr.visible_message(SPAN_NOTICE("[usr] empties the gas tank of \the [src] into the air!"), SPAN_NOTICE("You empty the gas tank of the [src] into the air!")) - var/datum/gas_mixture/environment = src.loc.return_air() - environment.merge(src.air_contents) - //Reset air content - src.air_contents = new/datum/gas_mixture(GAS_EXTRACTOR_GAS_TANK, temperature) - -//////////////////////////////////////////////////// -// Public Vars -//////////////////////////////////////////////////// -/decl/public_access/public_variable/material_extractor/has_bucket - expected_type = /obj/machinery/atmospherics/unary/material - name = "has bucket" - desc = "Whether or not the extractor has a bucket collecting reagents." - can_write = FALSE - has_updates = FALSE - var_type = IC_FORMAT_BOOLEAN - -/decl/public_access/public_variable/material_extractor/has_bucket/access_var(obj/machinery/atmospherics/unary/material/extractor/M) - return M.output_container != null - -//////////////////////////////////////////////////// -// Public Methods -//////////////////////////////////////////////////// -/decl/public_access/public_method/material_extractor/flush_gas - name = "flush gas" - desc = "Empty the internal gas tank into the atmosphere." - call_proc = /obj/machinery/atmospherics/unary/material/extractor/verb/FlushGas - -/decl/public_access/public_method/material_extractor/flush_reagents - name = "flush reagents" - desc = "Empty the internal reagents tank on the floor." - call_proc = /obj/machinery/atmospherics/unary/material/extractor/verb/FlushReagents - -#undef GAS_EXTRACTOR_GAS_TANK -#undef GAS_EXTRACTOR_REAGENTS_TANK -#undef GAS_EXTRACTOR_REAGENTS_INPUT_TANK +#undef MAX_INTAKE_ORE_PER_TICK #undef GAS_EXTRACTOR_OPERATING_TEMP -#undef GAS_EXTRACTOR_LIQUID_EFFICIENCY -#undef GAS_EXTRACTOR_MIN_REAGENT_AMOUNT diff --git a/code/modules/mining/machinery/material_smelter.dm b/code/modules/mining/machinery/material_smelter.dm index 4ea97b3085a..a696a6a28cc 100644 --- a/code/modules/mining/machinery/material_smelter.dm +++ b/code/modules/mining/machinery/material_smelter.dm @@ -26,7 +26,7 @@ // Outgas anything that is in gas form. Check what you put into the smeltery, nerds. /obj/machinery/material_processing/smeltery/on_reagent_change() - . = ..() + ..() if(!reagents) return @@ -115,7 +115,7 @@ if(samt > 0) SSmaterials.create_object(mtype, output_turf, samt) reagents.remove_reagent(mtype, ramt) - + /obj/machinery/material_processing/smeltery/Topic(var/user, var/list/href_list) . = ..() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 219a8e1908e..cc48152e7c8 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -36,7 +36,7 @@ throwforce = 4 w_class = ITEM_SIZE_HUGE material = /decl/material/solid/metal/steel - origin_tech = "{'materials':1,'engineering':1}" + origin_tech = @'{"materials":1,"engineering":1}' attack_verb = list("hit", "pierced", "sliced", "attacked") sharp = 0 @@ -55,7 +55,16 @@ I.appearance_flags |= RESET_COLOR add_overlay(I) -/obj/item/pickaxe/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/pickaxe/Initialize() + var/list/tool_qualities = get_initial_tool_qualities() + if(length(tool_qualities)) + set_extension(src, /datum/extension/tool, tool_qualities) + . = ..() + +/obj/item/pickaxe/proc/get_initial_tool_qualities() + return list(TOOL_SHOVEL = TOOL_QUALITY_MEDIOCRE) + +/obj/item/pickaxe/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && build_from_parts && check_state_in_icon("[overlay.icon_state]-handle", overlay.icon)) var/image/handle = image(overlay.icon, "[overlay.icon_state]-handle") handle.appearance_flags |= RESET_COLOR @@ -71,29 +80,36 @@ name = "advanced mining drill" // Can dig sand as well! icon = 'icons/obj/items/tool/drills/drill_hand.dmi' digspeed = 30 - origin_tech = "{'materials':2,'powerstorage':3,'engineering':2}" + origin_tech = @'{"materials":2,"powerstorage":3,"engineering":2}' desc = "Yours is the drill that will pierce through the rock walls." drill_verb = "drilling" material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) -/obj/item/pickaxe/drill/Initialize(ml, material_key) - . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_DRILL = TOOL_QUALITY_MEDIOCRE)) +/obj/item/pickaxe/drill/get_initial_tool_qualities() + return list( + TOOL_SURGICAL_DRILL = TOOL_QUALITY_MEDIOCRE, + TOOL_SHOVEL = TOOL_QUALITY_DEFAULT + ) /obj/item/pickaxe/jackhammer name = "sonic jackhammer" icon = 'icons/obj/items/tool/drills/jackhammer.dmi' digspeed = 20 //faster than drill, but cannot dig - origin_tech = "{'materials':3,'powerstorage':2,'engineering':2}" + origin_tech = @'{"materials":3,"powerstorage":2,"engineering":2}' desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards." drill_verb = "hammering" +/obj/item/pickaxe/jackhammer/get_initial_tool_qualities() + return list( + TOOL_SURGICAL_DRILL = TOOL_QUALITY_MEDIOCRE, + TOOL_SHOVEL = TOOL_QUALITY_DECENT + ) /obj/item/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME! name = "diamond mining drill" icon = 'icons/obj/items/tool/drills/drill_diamond.dmi' digspeed = 5 //Digs through walls, girders, and can dig up sand - origin_tech = "{'materials':6,'powerstorage':4,'engineering':5}" + origin_tech = @'{"materials":6,"powerstorage":4,"engineering":5}' desc = "Yours is the drill that will pierce the heavens!" drill_verb = "drilling" material = /decl/material/solid/metal/steel @@ -102,6 +118,12 @@ /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) +/obj/item/pickaxe/diamonddrill/get_initial_tool_qualities() + return list( + TOOL_SURGICAL_DRILL = TOOL_QUALITY_MEDIOCRE, + TOOL_SHOVEL = TOOL_QUALITY_GOOD + ) + /obj/item/pickaxe/borgdrill name = "cyborg mining drill" icon = 'icons/obj/items/tool/drills/drill_diamond.dmi' @@ -109,6 +131,12 @@ desc = "" drill_verb = "drilling" +/obj/item/pickaxe/borgdrill/get_initial_tool_qualities() + return list( + TOOL_SURGICAL_DRILL = TOOL_QUALITY_MEDIOCRE, + TOOL_SHOVEL = TOOL_QUALITY_GOOD + ) + //****************************actual pickaxes*********************** /obj/item/pickaxe/silver name = "silver pickaxe" @@ -116,37 +144,46 @@ icon_state = "preview" icon = 'icons/obj/items/tool/drills/pickaxe.dmi' digspeed = 30 - origin_tech = "{'materials':3}" + origin_tech = @'{"materials":3}' drill_verb = "picking" sharp = 1 build_from_parts = TRUE hardware_color = COLOR_SILVER +/obj/item/pickaxe/silver/get_initial_tool_qualities() + return list(TOOL_SHOVEL = TOOL_QUALITY_DEFAULT) + /obj/item/pickaxe/gold name = "golden pickaxe" desc = "This makes no metallurgic sense." icon_state = "preview" icon = 'icons/obj/items/tool/drills/pickaxe.dmi' digspeed = 20 - origin_tech = "{'materials':4}" + origin_tech = @'{"materials":4}' drill_verb = "picking" sharp = 1 build_from_parts = TRUE hardware_color = COLOR_GOLD +/obj/item/pickaxe/gold/get_initial_tool_qualities() + return list(TOOL_SHOVEL = TOOL_QUALITY_DECENT) + /obj/item/pickaxe/diamond name = "diamond pickaxe" desc = "A pickaxe with a diamond pick head." icon_state = "preview" icon = 'icons/obj/items/tool/drills/pickaxe.dmi' digspeed = 10 - origin_tech = "{'materials':6,'engineering':4}" + origin_tech = @'{"materials":6,"engineering":4}' drill_verb = "picking" sharp = 1 build_from_parts = TRUE hardware_color = COLOR_DIAMOND material = /decl/material/solid/gemstone/diamond +/obj/item/pickaxe/diamond/get_initial_tool_qualities() + return list(TOOL_SHOVEL = TOOL_QUALITY_GOOD) + /*****************************Shovel********************************/ /obj/item/shovel @@ -158,7 +195,7 @@ force = 8.0 throwforce = 4 w_class = ITEM_SIZE_HUGE - origin_tech = "{'materials':1,'engineering':1}" + origin_tech = @'{"materials":1,"engineering":1}' material = /decl/material/solid/metal/steel attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") edge = 1 @@ -225,7 +262,7 @@ /obj/item/stack/flag/attack_self(var/mob/user) var/turf/T = get_turf(src) - if(!istype(T) || !T.is_open()) + if(!istype(T) || T.is_open()) to_chat(user, "There's no solid surface to plant \the [singular_name] on.") return diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 2459a3f49f3..672a492c738 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -41,51 +41,22 @@ LAZYREMOVE(level.mining_turfs, src) return ..() -/turf/simulated/floor/asteroid/explosion_act(severity) - SHOULD_CALL_PARENT(FALSE) - if(severity == 1 || (severity == 2 && prob(70))) - gets_dug() +/turf/simulated/floor/asteroid/can_be_dug() + return !density /turf/simulated/floor/asteroid/is_plating() return !density +/turf/simulated/floor/asteroid/on_update_icon() + ..() + if(dug) + icon_state = "asteroid_dug" + //#TODO: This should probably be generalised? /turf/simulated/floor/asteroid/attackby(obj/item/W, mob/user) if(!W || !user) - return 0 - - var/list/usable_tools = list( - /obj/item/shovel, - /obj/item/pickaxe/diamonddrill, - /obj/item/pickaxe/drill, - /obj/item/pickaxe/borgdrill - ) - - var/valid_tool - for(var/valid_type in usable_tools) - if(istype(W,valid_type)) - valid_tool = 1 - break - - if(valid_tool) - if (dug) - to_chat(user, "This area has already been dug") - return TRUE - - var/turf/T = user.loc - if (!(istype(T))) - return - - to_chat(user, "You start digging.") - playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1) - . = TRUE - - if(!do_after(user,40, src)) return - - to_chat(user, "You dug a hole.") - gets_dug() - - else if(istype(W,/obj/item/storage/ore)) //#FIXME: Its kinda silly to put this in a specific turf's subtype's attackby. + return FALSE + if(istype(W,/obj/item/storage/ore)) //#FIXME: Its kinda silly to put this in a specific turf's subtype's attackby. var/obj/item/storage/ore/S = W if(S.collection_mode) for(var/obj/item/stack/material/ore/O in contents) @@ -95,17 +66,14 @@ if(S.collection_mode) for(var/obj/item/fossil/F in contents) return F.attackby(W,user) + return ..(W,user) - else - return ..(W,user) - -//#TODO: This should probably be generalised? -/turf/simulated/floor/asteroid/proc/gets_dug() - if(dug) - return - LAZYADD(., new /obj/item/stack/material/ore/glass(src, (rand(3) + 2))) +/turf/simulated/floor/asteroid/clear_diggable_resources() dug = TRUE - icon_state = "asteroid_dug" + ..() + +/turf/simulated/floor/asteroid/get_diggable_resources() + return dug ? null : list(/obj/item/stack/material/ore/sand = list(3, 2)) //#TODO: This should probably be generalised? /turf/simulated/floor/asteroid/proc/updateMineralOverlays(var/update_neighbors) diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index 38b8b75ab3d..7bb8b5da341 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/mining.dmi' icon_state = "orebox0" density = TRUE - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood atom_flags = ATOM_FLAG_CLIMBABLE tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) ///Maximum amount of ores of all types that can be stored in the box. diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index 179cc5d85e2..9a17fd29c3e 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -106,7 +106,7 @@ for(var/client/C in viewing) C.images += I - addtimer(CALLBACK(src, .proc/clear_shown_overlays, viewing, I), 5) + addtimer(CALLBACK(src, PROC_REF(clear_shown_overlays), viewing, I), 5) // Scale the icon. I.transform *= 0.75 @@ -159,3 +159,25 @@ return playsound(T, "sparks", 50, 1) anim(src,'icons/mob/mob.dmi',,"phaseout",,dir) + +// Similar to attack animations, but in reverse and is longer to act as a telegraph. +/atom/movable/proc/do_windup_animation(atom/A, windup_time, no_reset) + + var/pixel_x_diff = 0 + var/pixel_y_diff = 0 + + var/direction = get_dir(src, A) + if(direction & NORTH) + pixel_y_diff = -8 + else if(direction & SOUTH) + pixel_y_diff = 8 + if(direction & EAST) + pixel_x_diff = -8 + else if(direction & WEST) + pixel_x_diff = 8 + + if(no_reset) + animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = windup_time) + else + animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = windup_time-2) + animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2) diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index b8b8b22e07b..a8945326700 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -1,11 +1,13 @@ //This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N /mob/proc/gib(anim="gibbed-m",do_gibs) + set waitfor = FALSE + death(1) ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) UpdateLyingBuckledAndVerbStatus() remove_from_dead_mob_list() dump_contents() @@ -24,13 +26,13 @@ //This is the proc for turning a mob into ash. Mostly a copy of gib code (above). //Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. -//Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N +//Dusting robots does not eject the brain, so it's a bit more powerful than gib() /N /mob/proc/dust(anim="dust-m",remains=/obj/effect/decal/cleanable/ash) death(1) var/atom/movable/overlay/animation = null ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) animation = new(loc) animation.icon_state = "blank" @@ -70,11 +72,6 @@ drop_held_items() - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable?.hat) - hattable.hat.dropInto(get_turf(src)) - hattable.hat = null - SSstatistics.report_death(src) //TODO: Change death state to health_dead for all these icon files. This is a stop gap. diff --git a/code/modules/mob/examine.dm b/code/modules/mob/examine.dm index 2e87af745fb..1026da99b4d 100644 --- a/code/modules/mob/examine.dm +++ b/code/modules/mob/examine.dm @@ -59,10 +59,11 @@ show_other_examine_strings(user, distance, infix, suffix, hideflags, pronouns) to_chat(user, "") +/mob/living/examine(mob/user, distance, infix, suffix) + . = ..() // Update our target dolly. if(user.zone_sel) - var/decl/bodytype/target_bodytype = get_bodytype() - if(target_bodytype && (BP_TAIL in target_bodytype.has_limbs)) + if(should_have_limb(BP_TAIL)) user.zone_sel.icon_state = "zone_sel_tail" else user.zone_sel.icon_state = "zone_sel" diff --git a/code/modules/mob/floating_message.dm b/code/modules/mob/floating_message.dm index 08b66bd25c6..a6cc4a3bb3f 100644 --- a/code/modules/mob/floating_message.dm +++ b/code/modules/mob/floating_message.dm @@ -64,7 +64,8 @@ var/global/list/floating_chat_colors = list() I.maptext_width = CHAT_MESSAGE_WIDTH I.maptext_height = CHAT_MESSAGE_HEIGHT I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART - I.pixel_w = -round(I.maptext_width/2) + 16 + I.pixel_w = -round(I.maptext_width/2) + 16 + holder.get_overhead_text_x_offset() + I.pixel_z = holder.get_overhead_text_y_offset() style = "font-family: 'Small Fonts'; -dm-text-outline: 1px black; font-size: [size]px; line-height: 1.1; [style]" I.maptext = "
    [message]
    " @@ -77,8 +78,8 @@ var/global/list/floating_chat_colors = list() LAZYADD(holder.stored_chat_text, I) - addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_floating_text, holder, I), duration) - addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_images_from_clients, I, show_to), duration + CHAT_MESSAGE_EOL_FADE) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(remove_floating_text), holder, I), duration) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(remove_images_from_clients), I, show_to), duration + CHAT_MESSAGE_EOL_FADE) return I diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 4f8977cca2b..db84ea2d0e0 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -49,19 +49,19 @@ LAZYADD(affecting.grabbed_by, src) // This is how we handle affecting being deleted. adjust_position() action_used() - INVOKE_ASYNC(assailant, /atom/movable/proc/do_attack_animation, affecting) + INVOKE_ASYNC(assailant, TYPE_PROC_REF(/atom/movable, do_attack_animation), affecting) playsound(affecting.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) update_icon() - events_repository.register(/decl/observ/moved, affecting, src, .proc/on_affecting_move) + events_repository.register(/decl/observ/moved, affecting, src, PROC_REF(on_affecting_move)) if(assailant.zone_sel) - events_repository.register(/decl/observ/zone_selected, assailant.zone_sel, src, .proc/on_target_change) + events_repository.register(/decl/observ/zone_selected, assailant.zone_sel, src, PROC_REF(on_target_change)) var/obj/item/organ/O = get_targeted_organ() var/decl/pronouns/G = assailant.get_pronouns() if(affecting_mob && O) // may have grabbed a buckled mob, so may be grabbing their holder SetName("[name] (\the [affecting_mob]'s [O.name])") - events_repository.register(/decl/observ/dismembered, affecting_mob, src, .proc/on_organ_loss) + events_repository.register(/decl/observ/dismembered, affecting_mob, src, PROC_REF(on_organ_loss)) if(affecting_mob != assailant) visible_message(SPAN_DANGER("\The [assailant] has grabbed [affecting_mob]'s [O.name]!")) else diff --git a/code/modules/mob/grab/normal/norm_struggle.dm b/code/modules/mob/grab/normal/norm_struggle.dm index 557e09de7b5..4c83b6c2cba 100644 --- a/code/modules/mob/grab/normal/norm_struggle.dm +++ b/code/modules/mob/grab/normal/norm_struggle.dm @@ -43,7 +43,7 @@ else affecting.visible_message("[affecting] struggles against [assailant]!") G.done_struggle = FALSE - addtimer(CALLBACK(G, .proc/handle_resist), 1 SECOND) + addtimer(CALLBACK(G, PROC_REF(handle_resist)), 1 SECOND) resolve_struggle(G) /decl/grab/normal/struggle/proc/resolve_struggle(var/obj/item/grab/G) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index ee6d5d29c8a..5cd9975038d 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -27,7 +27,7 @@ to_chat(src, SPAN_WARNING("You are unable to equip that.")) /mob/proc/can_equip_anything_to_slot(var/slot) - return (slot in get_all_valid_equipment_slots()) + return (slot in get_all_available_equipment_slots()) //This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task. //In most cases you will want to use equip_to_slot_if_possible() @@ -78,7 +78,7 @@ /mob/proc/equip_to_appropriate_slot(obj/item/W, var/skip_store = 0) if(!istype(W)) return FALSE - for(var/slot in global.slot_equipment_priority) + for(var/slot in get_inventory_slot_priorities()) if(skip_store) if(slot == slot_s_store_str || slot == slot_l_store_str || slot == slot_r_store_str) continue @@ -193,9 +193,6 @@ qdel(grab) . = TRUE return - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable?.drop_hat(src)) - return TRUE . = drop_from_inventory(get_active_hand(), Target) /* @@ -289,12 +286,12 @@ /mob/proc/get_equipped_items(var/include_carried = 0) SHOULD_CALL_PARENT(TRUE) - for(var/slot in list(slot_back_str, slot_wear_mask_str)) + var/held_item_slots = get_held_item_slots() + for(var/slot in get_inventory_slots()) var/obj/item/thing = get_equipped_item(slot) if(istype(thing)) - LAZYADD(., thing) - if(include_carried) - for(var/obj/item/thing in get_held_items()) + if(!include_carried && (slot in held_item_slots)) + continue LAZYADD(., thing) /mob/proc/delete_inventory(var/include_carried = FALSE) @@ -308,49 +305,7 @@ var/datum/inventory_slot/inv_slot = get_inventory_slot_datum(slot) if(inv_slot) return !!inv_slot.check_has_required_organ(src) - -// Legacy code after this point. - switch(slot) - if(slot_back_str) - return has_organ(BP_CHEST) - if(slot_wear_mask_str) - return has_organ(BP_HEAD) - if(slot_handcuffed_str) - return has_organ(BP_L_HAND) && has_organ(BP_R_HAND) - if(slot_belt_str) - return has_organ(BP_CHEST) - if(slot_wear_id_str) - // the only relevant check for this is the uniform check - return TRUE - if(slot_l_ear_str) - return has_organ(BP_HEAD) - if(slot_r_ear_str) - return has_organ(BP_HEAD) - if(slot_glasses_str) - return has_organ(BP_HEAD) - if(slot_gloves_str) - return has_organ(BP_L_HAND) || has_organ(BP_R_HAND) - if(slot_head_str) - return has_organ(BP_HEAD) - if(slot_shoes_str) - return has_organ(BP_L_FOOT) || has_organ(BP_R_FOOT) - if(slot_wear_suit_str) - return has_organ(BP_CHEST) - if(slot_w_uniform_str) - return has_organ(BP_CHEST) - if(slot_l_store_str) - return has_organ(BP_CHEST) - if(slot_r_store_str) - return has_organ(BP_CHEST) - if(slot_s_store_str) - return has_organ(BP_CHEST) - if(slot_in_backpack_str) - return TRUE - if(slot_tie_str) - return TRUE - else - return has_organ(slot) -// End legacy code. + return has_organ(slot) // Returns all currently covered body parts /mob/proc/get_covered_body_parts() @@ -370,8 +325,7 @@ // Returns all items which covers any given body part /mob/proc/get_covering_equipped_items(var/body_parts) . = list() - for(var/entry in get_equipped_items()) - var/obj/item/I = entry + for(var/obj/item/I as anything in get_equipped_items()) if(I.body_parts_covered & body_parts) . += I @@ -386,7 +340,12 @@ /// If this proc returns false, reconsider_client_screen_presence will set the item's screen_loc to null. /mob/proc/item_should_have_screen_presence(obj/item/item, slot) - return hud_used && slot && (hud_used.inventory_shown || !(slot in global.hidden_inventory_slots)) + if(!slot || !hud_used) + return FALSE + if(hud_used.inventory_shown) + return TRUE + var/datum/inventory_slot/inv_slot = get_inventory_slot_datum(slot) + return !(inv_slot?.can_be_hidden) /mob/proc/get_held_item_slots() return @@ -403,6 +362,9 @@ /mob/proc/get_inventory_slots() return +/mob/proc/get_inventory_slot_priorities() + return + /mob/proc/set_inventory_slots(var/list/new_slots) return @@ -412,7 +374,7 @@ /mob/proc/remove_inventory_slot(var/slot) return -/mob/proc/get_all_valid_equipment_slots() +/mob/proc/get_all_available_equipment_slots() for(var/slot in get_held_item_slots()) LAZYDISTINCTADD(., slot) for(var/slot in get_inventory_slots()) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 3a8ca588f2f..4f7229bff8e 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -1,7 +1,6 @@ /mob/living/bot name = "Bot" - health = 20 - maxHealth = 20 + mob_default_max_health = 20 icon = 'icons/mob/bot/placeholder.dmi' universal_speak = TRUE density = FALSE @@ -55,33 +54,25 @@ access_scanner = new /obj(src) access_scanner.req_access = req_access?.Copy() -/mob/living/bot/Initialize() - . = ..() if(on) turn_on() // Update lights and other stuff else turn_off() -/mob/living/bot/Life() - ..() - if(health <= 0) - death() - return - set_status(STAT_WEAK, 0) - set_status(STAT_STUN, 0) - set_status(STAT_PARA, 0) +/mob/living/bot/handle_regular_status_updates() + . = ..() + if(.) + set_status(STAT_WEAK, 0) + set_status(STAT_STUN, 0) + set_status(STAT_PARA, 0) - if(on && !client && !busy) - handleAI() - -/mob/living/bot/updatehealth() - if(status_flags & GODMODE) - health = maxHealth - set_stat(CONSCIOUS) - else - health = maxHealth - getFireLoss() - getBruteLoss() +/mob/living/bot/get_total_life_damage() + return getFireLoss() + getBruteLoss() /mob/living/bot/death() + if(stat == DEAD) + return + set_stat(DEAD) explode() /mob/living/bot/attackby(var/obj/item/O, var/mob/user) @@ -104,9 +95,9 @@ to_chat(user, "You need to unlock the controls first.") return else if(IS_WELDER(O)) - if(health < maxHealth) + if(current_health < get_max_health()) if(open) - health = min(maxHealth, health + 10) + heal_overall_damage(10) user.visible_message("\The [user] repairs \the [src].","You repair \the [src].") else to_chat(user, "Unable to repair with the maintenance panel closed.") @@ -209,7 +200,12 @@ /mob/living/bot/emag_act(var/remaining_charges, var/mob/user) return 0 -/mob/living/bot/proc/handleAI() +/mob/living/bot/handle_legacy_ai() + . = ..() + if(on && !busy) + handle_async_ai() + +/mob/living/bot/proc/handle_async_ai() set waitfor = FALSE if(ignore_list.len) for(var/atom/A in ignore_list) @@ -288,7 +284,7 @@ /mob/living/bot/proc/startPatrol() var/turf/T = getPatrolTurf() if(T) - patrol_path = AStar(get_turf(loc), T, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, max_patrol_dist, id = botcard, exclude = obstacle) + patrol_path = AStar(get_turf(loc), T, TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_patrol_dist, id = botcard, exclude = obstacle) if(!patrol_path) patrol_path = list() obstacle = null @@ -320,7 +316,7 @@ return /mob/living/bot/proc/calcTargetPath() - target_path = AStar(get_turf(loc), get_turf(target), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, max_target_dist, id = botcard, exclude = obstacle) + target_path = AStar(get_turf(loc), get_turf(target), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard, exclude = obstacle) if(!target_path) if(target && target.loc) ignore_list |= target @@ -430,7 +426,7 @@ else return !D.check_access(ID) // it's a real, air blocking door return 0 -/mob/living/bot/GetIdCards() +/mob/living/bot/GetIdCards(list/exceptions) . = ..() - if(istype(botcard)) + if(istype(botcard) && !is_type_in_list(botcard, exceptions)) LAZYDISTINCTADD(., botcard) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 75c8b970996..475ec4566fb 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -55,14 +55,16 @@ UnarmedAttack(target) /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) - if(!..()) + + . = ..() + if(.) return if(!istype(D)) - return + return TRUE if(D.loc != loc) - return + return FALSE busy = 1 visible_message("\The [src] begins to clean up \the [D].") @@ -80,6 +82,7 @@ playsound(src, 'sound/machines/boop2.ogg', 30) busy = 0 update_icon() + return TRUE /mob/living/bot/cleanbot/explode() on = 0 diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 178b5cd51ac..2069e6a546a 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -6,8 +6,7 @@ attack_state = "ed209-c" layer = MOB_LAYER density = TRUE - health = 100 - maxHealth = 100 + mob_default_max_health = 100 preparing_arrest_sounds = new() @@ -28,7 +27,8 @@ var/turf/Tsec = get_turf(src) var/obj/item/gun/energy/taser/G = new /obj/item/gun/energy/taser(Tsec) - G.power_supply.charge = 0 + var/obj/item/cell/power_supply = G.get_cell() + power_supply?.charge = 0 if(prob(50)) new /obj/item/robot_parts/l_leg(Tsec) if(prob(50)) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 6dea16be17b..4f4052a3394 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -8,8 +8,7 @@ desc = "The botanist's best friend." icon = 'icons/mob/bot/farmbot.dmi' icon_state = "farmbot0" - health = 50 - maxHealth = 50 + mob_default_max_health = 50 req_access = list(list(access_hydroponics, access_robotics)) var/action = "" // Used to update icon @@ -126,7 +125,7 @@ /mob/living/bot/farmbot/calcTargetPath() // We need to land NEXT to the tray, because the tray itself is impassable for(var/trayDir in list(NORTH, SOUTH, EAST, WEST)) - target_path = AStar(get_turf(loc), get_step(get_turf(target), trayDir), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, max_target_dist, id = botcard) + target_path = AStar(get_turf(loc), get_step(get_turf(target), trayDir), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard) if(target_path) break if(!target_path) @@ -143,17 +142,19 @@ return /mob/living/bot/farmbot/UnarmedAttack(var/atom/A, var/proximity) - if(!..()) + . = ..() + if(.) return + if(busy) - return + return TRUE if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/T = A var/t = confirmTarget(T) switch(t) if(0) - return + return TRUE if(FARMBOT_COLLECT) action = "water" // Needs a better one update_icon() @@ -193,7 +194,7 @@ T.update_icon() else if(istype(A, /obj/structure/hygiene/sink)) if(!tank || tank.reagents.total_volume >= tank.reagents.maximum_volume) - return + return TRUE action = "water" update_icon() visible_message("[src] starts refilling its tank from \the [A].") @@ -217,13 +218,14 @@ do_attack_animation(A) if(prob(50)) visible_message("[src] swings wildly at [A] with a minihoe, missing completely!") - return + return TRUE var/t = pick("slashed", "sliced", "cut", "clawed") A.attack_generic(src, 5, t) if("water") flick("farmbot_water", src) visible_message("[src] splashes [A] with water!") tank.reagents.splash(A, 100) + return TRUE /mob/living/bot/farmbot/explode() visible_message("[src] blows apart!") diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index bd018937452..713d80e1592 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -133,14 +133,16 @@ return (amount && (T.broken || T.burnt || (improvefloors && !T.flooring))) /mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity) - if(!..()) + + . = ..() + if(.) return if(busy) - return + return TRUE if(get_turf(A) != loc) - return + return FALSE if(emagged && istype(A, /turf/simulated/floor)) var/turf/simulated/floor/F = A @@ -210,6 +212,7 @@ M.use(1) addTiles(4) anchored = FALSE + return TRUE /mob/living/bot/floorbot/explode() turn_off() diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 9807ec8e483..41e96d88d81 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -96,17 +96,15 @@ break /mob/living/bot/medbot/UnarmedAttack(var/mob/living/carbon/human/H, var/proximity) - if(!..()) + . = ..() + if(.) return - if(!on) - return - - if(!istype(H)) - return + if(!on || !istype(H)) + return FALSE if(busy) - return + return TRUE if(H.stat == DEAD) if(vocal) @@ -146,6 +144,7 @@ visible_message("[src] injects [H] with the syringe!") busy = 0 update_icon() + return TRUE /mob/living/bot/medbot/on_update_icon() ..() diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 4a82dc53d4c..6cbd7c10381 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -15,8 +15,7 @@ layer = MOB_LAYER anchored = TRUE density = TRUE - health = 150 - maxHealth = 150 + mob_default_max_health = 150 mob_bump_flag = HEAVY min_target_dist = 0 @@ -52,7 +51,7 @@ suffix = num2text(++amount) name = "Mulebot #[suffix]" -/mob/living/bot/mulebot/receive_mouse_drop(var/atom/dropping, var/mob/user) +/mob/living/bot/mulebot/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!.) load(dropping) @@ -205,20 +204,18 @@ SET_STATUS_MAX(M, STAT_WEAK, 5) ..() -/mob/living/bot/mulebot/proc/runOver(var/mob/living/carbon/human/H) - if(istype(H)) // No safety checks - WILL run over lying humans. Stop ERPing in the maint! - visible_message("[src] drives over [H]!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - - var/damage = rand(5, 7) - H.apply_damage(2 * damage, BRUTE, BP_HEAD) - H.apply_damage(2 * damage, BRUTE, BP_CHEST) - H.apply_damage(0.5 * damage, BRUTE, BP_L_LEG) - H.apply_damage(0.5 * damage, BRUTE, BP_R_LEG) - H.apply_damage(0.5 * damage, BRUTE, BP_L_ARM) - H.apply_damage(0.5 * damage, BRUTE, BP_R_ARM) - - blood_splatter(src, H, 1) +/mob/living/bot/mulebot/crossed_mob(var/mob/living/victim) + // No safety checks - WILL run over lying humans. Stop ERPing in the maint! + visible_message(SPAN_WARNING("\The [src] drives over \the [victim]!")) + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + var/damage = rand(5, 7) + victim.apply_damage(2 * damage, BRUTE, BP_HEAD) + victim.apply_damage(2 * damage, BRUTE, BP_CHEST) + victim.apply_damage(0.5 * damage, BRUTE, BP_L_LEG) + victim.apply_damage(0.5 * damage, BRUTE, BP_R_LEG) + victim.apply_damage(0.5 * damage, BRUTE, BP_L_ARM) + victim.apply_damage(0.5 * damage, BRUTE, BP_R_ARM) + blood_splatter(src, victim, 1) /mob/living/bot/mulebot/relaymove(var/mob/user, var/direction) if(load == user) diff --git a/code/modules/mob/living/bot/remotebot.dm b/code/modules/mob/living/bot/remotebot.dm index 609b3bbf65c..2b7d9019360 100644 --- a/code/modules/mob/living/bot/remotebot.dm +++ b/code/modules/mob/living/bot/remotebot.dm @@ -3,8 +3,7 @@ desc = "A remote controlled robot used by lazy people to switch channels and get pizza." icon = 'icons/mob/bot/fetchbot.dmi' icon_state = "fetchbot1" - health = 15 - maxHealth = 15 + mob_default_max_health = 15 var/working = 0 var/speed = 10 //lower = better @@ -98,7 +97,7 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, @@ -166,7 +165,7 @@ icon = 'icons/obj/items/bot_kit.dmi' icon_state = "remotebot" obj_flags = OBJ_FLAG_HOLLOW - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard /obj/item/bot_kit/attack_self(var/mob/user) to_chat(user, "You quickly dismantle the box and retrieve the controller and the remote bot itself.") diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index b33a7665cc9..2a17f24eede 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -7,10 +7,8 @@ desc = "A little security robot. He looks less than thrilled." icon = 'icons/mob/bot/secbot.dmi' icon_state = "secbot0" - var/attack_state = "secbot-c" layer = MOB_LAYER - maxHealth = 50 - health = 50 + mob_default_max_health = 50 req_access = list(list(access_security, access_forensics_lockers)) botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) @@ -20,6 +18,7 @@ RequiresAccessToToggle = 1 // Haha no + var/attack_state = "secbot-c" var/idcheck = 0 // If true, arrests for having weapons without authorization. var/check_records = 0 // If true, arrests people without a record. var/check_arrest = 1 // If true, arrests people who are set to arrest. @@ -39,12 +38,9 @@ will_patrol = 1 /mob/living/bot/secbot/Initialize() - stun_baton = new(src) - stun_baton.bcell = new /obj/item/cell/infinite(stun_baton) - stun_baton.set_status(1, null) - . = ..() - + stun_baton = new /obj/item/baton/infinite(src) handcuffs = new(src) + . = ..() /mob/living/bot/secbot/Destroy() qdel(stun_baton) @@ -108,9 +104,9 @@ emagged = !emagged /mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user) - var/curhealth = health + var/curhealth = current_health . = ..() - if(health < curhealth) + if(current_health < curhealth) react_to_attack(user) /mob/living/bot/secbot/emag_act(var/remaining_charges, var/mob/user) @@ -123,11 +119,11 @@ return 1 /mob/living/bot/secbot/bullet_act(var/obj/item/projectile/P) - var/curhealth = health + var/curhealth = current_health var/mob/shooter = P.firer . = ..() //if we already have a target just ignore to avoid lots of checking - if(!target && health < curhealth && istype(shooter) && (shooter in view(world.view, src))) + if(!target && current_health < curhealth && istype(shooter) && (shooter in view(world.view, src))) react_to_attack(shooter) /mob/living/bot/secbot/proc/begin_arrest(mob/target, var/threat) @@ -136,7 +132,7 @@ broadcast_security_hud_message("[src] is arresting a level [threat] suspect [suspect_name] in [get_area_name(src)].", src) say("Down on the floor, [suspect_name]! You have [SECBOT_WAIT_TIME] seconds to comply.") playsound(src.loc, pick(preparing_arrest_sounds), 50) - events_repository.register(/decl/observ/moved, target, src, /mob/living/bot/secbot/proc/target_moved) + events_repository.register(/decl/observ/moved, target, src, TYPE_PROC_REF(/mob/living/bot/secbot, target_moved)) /mob/living/bot/secbot/proc/target_moved(atom/movable/moving_instance, atom/old_loc, atom/new_loc) if(get_dist(get_turf(src), get_turf(target)) >= 1) @@ -194,16 +190,18 @@ resetTarget() //we're done, failed or not. Don't want to get stuck if C is not /mob/living/bot/secbot/UnarmedAttack(var/mob/M, var/proximity) - if(!..()) + + . = ..() + if(.) return if(!istype(M)) - return + return FALSE var/mob/living/carbon/human/H = M if(istype(H) && H.lying) cuff_target(H) - return + return TRUE if(isanimal(M)) a_intent = I_HURT @@ -212,6 +210,7 @@ stun_baton.attack(M, src, BP_CHEST) //robots and turrets aim for center of mass flick(attack_state, src) + return TRUE /mob/living/bot/secbot/explode() visible_message("[src] blows apart!") diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm new file mode 100644 index 00000000000..faa6edb9b7f --- /dev/null +++ b/code/modules/mob/living/brain/brain.dm @@ -0,0 +1,117 @@ +/mob/living/brain + name = "brain" + icon = 'icons/obj/surgery.dmi' + icon_state = "brain1" + default_emotes = list( + /decl/emote/audible/alarm, + /decl/emote/audible/alert, + /decl/emote/audible/notice, + /decl/emote/audible/whistle, + /decl/emote/audible/synth, + /decl/emote/audible/boop, + /decl/emote/visible/blink, + /decl/emote/visible/flash + ) + + // Used for EMP damage when inside an interface or robobrain. + var/emp_damage = 0 + var/last_emp_message = 0 + var/static/max_emp_damage = 30 + var/static/list/emp_reboot_strings = list( + SPAN_NOTICE("System reboot nearly complete."), + SPAN_NOTICE("Primary systems are now online."), + SPAN_DANGER("Major electrical distruption detected: System rebooting.") + ) + +/mob/living/brain/handle_regular_status_updates() + . = ..() + if(emp_damage || stat == DEAD || !is_in_interface()) + SET_STATUS_MAX(src, STAT_SILENCE, 2) + +/mob/living/brain/death() + var/obj/item/organ/holder = loc + . = ..() + if(stat == DEAD && istype(holder)) + holder.die() + +/mob/living/brain/is_deaf() + return emp_damage || stat == DEAD || !is_in_interface() + +/mob/living/brain/is_blind() + return emp_damage || stat == DEAD || !is_in_interface() + +/mob/living/brain/Logout() + . = ..() + var/obj/item/organ/internal/container = get_container() + if(istype(container)) + container.queue_icon_update() + +/mob/living/brain/proc/get_container() + . = loc?.loc + +/mob/living/brain/Login() + . = ..() + var/obj/item/organ/internal/container = get_container() + if(istype(container)) + var/obj/item/organ/internal/brain_interface/interface = container + if(istype(interface)) + interface.locked = TRUE + container.update_icon() + +/mob/living/brain/proc/is_in_interface() + var/container = get_container() + return istype(container, /obj/item/organ/internal/brain_interface) || istype(container, /obj/item/organ/internal/brain/robotic) + +/mob/living/brain/can_emote() + return is_in_interface() && ..() + +/mob/living/brain/can_use_rig() + return is_in_interface() + +/mob/living/brain/Destroy() + ghostize() + . = ..() + +/mob/living/brain/say_understands(var/other) + . = ishuman(other) || (is_in_interface() && issilicon(other)) || ..() + +/mob/living/brain/UpdateLyingBuckledAndVerbStatus() + return + +/mob/living/brain/isSynthetic() + return istype(get_container(), /obj/item/organ/internal/brain/robotic) + +/mob/living/brain/binarycheck() + return isSynthetic() + +/mob/living/brain/check_has_mouth() + return FALSE + +/mob/living/brain/emp_act(severity) + if(!isSynthetic()) + return + switch(severity) + if(1) + emp_damage += rand(20,30) + if(2) + emp_damage += rand(10,20) + if(3) + emp_damage += rand(0,10) + emp_damage = clamp(emp_damage, 0, max_emp_damage) + +/mob/living/brain/handle_regular_status_updates() // Status & health update, are we dead or alive etc. + . = ..() + if(stat == DEAD || !isSynthetic()) + emp_damage = 0 + return + if(emp_damage <= 0) + return + emp_damage -= 1 + var/msg_threshold = clamp(CEILING(emp_damage / (max_emp_damage / length(emp_reboot_strings))), 1, length(emp_reboot_strings)) + if(last_emp_message != msg_threshold) + last_emp_message = msg_threshold + to_chat(src, emp_reboot_strings[msg_threshold]) + if(emp_damage <= 0) + last_emp_message = 0 + emp_damage = 0 + to_chat(src, SPAN_NOTICE("All systems restored.")) diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm new file mode 100644 index 00000000000..0a70b0d7683 --- /dev/null +++ b/code/modules/mob/living/brain/death.dm @@ -0,0 +1,17 @@ +/mob/living/brain/death(gibbed) + var/death_message = "no message" + var/obj/item/organ/internal/brain_interface/container = get_container() + if(!gibbed && istype(container)) + death_message = "beeps shrilly as \the [container] flatlines!" + . = ..(gibbed, death_message) + if(istype(container)) + container.update_icon() + +/mob/living/brain/gib() + var/obj/item/organ/internal/brain_interface/container = get_container() + var/obj/item/organ/internal/brain/sponge = loc + . = ..(null, 1) + if(container && !QDELETED(container)) + qdel(container) + if(istype(sponge) && !QDELETED(sponge)) + qdel(sponge) diff --git a/code/modules/mob/living/brain/say.dm b/code/modules/mob/living/brain/say.dm new file mode 100644 index 00000000000..4a59e86f064 --- /dev/null +++ b/code/modules/mob/living/brain/say.dm @@ -0,0 +1,16 @@ +/mob/living/brain/say(var/message, var/decl/language/speaking, var/verb = "says", var/alt_name = "", whispering) + if(GET_STATUS(src, STAT_SILENCE) || !is_in_interface()) + return + if(prob(emp_damage*4)) + if(prob(10)) + return + message = Gibberish(message, (emp_damage*6)) + . = ..(message, speaking, verb, alt_name, whispering) + var/obj/item/radio/radio = get_radio() + if(radio) + radio.hear_talk(src, sanitize(message), verb, speaking) + +/mob/living/brain/get_radio() + var/obj/item/organ/internal/brain_interface/container = get_container() + if(istype(container)) + return container.get_radio() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 2ef856b10ea..9a959c07e7b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -2,8 +2,7 @@ name = "alien" desc = "What IS that?" pass_flags = PASS_FLAG_TABLE - health = 100 - maxHealth = 100 + mob_default_max_health = 100 mob_size = MOB_SIZE_TINY mob_sort_value = 8 var/dead_icon diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index dd556813f6e..a9589f5725e 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -20,7 +20,6 @@ SET_STATUS_MAX(src, STAT_WEAK, rand(10,15)) user.visible_message(SPAN_DANGER("\The [user] has weakened \the [src]!"), 1, SPAN_WARNING("You hear someone fall."), 2) adjustBruteLoss(damage) - updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message(SPAN_DANGER("\The [user] has attempted to punch \the [src]!"), 1) diff --git a/code/modules/mob/living/carbon/alien/alien_damage.dm b/code/modules/mob/living/carbon/alien/alien_damage.dm index e75135ae6a6..1a1d4e2ef77 100644 --- a/code/modules/mob/living/carbon/alien/alien_damage.dm +++ b/code/modules/mob/living/carbon/alien/alien_damage.dm @@ -17,6 +17,5 @@ SET_STATUS_MAX(src, STAT_PARA, 1) SET_STATUS_MAX(src, STAT_TINNITUS, 15) SET_STATUS_MAX(src, STAT_DEAF, 60) - adjustBruteLoss(b_loss) + adjustBruteLoss(b_loss, do_update_health = FALSE) adjustFireLoss(f_loss) - updatehealth() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 43ebca74462..58fff70c26a 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -1,13 +1,3 @@ -// Alien larva are quite simple. -/mob/living/carbon/alien/Life() - set invisibility = 0 - set background = 1 - if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) return - if(!loc) return - ..() - //Status updates, death etc. - update_icon() - /mob/living/carbon/alien/handle_mutations_and_radiation() ..() if(radiation) @@ -15,57 +5,55 @@ radiation -= rads adjust_nutrition(rads) heal_overall_damage(rads,rads) - adjustOxyLoss(-(rads)) + adjustOxyLoss(-(rads), do_update_health = FALSE) adjustToxLoss(-(rads)) /mob/living/carbon/alien/handle_regular_status_updates() - if(status_flags & GODMODE) return 0 + . = ..() if(stat == DEAD) SET_STATUS_MAX(src, STAT_BLIND, 2) set_status(STAT_SILENCE, 0) - else - updatehealth() - if(health <= 0) - death() - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - return 1 - - if(HAS_STATUS(src, STAT_PARA)) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_stat(UNCONSCIOUS) - if(getHalLoss() > 0) - adjustHalLoss(-3) - - if(HAS_STATUS(src, STAT_ASLEEP)) + else if(HAS_STATUS(src, STAT_PARA)) + SET_STATUS_MAX(src, STAT_BLIND, 2) + set_stat(UNCONSCIOUS) + if(getHalLoss() > 0) adjustHalLoss(-3) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_stat(UNCONSCIOUS) - else if(resting) - if(getHalLoss() > 0) - adjustHalLoss(-3) - - else - set_stat(CONSCIOUS) - if(getHalLoss() > 0) - adjustHalLoss(-1) - - // Eyes and blindness. - if(!check_has_eyes()) - SET_STATUS_MAX(src, STAT_BLIND, 2) - SET_STATUS_MAX(src, STAT_BLURRY, 1) - - update_icon() + if(HAS_STATUS(src, STAT_ASLEEP)) + adjustHalLoss(-3) + if (mind) + if(mind.active && client != null) + ADJ_STATUS(src, STAT_ASLEEP, -1) + SET_STATUS_MAX(src, STAT_BLIND, 2) + set_stat(UNCONSCIOUS) + else if(resting) + if(getHalLoss() > 0) + adjustHalLoss(-3) + else + set_stat(CONSCIOUS) + if(getHalLoss() > 0) + adjustHalLoss(-1) - return 1 + // Eyes and blindness. + if(!check_has_eyes()) + set_status(STAT_BLIND, 1) + SET_STATUS_MAX(src, STAT_BLIND, 2) + set_status(STAT_BLURRY, 1) + else if(GET_STATUS(src, STAT_BLIND)) + ADJ_STATUS(src, STAT_BLIND, -1) + SET_STATUS_MAX(src, STAT_BLIND, 2) + update_icon() + return TRUE /mob/living/carbon/alien/handle_regular_hud_updates() + . = ..() + if(!.) + return update_sight() if (healths) if(stat != DEAD) - switch(health) + switch(current_health) if(100 to INFINITY) healths.icon_state = "health0" if(80 to 100) @@ -94,7 +82,6 @@ if(machine) if(machine.check_eye(src) < 0) reset_view(null) - return 1 /mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment) ..() diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm deleted file mode 100644 index 745a08ca834..00000000000 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ /dev/null @@ -1,189 +0,0 @@ -/obj/item/mmi/digital/Initialize() - brainmob = new(src) - brainmob.set_stat(CONSCIOUS) - brainmob.add_language(/decl/language/binary) - brainmob.add_language(/decl/language/machine) - brainmob.container = src - brainmob.set_status(STAT_SILENCE, 0) - PickName() - . = ..() - -/obj/item/mmi/digital/proc/PickName() - return - -/obj/item/mmi/digital/attackby() - return - -/obj/item/mmi/digital/attack_self() - return - -/obj/item/mmi - name = "\improper Man-Machine Interface" - desc = "A complex life support shell that interfaces between a brain and electronic devices." - icon = 'icons/obj/assemblies.dmi' - icon_state = "mmi_empty" - w_class = ITEM_SIZE_NORMAL - origin_tech = "{'biotech':3}" - material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - req_access = list(access_robotics) - - //Revised. Brainmob is now contained directly within object of transfer. MMI in this case. - - var/locked = 0 - var/mob/living/carbon/brain/brainmob = null//The current occupant. - var/obj/item/organ/internal/brain/brainobj = null //The current brain organ. - -/obj/item/mmi/attackby(var/obj/item/O, var/mob/user) - if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO - - var/obj/item/organ/internal/brain/B = O - if(B.damage >= B.max_damage) - to_chat(user, "That brain is well and truly dead.") - return - else if(!B.brainmob || !B.can_use_mmi) - to_chat(user, "This brain is completely useless to you.") - return - if(!user.try_unequip(O, src)) - return - user.visible_message("\The [user] sticks \a [O] into \the [src].") - - brainmob = B.brainmob - B.brainmob = null - brainmob.forceMove(src) - brainmob.container = src - brainmob.set_stat(CONSCIOUS) - brainmob.switch_from_dead_to_living_mob_list() //Update dem lists - - brainobj = O - - SetName("[initial(name)]: ([brainmob.real_name])") - update_icon() - - locked = 1 - - SSstatistics.add_field("cyborg_mmis_filled",1) - - return - - if((istype(O,/obj/item/card/id)||istype(O,/obj/item/modular_computer)) && brainmob) - if(allowed(user)) - locked = !locked - to_chat(user, "You [locked ? "lock" : "unlock"] the brain holder.") - else - to_chat(user, "Access denied.") - return - if(brainmob) - O.attack(brainmob, user)//Oh noooeeeee - return - ..() - - //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data. -/obj/item/mmi/attack_self(mob/user) - if(!brainmob) - to_chat(user, "You upend the MMI, but there's nothing in it.") - else if(locked) - to_chat(user, "You upend the MMI, but the brain is clamped into place.") - else - to_chat(user, "You upend the MMI, spilling the brain onto the floor.") - var/obj/item/organ/internal/brain/brain - if (brainobj) //Pull brain organ out of MMI. - brainobj.forceMove(user.loc) - brain = brainobj - brainobj = null - else //Or make a new one if empty. - brain = new(user.loc) - brainmob.container = null//Reset brainmob mmi var. - brainmob.forceMove(brain)//Throw mob into brain. - brainmob.remove_from_living_mob_list() //Get outta here - brain.brainmob = brainmob//Set the brain to use the brainmob - brainmob = null//Set mmi brainmob var to null - - update_icon() - SetName(initial(name)) - -/obj/item/mmi/proc/transfer_identity(var/mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->robot people. - brainmob = new(src) - brainmob.SetName(H.real_name) - brainmob.real_name = H.real_name - brainmob.dna = H.dna - brainmob.container = src - brainmob.timeofhostdeath = H.timeofdeath - brainmob.set_stat(CONSCIOUS) - - SetName("[initial(name)]: [brainmob.real_name]") - update_icon() - locked = 1 - -/obj/item/mmi/preserve_in_cryopod(obj/machinery/cryopod/pod) - return brainmob && brainmob.client && brainmob.key - -/obj/item/mmi/relaymove(var/mob/user, var/direction) - if(user.incapacitated(INCAPACITATION_KNOCKOUT)) - return - var/obj/item/rig/rig = get_rig() - if(rig) - rig.forced_move(direction, user) - -/obj/item/mmi/Destroy() - if(isrobot(loc)) - var/mob/living/silicon/robot/borg = loc - borg.mmi = null - QDEL_NULL(brainmob) - return ..() - -/obj/item/mmi/radio_enabled - name = "radio-enabled man-machine interface" - desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." - origin_tech = "{'biotech':4}" - material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - var/obj/item/radio/radio = null//Let's give it a radio. - -/obj/item/mmi/radio_enabled/Initialize() - . = ..() - radio = new(src)//Spawns a radio inside the MMI. - radio.broadcasting = 1//So it's broadcasting from the start. - -/obj/item/mmi/radio_enabled/verb/Toggle_Broadcasting() //Allows the brain to toggle the radio functions. - set name = "Toggle Broadcasting" - set desc = "Toggle broadcasting channel on or off." - set category = "MMI" - set src = usr.loc//In user location, or in MMI in this case. - set popup_menu = 0//Will not appear when right clicking. - - if(brainmob.stat)//Only the brainmob will trigger these so no further check is necessary. - to_chat(brainmob, "Can't do that while incapacitated or dead.") - - radio.broadcasting = radio.broadcasting==1 ? 0 : 1 - to_chat(brainmob, "Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting.") - -/obj/item/mmi/radio_enabled/verb/Toggle_Listening() - set name = "Toggle Listening" - set desc = "Toggle listening channel on or off." - set category = "MMI" - set src = usr.loc - set popup_menu = 0 - - if(brainmob.stat) - to_chat(brainmob, "Can't do that while incapacitated or dead.") - - radio.listening = radio.listening==1 ? 0 : 1 - to_chat(brainmob, "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast.") - -/obj/item/mmi/emp_act(severity) - if(!brainmob) - return - else - switch(severity) - if(1) - brainmob.emp_damage += rand(20,30) - if(2) - brainmob.emp_damage += rand(10,20) - if(3) - brainmob.emp_damage += rand(0,10) - ..() - -/obj/item/mmi/on_update_icon() - . = ..() - icon_state = brainmob ? "mmi_full" : "mmi_empty" diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm deleted file mode 100644 index 6c61b5d061a..00000000000 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ /dev/null @@ -1,37 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/mob/living/carbon/brain - var/obj/item/container = null - var/timeofhostdeath = 0 - var/emp_damage = 0//Handles a type of MMI damage - var/alert = null - icon = 'icons/obj/surgery.dmi' - icon_state = "brain1" - mob_sort_value = 7 - -/mob/living/carbon/brain/Initialize() - create_reagents(1000) - . = ..() - -/mob/living/carbon/brain/Destroy() - if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. - if(stat!=DEAD) //If not dead. - death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA - ghostize() //Ghostize checks for key so nothing else is necessary. - . = ..() - -/mob/living/carbon/brain/say_understands(mob/speaker, decl/language/speaking) - return (issilicon(speaker) && (istype(container, /obj/item/mmi) || istype(loc, /obj/item/organ/internal/posibrain))) || ishuman(speaker) || ..() - -/mob/living/carbon/brain/UpdateLyingBuckledAndVerbStatus() - return - -/mob/living/carbon/brain/isSynthetic() - return istype(container, /obj/item/mmi/digital) || istype(loc, /obj/item/organ/internal/posibrain) - -/mob/living/carbon/brain/binarycheck() - return isSynthetic() - -/mob/living/carbon/brain/check_has_mouth() - return 0 - diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm deleted file mode 100644 index 5f728287cec..00000000000 --- a/code/modules/mob/living/carbon/brain/death.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/carbon/brain/death(gibbed) - if(!gibbed && istype(container, /obj/item/mmi)) //If not gibbed but in a container. - container.icon_state = "mmi_dead" - return ..(gibbed,"beeps shrilly as the MMI flatlines!") - else - return ..(gibbed,"no message") - -/mob/living/carbon/brain/gib(anim="gibbed-m",do_gibs) - if(istype(container, /obj/item/mmi)) - qdel(container)//Gets rid of the MMI if there is one - if(loc) - if(istype(loc,/obj/item/organ/internal/brain)) - qdel(loc)//Gets rid of the brain item - ..(null,1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm deleted file mode 100644 index 98fd99f1e2b..00000000000 --- a/code/modules/mob/living/carbon/brain/life.dm +++ /dev/null @@ -1,177 +0,0 @@ -/mob/living/carbon/brain/need_breathe() - return FALSE - -/mob/living/carbon/brain/should_breathe() - return FALSE - -/mob/living/carbon/brain/handle_mutations_and_radiation() - ..() - if (radiation) - if (radiation > 100) - radiation = 100 - if(!container)//If it's not in an MMI - to_chat(src, "You feel weak.") - else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that - to_chat(src, "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.") - switch(radiation) - if(1 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - updatehealth() - - if(50 to 74) - radiation -= 2 - adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - if(!container) - to_chat(src, "You feel weak.") - else - to_chat(src, "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.") - updatehealth() - - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - updatehealth() - - -/mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment) - ..() - if(!environment) - return - var/environment_heat_capacity = environment.heat_capacity() - if(isspaceturf(get_turf(src))) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 - handle_temperature_damage(SLOT_HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) - if(stat == DEAD) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - - -/mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return - - if(exposed_temperature > bodytemperature) - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - //adjustFireLoss(5.0*discomfort) - adjustFireLoss(20.0*discomfort) - - else - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - adjustFireLoss(5.0*discomfort) - -/mob/living/carbon/brain/apply_chemical_effects() - . = ..() - if(resting) - ADJ_STATUS(src, STAT_DIZZY, -4) - return TRUE - -/mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - else //ALIVE. LIGHTS ARE ON - if( !container && (health < config.health_threshold_dead || (config.revival_brain_life >= 0 && (world.time - timeofhostdeath) > config.revival_brain_life)) ) - death() - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - return 1 - - //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere - if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act - if(!(container && istype(container, /obj/item/mmi))) - emp_damage = 0 - else - emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with - switch(emp_damage) - if(31 to INFINITY) - emp_damage = 30//Let's not overdo it - if(21 to 30)//High level of EMP damage, unable to see, hear, or speak - SET_STATUS_MAX(src, STAT_BLIND, 2) - SET_STATUS_MAX(src, STAT_DEAF, 2) - SET_STATUS_MAX(src, STAT_SILENCE, 2) - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - to_chat(src, "Major electrical distruption detected: System rebooting.") - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - set_status(STAT_BLIND, 0) - set_status(STAT_DEAF, 0) - set_status(STAT_SILENCE, 0) - emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - set_status(STAT_BLURRY, 2) - set_status(STAT_TINNITUS, 2) - if(!alert) - emote("alert") - to_chat(src, "Primary systems are now online.") - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - set_status(STAT_BLURRY, 0) - set_status(STAT_TINNITUS, 0) - emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - to_chat(src, "System reboot nearly complete.") - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - to_chat(src, "All systems restored.") - emp_damage -= 1 - - return 1 - -/mob/living/carbon/brain/handle_regular_hud_updates() - update_sight() - if (healths) - if (stat != DEAD) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - if(stat != DEAD) - if(is_blind()) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - else - clear_fullscreen("blind") - set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) - set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) - set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - return 1 - -/mob/living/carbon/brain/can_change_intent() - return TRUE diff --git a/code/modules/mob/living/carbon/brain/login.dm b/code/modules/mob/living/carbon/brain/login.dm deleted file mode 100644 index 4f8a38ca269..00000000000 --- a/code/modules/mob/living/carbon/brain/login.dm +++ /dev/null @@ -1,3 +0,0 @@ -/mob/living/carbon/brain/Login() - ..() - set_status(STAT_ASLEEP, 0) diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm deleted file mode 100644 index 1c4a5490ec4..00000000000 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/mmi/digital/robot - name = "robotic intelligence circuit" - desc = "The pinnacle of artifical intelligence which can be achieved using classical computer science." - icon = 'icons/obj/modules/module_mainboard.dmi' - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_NORMAL - origin_tech = "{'engineering':4,'materials':3,'programming':4}" - -/obj/item/mmi/digital/robot/PickName() - src.brainmob.SetName("[pick(list("ADA","DOS","GNU","MAC","WIN"))]-[random_id(type,1000,9999)]") - src.brainmob.real_name = src.brainmob.name - -/obj/item/mmi/digital/robot/on_update_icon() - . = ..() - icon_state = initial(icon_state) diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm deleted file mode 100644 index 793e0ea9033..00000000000 --- a/code/modules/mob/living/carbon/brain/say.dm +++ /dev/null @@ -1,38 +0,0 @@ -//TODO: Convert this over for languages. -/mob/living/carbon/brain/say(var/message) - if(HAS_STATUS(src, STAT_SILENCE)) - return - - message = sanitize(message) - - if(!(container && istype(container, /obj/item/mmi))) - return //No MMI, can't speak, bucko./N - else - var/decl/language/speaking = parse_language(message) - if(speaking) - message = copytext(message, 2+length(speaking.key)) - var/verb = "says" - var/ending = copytext(message, length(message)) - if (speaking) - verb = speaking.get_spoken_verb(src, ending) - else - if(ending=="!") - verb=pick("exclaims","shouts","yells") - if(ending=="?") - verb="asks" - - if(prob(emp_damage*4)) - if(prob(10))//10% chane to drop the message entirely - return - else - message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher - - if(speaking && speaking.flags & LANG_FLAG_HIVEMIND) - speaking.broadcast(src,trim(message)) - return - - if(istype(container, /obj/item/mmi/radio_enabled)) - var/obj/item/mmi/radio_enabled/R = container - if(R.radio) - spawn(0) R.radio.hear_talk(src, sanitize(message), verb, speaking) - ..(trim(message), speaking, verb) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5116b4d629a..7f88379104b 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -15,7 +15,6 @@ QDEL_NULL(touching) QDEL_NULL(bloodstr) reagents = null //We assume reagents is a reference to bloodstr here - QDEL_NULL_LIST(hallucinations) if(loc) for(var/mob/M in contents) M.dropInto(loc) @@ -61,7 +60,6 @@ var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(src, BP_CHEST) if(istype(organ)) organ.take_external_damage(d, 0) - updatehealth() else take_organ_damage(d) if(prob(getBruteLoss() - 50)) @@ -300,15 +298,8 @@ /mob/living/carbon/proc/can_devour(atom/movable/victim) return FALSE -/mob/living/carbon/check_has_mouth() - // carbon mobs have mouths by default - // behavior of this proc for humans is overridden in human.dm - return 1 - -/mob/living/carbon/proc/check_mouth_coverage() - // carbon mobs do not have blocked mouths by default - // overridden in human_defense.dm - return null +/mob/living/carbon/get_satiated_nutrition() + return 350 /mob/living/carbon/get_max_nutrition() return 400 diff --git a/code/modules/mob/living/carbon/carbon_eating.dm b/code/modules/mob/living/carbon/carbon_eating.dm new file mode 100644 index 00000000000..70db1bae0f3 --- /dev/null +++ b/code/modules/mob/living/carbon/carbon_eating.dm @@ -0,0 +1,9 @@ +/mob/living/carbon/can_eat_food_currently(obj/eating, mob/user) + user = user || src + if(get_food_satiation() < get_max_nutrition()) + return TRUE + if(user == src) + to_chat(user, SPAN_WARNING("You cannot force any more of \the [eating] down your throat.")) + else + to_chat(user, SPAN_WARNING("You cannot force anymore of \the [eating] down \the [src]'s throat.")) + return FALSE diff --git a/code/modules/mob/living/carbon/carbon_organs.dm b/code/modules/mob/living/carbon/carbon_organs.dm index 9e3bcd0efdb..4fd1c5d27c1 100644 --- a/code/modules/mob/living/carbon/carbon_organs.dm +++ b/code/modules/mob/living/carbon/carbon_organs.dm @@ -26,7 +26,7 @@ internal_organs = null external_organs = null -/mob/living/carbon/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached) +/mob/living/carbon/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) var/obj/item/organ/existing = LAZYACCESS(organs_by_tag, O.organ_tag) if(existing && O != existing) CRASH("mob/living/carbon/add_organ(): '[O]' tried to overwrite [src]'s existing organ '[existing]' in slot '[O.organ_tag]'!") @@ -43,7 +43,7 @@ LAZYDISTINCTADD(external_organs, O) . = ..() -/mob/living/carbon/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE) +/mob/living/carbon/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = TRUE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) if(istype(O) && !in_place && O.is_vital_to_owner() && usr) admin_attack_log(usr, src, "Removed a vital organ ([src]).", "Had a vital organ ([src]) removed.", "removed a vital organ ([src]) from") if(!(. = ..())) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 0329801ad70..348e5d0fc2e 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -9,5 +9,4 @@ Specifically made to do radiation burns. if(!isSynthetic() && !ignore_rads) damage = 0.25 * damage * (species ? species.get_radiation_mod(src) : 1) adjustFireLoss(damage) - updatehealth() return TRUE diff --git a/code/modules/mob/living/carbon/hallucinations.dm b/code/modules/mob/living/carbon/hallucinations.dm deleted file mode 100644 index 3ff542395a8..00000000000 --- a/code/modules/mob/living/carbon/hallucinations.dm +++ /dev/null @@ -1,317 +0,0 @@ -/mob/living/carbon/var/hallucination_power = 0 -/mob/living/carbon/var/hallucination_duration = 0 -/mob/living/carbon/var/next_hallucination -/mob/living/carbon/var/list/hallucinations = list() - -/mob/living/proc/adjust_hallucination(duration, power) - return - -/mob/living/proc/set_hallucination(duration, power) - return - -/mob/living/carbon/set_hallucination(duration, power) - hallucination_duration = max(hallucination_duration, duration) - hallucination_power = max(hallucination_power, power) - -/mob/living/carbon/adjust_hallucination(duration, power) - hallucination_duration = max(0, hallucination_duration + duration) - hallucination_power = max(0, hallucination_power + power) - -/mob/living/carbon/proc/handle_hallucinations() - //Tick down the duration - hallucination_duration = max(0, hallucination_duration - 1) - //Adjust power if we have some chems that affect it - if(has_chemical_effect(CE_MIND, threshold_under = -1)) - hallucination_power = hallucination_power++ - else if(has_chemical_effect(CE_MIND, threshold_under = 0)) - hallucination_power = min(hallucination_power++, 50) - else if(has_chemical_effect(CE_MIND, 1)) - hallucination_duration = max(0, hallucination_duration - 1) - hallucination_power = max(hallucination_power - GET_CHEMICAL_EFFECT(src, CE_MIND), 0) - - //See if hallucination is gone - if(!hallucination_power) - hallucination_duration = 0 - return - if(!hallucination_duration) - hallucination_power = 0 - return - - if(!client || stat || world.time < next_hallucination) - return - if(has_chemical_effect(CE_MIND, 1) && prob(GET_CHEMICAL_EFFECT(src, CE_MIND)*40)) //antipsychotics help - return - var/hall_delay = rand(10,20) SECONDS - - if(hallucination_power < 50) - hall_delay *= 2 - next_hallucination = world.time + hall_delay - var/list/candidates = list() - for(var/T in subtypesof(/datum/hallucination/)) - var/datum/hallucination/H = new T - if(H.can_affect(src)) - candidates += H - if(candidates.len) - var/datum/hallucination/H = pick(candidates) - H.holder = src - H.activate() - -////////////////////////////////////////////////////////////////////////////////////////////////////// -//Hallucination effects datums -////////////////////////////////////////////////////////////////////////////////////////////////////// - -/datum/hallucination - var/mob/living/carbon/holder - var/allow_duplicates = 1 - var/duration = 0 - var/min_power = 0 //at what levels of hallucination power mobs should get it - var/max_power = INFINITY - -/datum/hallucination/proc/start() - -/datum/hallucination/proc/end() - -/datum/hallucination/proc/can_affect(var/mob/living/carbon/C) - if(!C.client) - return 0 - if(min_power > C.hallucination_power) - return 0 - if(max_power < C.hallucination_power) - return 0 - if(!allow_duplicates && (locate(type) in C.hallucinations)) - return 0 - return 1 - -/datum/hallucination/Destroy() - . = ..() - holder = null - -/datum/hallucination/proc/activate() - if(!holder || !holder.client) - return - holder.hallucinations += src - start() - spawn(duration) - if(holder) - end() - holder.hallucinations -= src - qdel(src) - - -//Playing a random sound -/datum/hallucination/sound - var/list/sounds = list('sound/machines/airlock.ogg','sound/effects/explosionfar.ogg','sound/machines/windowdoor.ogg','sound/machines/twobeep.ogg') - -/datum/hallucination/sound/start() - var/turf/T = locate(holder.x + rand(6,11), holder.y + rand(6,11), holder.z) - holder.playsound_local(T,pick(sounds),70) - -/datum/hallucination/sound/tools - sounds = list('sound/items/Ratchet.ogg','sound/items/Welder.ogg','sound/items/Crowbar.ogg','sound/items/Screwdriver.ogg') - -/datum/hallucination/sound/danger - min_power = 30 - sounds = list('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg','sound/weapons/smash.ogg') - -/datum/hallucination/sound/spooky - min_power = 50 - sounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ - 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - -//Hearing someone being shot twice -/datum/hallucination/gunfire - var/gunshot - var/turf/origin - duration = 15 - min_power = 30 - -/datum/hallucination/gunfire/start() - gunshot = pick('sound/weapons/gunshot/gunshot_strong.ogg', 'sound/weapons/gunshot/gunshot2.ogg', 'sound/weapons/gunshot/shotgun.ogg', 'sound/weapons/gunshot/gunshot.ogg','sound/weapons/Taser.ogg') - origin = locate(holder.x + rand(4,8), holder.y + rand(4,8), holder.z) - holder.playsound_local(origin,gunshot,50) - -/datum/hallucination/gunfire/end() - holder.playsound_local(origin,gunshot,50) - -//Hearing someone talking to/about you. -/datum/hallucination/talking/can_affect(var/mob/living/carbon/C) - if(!..()) - return 0 - for(var/mob/living/M in oview(C)) - return TRUE - -/datum/hallucination/talking/start() - var/sanity = 5 //even insanity needs some sanity - for(var/mob/living/talker in oview(holder)) - if(talker.stat) - continue - var/message - if(prob(80)) - var/list/names = list() - var/lastname = copytext(holder.real_name, findtext(holder.real_name, " ")+1) - var/firstname = copytext(holder.real_name, 1, findtext(holder.real_name, " ")) - if(lastname) names += lastname - if(firstname) names += firstname - if(!names.len) - names += holder.real_name - var/add = prob(20) ? ", [pick(names)]" : "" - var/list/phrases = list("[prob(50) ? "Hey, " : ""][pick(names)]!","[prob(50) ? "Hey, " : ""][pick(names)]?","Get out[add]!","Go away[add].","What are you doing[add]?","Where's your ID[add]?") - if(holder.hallucination_power > 50) - phrases += list("What did you come here for[add]?","Don't touch me[add].","You're not getting out of here[add].", "You are a failure, [pick(names)].","Just kill yourself already, [pick(names)].","Put on some clothes[add].","Take off your clothes[add].") - message = pick(phrases) - to_chat(holder,"[talker.name] [holder.say_quote(message)], \"[message]\"") - else - to_chat(holder,"[talker.name] points at [holder.name]") - to_chat(holder,"[talker.name] says something softly.") - - var/speech_state = holder.check_speech_punctuation_state(message) - if(speech_state) - var/image/speech_bubble = image('icons/mob/talk.dmi', talker, speech_state) - addtimer(CALLBACK(src, .proc/qdel_image, speech_bubble), 3 SECONDS) - show_image(holder, speech_bubble) - - sanity-- //don't spam them in very populated rooms. - if(!sanity) - return - -/datum/hallucination/talking/proc/qdel_image(var/image/speech_bubble) - qdel(speech_bubble) - -//Spiderling skitters -/datum/hallucination/skitter/start() - to_chat(holder,"The spiderling skitters[pick(" away"," around","")].") - -//Spiders in your body -/datum/hallucination/spiderbabies - min_power = 40 - -/datum/hallucination/spiderbabies/start() - var/mob/living/carbon/H = holder - var/list/limbs = H.get_external_organs() - if(!LAZYLEN(limbs)) - return - var/obj/O = pick(limbs) - to_chat(H,SPAN_WARNING("You feel something [pick("moving","squirming","skittering")] inside of your [O.name]!")) - -//Seeing stuff -/datum/hallucination/mirage - duration = 30 SECONDS - max_power = 30 - var/number = 1 - var/list/things = list() //list of images to display - -/datum/hallucination/mirage/Destroy() - end() - . = ..() - -/datum/hallucination/mirage/proc/generate_mirage() - var/icon/T = new('icons/obj/trash.dmi') - return image(T, pick(T.IconStates()), layer = BELOW_TABLE_LAYER) - -/datum/hallucination/mirage/start() - var/list/possible_points = list() - for(var/turf/simulated/floor/F in view(holder, world.view+1)) - possible_points += F - if(possible_points.len) - for(var/i = 1 to number) - var/image/thing = generate_mirage() - things += thing - thing.loc = pick(possible_points) - holder.client.images += things - -/datum/hallucination/mirage/end() - if(holder.client) - holder.client.images -= things - -//LOADSEMONEY -/datum/hallucination/mirage/money - min_power = 20 - max_power = 45 - number = 2 - -/datum/hallucination/mirage/money/generate_mirage() - return image('icons/obj/items/money.dmi', "cash_x_5]", layer = BELOW_TABLE_LAYER) - -//Blood and aftermath of firefight -/datum/hallucination/mirage/carnage - min_power = 50 - number = 10 - -/datum/hallucination/mirage/carnage/generate_mirage() - if(prob(50)) - var/image/I = image('icons/effects/blood.dmi', pick("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7"), layer = BELOW_TABLE_LAYER) - I.color = COLOR_BLOOD_HUMAN - return I - else - var/image/I = image('icons/obj/ammo.dmi', "s-casing-spent", layer = BELOW_TABLE_LAYER) - I.layer = BELOW_TABLE_LAYER - I.dir = pick(global.alldirs) - I.pixel_x = rand(-10,10) - I.pixel_y = rand(-10,10) - return I - -//Fake telepathy -/datum/hallucination/telepahy - allow_duplicates = 0 - duration = 20 MINUTES - -/datum/hallucination/telepahy/start() - to_chat(holder,"You expand your mind outwards.") - holder.verbs += /mob/living/carbon/human/proc/fakeremotesay - -/datum/hallucination/telepahy/end() - if(holder) - holder.verbs -= /mob/living/carbon/human/proc/fakeremotesay - -/mob/living/carbon/human/proc/fakeremotesay() - set name = "Telepathic Message" - set category = "Superpower" - - if(!hallucination_power) - src.verbs -= /mob/living/carbon/human/proc/fakeremotesay - return - - if(stat) - to_chat(usr, SPAN_WARNING("You're not in any state to use your powers right now!")) - return - - if(has_chemical_effect(CE_MIND, 1)) - to_chat(usr, SPAN_WARNING("Chemicals in your blood prevent you from using your power!")) - - var/list/creatures = list() - for(var/mob/living/carbon/C in SSmobs.mob_list) - creatures += C - creatures -= usr - var/mob/target = input("Who do you want to project your mind to?") as null|anything in creatures - if (isnull(target)) - return - - var/msg = sanitize(input(usr, "What do you wish to transmit")) - show_message(SPAN_NOTICE("You project your mind into [target.name]: \"[msg]\"")) - if(!stat && prob(20)) - say(msg) - -//Fake attack -/datum/hallucination/fakeattack - min_power = 30 - -/datum/hallucination/fakeattack/can_affect(var/mob/living/carbon/C) - if(!..()) - return 0 - for(var/mob/living/M in oview(C,1)) - return TRUE - -/datum/hallucination/fakeattack/start() - for(var/mob/living/M in oview(holder,1)) - to_chat(holder, "[M] has punched [holder]!") - holder.playsound_local(get_turf(holder),"punch",50) - -//Fake injection -/datum/hallucination/fakeattack/hypo - min_power = 30 - -/datum/hallucination/fakeattack/hypo/start() - to_chat(holder, "You feel a tiny prick!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index c7a36f4ae18..0bd6e1fb1e5 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -17,7 +17,7 @@ var/last_loc = loc ..(species.gibbed_anim, do_gibs = FALSE) if(last_loc) - gibs(last_loc, dna, _fleshcolor = species.get_flesh_colour(src), _bloodcolor = species.get_blood_color(src)) + gibs(last_loc, _fleshcolor = species.get_flesh_colour(src), _bloodcolor = species.get_blood_color(src)) /mob/living/carbon/human/dust() if(species) @@ -43,15 +43,18 @@ if(SSticker.mode) SSticker.mode.check_win() - if(config.show_human_death_message) + if(get_config_value(/decl/config/toggle/health_show_human_death_message)) deathmessage = species.get_death_message(src) || "seizes up and falls limp..." else deathmessage = "no message" + . = ..(gibbed, deathmessage, show_dead_message) + if(!gibbed) handle_organs() if(species.death_sound) playsound(loc, species.death_sound, 80, 1, 1) + handle_hud_list() /mob/living/carbon/human/proc/is_husked() @@ -61,9 +64,8 @@ if(is_husked()) return - f_style = /decl/sprite_accessory/facial_hair/shaved - h_style = /decl/sprite_accessory/hair/bald - update_hair(0) + set_facial_hairstyle(/decl/sprite_accessory/facial_hair/shaved, skip_update = TRUE) + set_hairstyle(/decl/sprite_accessory/hair/bald, skip_update = FALSE) mutations.Add(MUTATION_HUSK) for(var/obj/item/organ/external/E in get_external_organs()) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b4e35098b5e..b49c1dd1ad2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -6,12 +6,14 @@ icon_state = "body_m_s" mob_sort_value = 6 dna = new /datum/dna() + mob_default_max_health = 150 var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/step_count -/mob/living/carbon/human/Initialize(mapload, species_name = null, datum/dna/new_dna = null, decl/bodytype/new_bodytype = null) +/mob/living/carbon/human/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + current_health = mob_default_max_health setup_hud_overlays() var/list/newargs = args.Copy(2) setup(arglist(newargs)) @@ -47,14 +49,6 @@ var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH) return stomach?.ingested -/mob/living/carbon/human/get_fullness() - if(!should_have_organ(BP_STOMACH)) - return ..() - var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH, /obj/item/organ/internal/stomach) - if(stomach) - return nutrition + (stomach.ingested?.total_volume * 10) - return 0 //Always hungry, but you can't actually eat. :( - /mob/living/carbon/human/get_inhaled_reagents() if(!should_have_organ(BP_LUNGS)) return @@ -97,7 +91,7 @@ stat(null, "Hardsuit charge: [cell_status]") /mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default. - if(!config.use_loyalty_implants && !override) return // Nuh-uh. + if(!get_config_value(/decl/config/toggle/use_loyalty_implants) && !override) return // Nuh-uh. var/obj/item/implant/loyalty/L = new/obj/item/implant/loyalty(M) L.imp_in = M @@ -135,70 +129,12 @@ var/obj/item/underwear/UW = entry LAZYADD(., "
    Remove \the [UW]") -// called when something steps onto a human -// this handles mulebots and vehicles -/mob/living/carbon/human/Crossed(var/atom/movable/AM) - if(istype(AM, /mob/living/bot/mulebot)) - var/mob/living/bot/mulebot/MB = AM - MB.runOver(src) - - if(istype(AM, /obj/vehicle)) - var/obj/vehicle/V = AM - V.RunOver(src) - -// Get rank from ID, ID inside PDA, PDA, ID in wallet, etc. -/mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job") - var/obj/item/card/id/id = GetIdCard() - if(istype(id)) - return id.rank ? id.rank : if_no_job - else - return if_no_id - -//gets assignment from ID or ID inside PDA or PDA itself -//Useful when player do something with computers -/mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job") - var/obj/item/card/id/id = GetIdCard() - if(istype(id)) - return id.assignment ? id.assignment : if_no_job - else - return if_no_id - -//gets name from ID or ID inside PDA or PDA itself -//Useful when player do something with computers -/mob/living/carbon/human/proc/get_authentification_name(var/if_no_id = "Unknown") - var/obj/item/card/id/id = GetIdCard() - if(istype(id)) - return id.registered_name - else - return if_no_id - -//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere -/mob/living/carbon/human/proc/get_visible_name() - var/face_name = get_face_name() - var/id_name = get_id_name("") - if((face_name == "Unknown") && id_name && (id_name != face_name)) - return "[face_name] (as [id_name])" - return face_name - -//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable -//Also used in AI tracking people by face, so added in checks for head coverings like masks and helmets -/mob/living/carbon/human/proc/get_face_name() - var/obj/item/organ/external/H = GET_EXTERNAL_ORGAN(src, BP_HEAD) - var/obj/item/clothing/mask/mask = get_equipped_item(slot_wear_mask_str) - var/obj/item/head = get_equipped_item(slot_head_str) - if(!H || (H.status & ORGAN_DISFIGURED) || !real_name || is_husked() || (mask && (mask.flags_inv&HIDEFACE)) || (head && (head.flags_inv&HIDEFACE))) //Face is unrecognizeable, use ID if able - if(istype(mask) && mask.visible_name) - return mask.visible_name - return get_rig()?.visible_name || "Unknown" - return real_name - -//gets name from ID or PDA itself, ID inside PDA doesn't matter -//Useful when player is being seen by other mobs -/mob/living/carbon/human/proc/get_id_name(var/if_no_id = "Unknown") - . = if_no_id - var/obj/item/card/id/I = GetIdCard(exceptions = list(/obj/item/holder)) - if(istype(I)) - return I.registered_name + +// TODO: remove when is_husked is moved to a parent type (or if husking is removed) +/mob/living/carbon/human/identity_is_visible() + if(is_husked()) + return FALSE + return ..() /mob/living/carbon/human/OnSelfTopic(href_list) if (href_list["lookitem"]) @@ -382,15 +318,6 @@ dna.check_integrity(src) return -/mob/living/carbon/human/get_bodytype_category() - . = get_bodytype()?.bodytype_category - -/mob/living/carbon/human/check_has_mouth() - var/obj/item/organ/external/head/H = get_organ(BP_HEAD, /obj/item/organ/external/head) - if(!H || !istype(H) || !H.can_intake_reagents) - return FALSE - return TRUE - /mob/living/carbon/human/empty_stomach() SET_STATUS_MAX(src, STAT_STUN, 3) @@ -473,7 +400,7 @@ reset_blood() if(!client || !key) //Don't boot out anyone already in the mob. - for(var/mob/living/carbon/brain/brain in global.player_list) // This is really nasty, does it even work anymore? + for(var/mob/living/brain/brain in global.player_list) // This is really nasty, does it even work anymore? if(brain.real_name == src.real_name && brain.mind) brain.mind.transfer_to(src) qdel(brain.loc) @@ -574,14 +501,16 @@ force_update_limbs() // Check and clear hair. - var/decl/sprite_accessory/hair/hairstyle = GET_DECL(h_style) + var/set_hairstyle = get_hairstyle() + var/decl/sprite_accessory/hair/hairstyle = GET_DECL(set_hairstyle) if(!hairstyle?.accessory_is_available(src, species, new_bodytype)) - change_hair(new_bodytype.default_h_style, FALSE) - var/decl/sprite_accessory/hair/facialhairstyle = GET_DECL(f_style) + set_hairstyle(new_bodytype.default_h_style, skip_update = TRUE) + set_hairstyle = get_facial_hairstyle() + var/decl/sprite_accessory/hair/facialhairstyle = GET_DECL(set_hairstyle) if(!facialhairstyle?.accessory_is_available(src, species, new_bodytype)) - change_facial_hair(new_bodytype.default_f_style, FALSE) + set_facial_hairstyle(new_bodytype.default_f_style, skip_update = TRUE) // TODO: check markings. - + update_hair() update_eyes() return TRUE return FALSE @@ -610,7 +539,7 @@ holder_type = null if(species.holder_type) holder_type = species.holder_type - maxHealth = species.total_health + set_max_health(species.total_health, skip_health_update = TRUE) // Health update is handled later. remove_extension(src, /datum/extension/armor) if(species.natural_armour_values) set_extension(src, /datum/extension/armor, species.natural_armour_values) @@ -713,7 +642,7 @@ /mob/living/carbon/human/proc/apply_bodytype_appearance() var/decl/bodytype/root_bodytype = get_bodytype() if(!root_bodytype) - skin_colour = COLOR_BLACK + set_skin_colour(COLOR_BLACK) else root_bodytype.apply_appearance(src) default_pixel_x = initial(pixel_x) + root_bodytype.pixel_offset_x @@ -903,10 +832,6 @@ if(stomach) victim.forceMove(stomach) -/mob/living/carbon/human/should_have_organ(var/organ_check) - var/decl/bodytype/root_bodytype = get_bodytype() - return root_bodytype?.has_organ[organ_check] - /mob/living/carbon/human/get_adjusted_metabolism(metabolism) return ..() * (species ? species.metabolism_mod : 1) @@ -1009,7 +934,7 @@ //Point at which you dun breathe no more. Separate from asystole crit, which is heart-related. /mob/living/carbon/human/nervous_system_failure() - return getBrainLoss() >= maxHealth * 0.75 + return getBrainLoss() >= get_max_health() * 0.75 /mob/living/carbon/human/melee_accuracy_mods() . = ..() @@ -1100,57 +1025,12 @@ if(damage && P.damtype == BRUTE) var/hit_dir = get_dir(P.starting, src) var/obj/effect/decal/cleanable/blood/B = blood_splatter(get_step(src, hit_dir), src, 1, hit_dir) - B.icon_state = pick("dir_splatter_1","dir_splatter_2") - var/scale = min(1, round(P.damage / 50, 0.2)) - B.set_scale(scale) - + if(!QDELETED(B)) + B.icon_state = pick("dir_splatter_1","dir_splatter_2") + var/scale = min(1, round(P.damage / 50, 0.2)) + B.set_scale(scale) new /obj/effect/temp_visual/bloodsplatter(loc, hit_dir, species.get_blood_color(src)) -/mob/living/carbon/human/get_dexterity(var/silent = FALSE) - - // Check if we have a slot to use for this. - var/check_slot = get_active_held_item_slot() - if(!check_slot) - return DEXTERITY_NONE - var/datum/inventory_slot/gripper/gripper = get_inventory_slot_datum(check_slot) - if(!istype(gripper)) - if(!silent) - to_chat(src, "Your [parse_zone(check_slot)] is missing!") - return DEXTERITY_NONE - - // Work out if we have any brain damage impacting our dexterity. - var/dex_malus = 0 - if(getBrainLoss() && getBrainLoss() > config.dex_malus_brainloss_threshold) ///brainloss shouldn't instantly cripple you, so the effects only start once past the threshold and escalate from there. - dex_malus = clamp(CEILING((getBrainLoss()-config.dex_malus_brainloss_threshold)/10), 0, length(global.dexterity_levels)) - if(dex_malus > 0) - dex_malus = global.dexterity_levels[dex_malus] - - // If this slot does not need an organ we just go off the dexterity of the slot itself. - if(isnull(gripper.requires_organ_tag)) - if(dex_malus) - if(!silent) - to_chat(src, SPAN_WARNING("Your [lowertext(gripper.slot_name)] doesn't respond properly!")) - return (gripper.get_dexterity() & ~dex_malus) - return gripper.get_dexterity() - - // If this slot requires an organ, do the appropriate organ checks. - var/obj/item/organ/external/active_hand = GET_EXTERNAL_ORGAN(src, check_slot) - if(!active_hand) - if(!silent) - to_chat(src, "Your [parse_zone(check_slot)] is missing!") - return DEXTERITY_NONE - if(!active_hand.is_usable()) - if(!silent) - to_chat(src, SPAN_WARNING("Your [active_hand.name] is unusable!")) - return DEXTERITY_NONE - - // Return our organ dexterity. - if(dex_malus) - if(!silent) - to_chat(src, SPAN_WARNING("Your [active_hand.name] doesn't respond properly!")) - return (active_hand.get_manual_dexterity() & ~dex_malus) - return active_hand.get_manual_dexterity() - /mob/living/carbon/human/lose_hair() if(get_bodytype().set_default_hair(src)) . = TRUE @@ -1210,7 +1090,7 @@ apply_species_inventory_restrictions() species.handle_post_spawn(src) - refresh_visible_overlays() + try_refresh_visible_overlays() //Sets the mob's real name and update all the proper fields /mob/living/carbon/human/proc/set_real_name(var/newname) @@ -1233,14 +1113,15 @@ set_species(species_name, new_bodytype) var/decl/bodytype/root_bodytype = get_bodytype() // root bodytype is set in set_species - if(!skin_colour) - skin_colour = root_bodytype.base_color - if(!hair_colour) - hair_colour = root_bodytype.base_hair_color - if(!facial_hair_colour) - facial_hair_colour = root_bodytype.base_hair_color - if(!eye_colour) - eye_colour = root_bodytype.base_eye_color + if(!get_skin_colour()) + set_skin_colour(root_bodytype.base_color, skip_update = TRUE) + if(!get_hair_colour()) + set_hair_colour(root_bodytype.base_hair_color, skip_update = TRUE) + if(!get_facial_hair_colour()) + set_facial_hair_colour(root_bodytype.base_hair_color, skip_update = TRUE) + if(!get_eye_colour()) + set_eye_colour(root_bodytype.base_eye_color, skip_update = TRUE) + root_bodytype.set_default_hair(src, override_existing = TRUE, defer_update_hair = TRUE) if(!blood_type && length(species?.blood_types)) blood_type = pickweight(species.blood_types) @@ -1271,7 +1152,7 @@ //Runs last after setup and after the parent init has been executed. /mob/living/carbon/human/proc/post_setup(var/species_name = null, var/datum/dna/new_dna = null) - refresh_visible_overlays() //Do this exactly once per setup + try_refresh_visible_overlays() //Do this exactly once per setup /mob/living/carbon/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) var/safety = eyecheck() diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/human_appearance.dm similarity index 59% rename from code/modules/mob/living/carbon/human/appearance.dm rename to code/modules/mob/living/carbon/human/human_appearance.dm index 0dcccc64d82..2f8b796aa5b 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/human_appearance.dm @@ -1,8 +1,82 @@ +/mob/living/carbon/human + var/_h_style + var/_f_style + var/_hair_colour + var/_facial_hair_colour + var/_eye_colour + var/_skin_colour + var/_lip_colour + /mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/datum/topic_state/state = global.default_topic_state) var/datum/nano_module/appearance_changer/AC = new(location, src, check_species_whitelist, species_whitelist, species_blacklist) AC.flags = flags AC.ui_interact(user, state = state) +/mob/living/carbon/human/get_lip_colour() + return _lip_colour + +/mob/living/carbon/human/get_eye_colour() + return _eye_colour + +/mob/living/carbon/human/get_skin_colour() + return _skin_colour + +/mob/living/carbon/human/get_hairstyle() + return _h_style + +/mob/living/carbon/human/get_hair_colour() + return _hair_colour + +/mob/living/carbon/human/get_facial_hairstyle() + return _f_style + +/mob/living/carbon/human/get_facial_hair_colour() + return _facial_hair_colour + +/mob/living/carbon/human/set_lip_colour(var/new_color, var/skip_update = FALSE) + if((. = ..())) + _lip_colour = new_color + if(!skip_update) + update_body() + +/mob/living/carbon/human/set_eye_colour(var/new_color, var/skip_update = FALSE) + if((. = ..())) + _eye_colour = new_color + if(!skip_update) + update_eyes() + update_body() + +/mob/living/carbon/human/set_skin_colour(var/new_color, var/skip_update = FALSE) + if((. = ..())) + _skin_colour = new_color + if(!skip_update) + force_update_limbs() + update_body() + +/mob/living/carbon/human/set_hair_colour(var/new_color, var/skip_update = FALSE) + if((. = ..())) + _hair_colour = new_color + if(!skip_update) + update_hair() + +/mob/living/carbon/human/set_hairstyle(var/new_hairstyle, var/skip_update = FALSE) + if((. = ..())) + _h_style = new_hairstyle + if(!skip_update) + update_hair() + +/mob/living/carbon/human/set_facial_hair_colour(var/new_color, var/skip_update = FALSE) + if((. = ..())) + _facial_hair_colour = new_color + if(!skip_update) + update_hair() + +/mob/living/carbon/human/set_facial_hairstyle(var/new_facial_hairstyle, var/skip_update = FALSE) + if((. = ..())) + _f_style = new_facial_hairstyle + if(!skip_update) + update_hair() + /mob/living/carbon/human/proc/change_species(var/new_species, var/new_bodytype = null) if(!new_species) return @@ -32,7 +106,7 @@ add_language(antag.required_language) set_default_language(antag.required_language) reset_hair() - refresh_visible_overlays() + try_refresh_visible_overlays() return 1 /mob/living/carbon/human/set_gender(var/new_gender, var/update_body = FALSE) @@ -46,70 +120,23 @@ var/decl/pronouns/pronouns = pick(species.available_pronouns) set_gender(pronouns.name, TRUE) -/mob/living/carbon/human/proc/change_hair(var/hair_style, var/update_icons = TRUE) - if(!hair_style || h_style == hair_style || !ispath(hair_style, /decl/sprite_accessory/hair)) - return - h_style = hair_style - update_hair(update_icons) - return 1 - -/mob/living/carbon/human/proc/change_facial_hair(var/facial_hair_style, var/update_icons = TRUE) - if(!facial_hair_style || f_style == facial_hair_style || !ispath(facial_hair_style, /decl/sprite_accessory/facial_hair)) - return - f_style = facial_hair_style - update_hair(update_icons) - return 1 - /mob/living/carbon/human/proc/reset_hair() var/list/valid_hairstyles = get_valid_hairstyle_types() - var/list/valid_facial_hairstyles = get_valid_facial_hairstyle_types() - if(length(valid_hairstyles)) - h_style = pick(valid_hairstyles) + set_hairstyle(pick(valid_hairstyles), skip_update = TRUE) else //this shouldn't happen - h_style = get_bodytype()?.default_h_style || /decl/sprite_accessory/hair/bald + set_hairstyle(get_bodytype()?.default_h_style || /decl/sprite_accessory/hair/bald, skip_update = TRUE) + var/list/valid_facial_hairstyles = get_valid_facial_hairstyle_types() if(length(valid_facial_hairstyles)) - f_style = pick(valid_facial_hairstyles) + set_facial_hairstyle(pick(valid_facial_hairstyles), skip_update = TRUE) else //this shouldn't happen - f_style = get_bodytype()?.default_f_style || /decl/sprite_accessory/facial_hair/shaved + set_facial_hairstyle(get_bodytype()?.default_f_style || /decl/sprite_accessory/facial_hair/shaved, skip_update = TRUE) update_hair() -/mob/living/carbon/human/proc/change_eye_color(var/new_colour) - if(eye_colour != new_colour) - eye_colour = new_colour - update_eyes() - update_body() - return TRUE - return FALSE - -/mob/living/carbon/human/proc/change_hair_color(var/new_colour) - if(hair_colour != new_colour) - hair_colour = new_colour - force_update_limbs() - update_body() - update_hair() - return TRUE - return FALSE - -/mob/living/carbon/human/proc/change_facial_hair_color(var/new_colour) - if(facial_hair_colour != new_colour) - facial_hair_colour = new_colour - update_hair() - return TRUE - return FALSE - -/mob/living/carbon/human/proc/change_skin_color(var/new_colour) - if(skin_colour == new_colour || !(get_bodytype().appearance_flags & HAS_SKIN_COLOR)) - return FALSE - skin_colour = new_colour - force_update_limbs() - update_body() - return TRUE - /mob/living/carbon/human/proc/change_skin_tone(var/tone) if(skin_tone == tone || !(get_bodytype().appearance_flags & HAS_A_SKIN_TONE)) return diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 7ac0f60acec..5f5928aa041 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -1,24 +1,19 @@ -//Updates the mob's health from organs and mob damage variables -/mob/living/carbon/human/updatehealth() - - if(status_flags & GODMODE) - health = maxHealth - set_stat(CONSCIOUS) - return - - health = maxHealth - getBrainLoss() +/mob/living/carbon/human/get_total_life_damage() + return getBrainLoss() +//Updates the mob's health from organs and mob damage variables +/mob/living/carbon/human/update_health() + ..() //TODO: fix husking - if(((maxHealth - getFireLoss()) < config.health_threshold_dead) && stat == DEAD) + if(stat == DEAD && (get_max_health() - getFireLoss()) < get_config_value(/decl/config/num/health_health_threshold_dead)) make_husked() - return -/mob/living/carbon/human/adjustBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - if(should_have_organ(BP_BRAIN)) +/mob/living/carbon/human/adjustBrainLoss(var/amount, var/do_update_health = TRUE) + if(!(status_flags & GODMODE) && should_have_organ(BP_BRAIN)) var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) if(sponge) sponge.take_internal_damage(amount) + ..() /mob/living/carbon/human/setBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode @@ -26,7 +21,7 @@ var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) if(sponge) sponge.damage = min(max(amount, 0),sponge.species.total_health) - updatehealth() + update_health() /mob/living/carbon/human/getBrainLoss() if(status_flags & GODMODE) return 0 //godmode @@ -52,7 +47,7 @@ /mob/living/carbon/human/setHalLoss(var/amount) adjustHalLoss(getHalLoss()-amount) -/mob/living/carbon/human/adjustHalLoss(var/amount) +/mob/living/carbon/human/adjustHalLoss(var/amount, var/do_update_health = TRUE) var/heal = (amount < 0) amount = abs(amount) var/list/limbs = get_external_organs() @@ -69,6 +64,8 @@ else amount -= E.add_pain(amount) BITSET(hud_updateflag, HEALTH_HUD) + if(do_update_health) + update_health() //These procs fetch a cumulative total damage from all organs /mob/living/carbon/human/getBruteLoss() @@ -87,14 +84,15 @@ amount += O.burn_dam return amount -/mob/living/carbon/human/adjustBruteLoss(var/amount) +/mob/living/carbon/human/adjustBruteLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) // take/heal overall call update_health regardless of arg if(amount > 0) take_overall_damage(amount, 0) else heal_overall_damage(-amount, 0) BITSET(hud_updateflag, HEALTH_HUD) -/mob/living/carbon/human/adjustFireLoss(var/amount) +/mob/living/carbon/human/adjustFireLoss(var/amount, var/do_update_health = TRUE) if(amount > 0) take_overall_damage(0, amount) else @@ -110,7 +108,7 @@ /mob/living/carbon/human/setCloneLoss(var/amount) adjustCloneLoss(getCloneLoss()-amount) -/mob/living/carbon/human/adjustCloneLoss(var/amount) +/mob/living/carbon/human/adjustCloneLoss(var/amount, var/do_update_health = TRUE) var/heal = amount < 0 amount = abs(amount) var/list/limbs = get_external_organs() @@ -124,6 +122,7 @@ else amount -= E.add_genetic_damage(amount) BITSET(hud_updateflag, HEALTH_HUD) + ..() /mob/living/carbon/human/proc/getOxyLossPercent() return (getOxyLoss() / species.total_health) * 100 @@ -137,14 +136,15 @@ /mob/living/carbon/human/setOxyLoss(var/amount) adjustOxyLoss(amount - getOxyLoss()) -/mob/living/carbon/human/adjustOxyLoss(var/amount) +/mob/living/carbon/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) + . = FALSE if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) if(breathe_organ) - breathe_organ.adjust_oxygen_deprivation(amount) + breathe_organ.adjust_oxygen_deprivation(damage) BITSET(hud_updateflag, HEALTH_HUD) - return TRUE - return FALSE + . = TRUE + ..(do_update_health = FALSE) // Oxyloss cannot directly kill humans /mob/living/carbon/human/getToxLoss() if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) @@ -159,7 +159,7 @@ adjustToxLoss(getToxLoss()-amount) // TODO: better internal organ damage procs. -/mob/living/carbon/human/adjustToxLoss(var/amount) +/mob/living/carbon/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return @@ -212,6 +212,9 @@ I.take_internal_damage(amount, silent=TRUE) amount = 0 + if(do_update_health) + update_health() + /mob/living/carbon/human/proc/can_autoheal(var/dam_type) if(!species || !dam_type) return FALSE @@ -242,13 +245,13 @@ //Heals ONE external organ, organ gets randomly selected from damaged ones. //It automatically updates damage overlays if necesary //It automatically updates health status -/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE) +/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) if(!parts.len) return var/obj/item/organ/external/picked = pick(parts) if(picked.heal_damage(brute,burn,robo_repair = affect_robo)) BITSET(hud_updateflag, HEALTH_HUD) - updatehealth() + update_health() //TODO reorganize damage procs so that there is a clean API for damaging living mobs @@ -261,11 +264,12 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t //It automatically updates health status /mob/living/carbon/human/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) var/list/parts = get_damageable_organs() - if(length(parts)) - var/obj/item/organ/external/picked = pick(parts) - if(picked.take_external_damage(brute, burn, override_droplimb = override_droplimb)) - BITSET(hud_updateflag, HEALTH_HUD) - updatehealth() + if(!length(parts)) + return + var/obj/item/organ/external/picked = pick(parts) + if(picked.take_external_damage(brute, burn, override_droplimb = override_droplimb)) + BITSET(hud_updateflag, HEALTH_HUD) + update_health() //Heal MANY external organs, in random order /mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) @@ -283,14 +287,17 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t burn -= (burn_was-picked.burn_dam) parts -= picked - updatehealth() + update_health() BITSET(hud_updateflag, HEALTH_HUD) // damage MANY external organs, in random order /mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return //godmode + var/list/obj/item/organ/external/parts = get_damageable_organs() - if(!parts.len) return + if(!parts.len) + return var/dam_flags = (sharp? DAM_SHARP : 0)|(edge? DAM_EDGE : 0) var/brute_avg = brute / parts.len @@ -306,7 +313,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t if(burn_avg) apply_damage(damage = burn_avg, damagetype = BURN, damage_flags = dam_flags, used_weapon = used_weapon, silent = TRUE, given_organ = E) - updatehealth() + update_health() BITSET(hud_updateflag, HEALTH_HUD) /* @@ -380,7 +387,7 @@ This function restores all organs. organ.add_genetic_damage(damage) // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). - updatehealth() + update_health() BITSET(hud_updateflag, HEALTH_HUD) return created_wound diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index d7a9f1dbb8e..0999068197b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -278,7 +278,7 @@ meteor_act return 0 //want the dislocation chance to be such that the limb is expected to dislocate after dealing a fraction of the damage needed to break the limb - var/dislocate_chance = effective_force/(dislocate_mult * organ.min_broken_damage * config.organ_health_multiplier)*100 + var/dislocate_chance = effective_force/(dislocate_mult * organ.min_broken_damage * get_config_value(/decl/config/num/health_organ_health_multiplier))*100 if(prob(dislocate_chance * blocked_mult(blocked))) visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") organ.dislocate(1) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 7f9ce538e1c..d57fc319496 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,20 +1,12 @@ /mob/living/carbon/human - var/h_style - var/f_style - - var/hair_colour - var/facial_hair_colour - var/skin_colour - var/eye_colour - var/regenerate_body_icon = FALSE // If true, the next icon update will also regenerate the body. var/skin_tone = 0 //Skin tone var/damage_multiplier = 1 //multiplies melee combat damage - var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup + var/lip_color = null //no lipstick by default- arguably misleading, as it could be used for general makeup var/list/worn_underwear = list() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 6359a938f6f..d8020db5bef 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -77,8 +77,8 @@ equipment_darkness_modifier += G.darkness_view equipment_vision_flags |= G.vision_flags equipment_light_protection += G.light_protection - if(G.overlay) - equipment_overlays |= G.overlay + if(G.screen_overlay) + equipment_overlays |= G.screen_overlay if(G.see_invisible >= 0) if(equipment_see_invis) equipment_see_invis = min(equipment_see_invis, G.see_invisible) @@ -183,7 +183,10 @@ return istype(get_equipped_item(slot_l_ear_str), /obj/item/radio/headset) || istype(get_equipped_item(slot_r_ear_str), /obj/item/radio/headset) /mob/living/carbon/human/welding_eyecheck() - var/obj/item/organ/internal/eyes/E = get_organ(get_bodytype().vision_organ, /obj/item/organ/internal/eyes) + var/vision_organ = get_bodytype()?.vision_organ + if(!vision_organ) + return + var/obj/item/organ/internal/eyes/E = get_organ(vision_organ, /obj/item/organ/internal/eyes) if(!E) return var/safety = eyecheck() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 77ed36f7740..b97bf79c27d 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -18,7 +18,7 @@ tally -= GET_CHEMICAL_EFFECT(src, CE_SPEEDBOOST) tally += GET_CHEMICAL_EFFECT(src, CE_SLOWDOWN) - var/health_deficiency = (maxHealth - health) + var/health_deficiency = (get_max_health() - current_health) if(health_deficiency >= 40) tally += (health_deficiency / 25) if(can_feel_pain()) @@ -55,15 +55,16 @@ if(facing_dir) tally += 3 // Locking direction will slow you down. - if (bodytemperature < species.cold_discomfort_level) - tally += (species.cold_discomfort_level - bodytemperature) / 10 * 1.75 + var/decl/bodytype/root_bodytype = get_bodytype() + if (root_bodytype && bodytemperature < root_bodytype.cold_discomfort_level) + tally += (root_bodytype.cold_discomfort_level - bodytemperature) / 10 * 1.75 tally += max(2 * stance_damage, 0) //damaged/missing feet or legs is slow if(mRun in mutations) tally = 0 - return (tally+config.human_delay) + return (tally+get_config_value(/decl/config/num/movement_human)) /mob/living/carbon/human/size_strength_mod() . = ..() @@ -149,6 +150,6 @@ var/mob/M = buckled M.unbuckle_mob() var/decl/bodytype/B = get_bodytype() - playsound(loc, isSynthetic() ? pick(B.synthetic_bodyfall_sounds) : pick(B.bodyfall_sounds), 50, TRUE, -1) + playsound(loc, B.bodyfall_sounds, 50, TRUE, -1) else if(!lying && !old_buckled_lying) handle_stance() // Force an immediate stance update. diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 6e57fb48c2c..2573c969a20 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -272,7 +272,7 @@ //Registers an organ and setup the organ hierachy properly. //affected : Parent organ if applicable. //in_place : If true, we're performing an in-place replacement, without triggering anything related to adding the organ in-game as part of surgery or else. -/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached) +/mob/living/carbon/human/add_organ(obj/item/organ/O, obj/item/organ/external/affected, in_place, update_icon, detached, skip_health_update = FALSE) if(!(. = ..())) return if(!O.is_internal()) @@ -283,7 +283,7 @@ update_inhand_overlays(FALSE) update_body(FALSE) update_bandages(FALSE) - UpdateDamageIcon(FALSE) + update_damage_icon(FALSE) hud_reset() queue_icon_update() //Avoids calling icon updates 50 times when adding multiple organs @@ -293,7 +293,7 @@ //ignore_children: Skips recursively removing this organ's child organs. //in_place : If true we remove only the organ (no children items or implants) and avoid triggering mob changes and parent organs changes as much as possible. // Meant to be used for init and species transforms, without triggering any updates to mob state or anything related to losing a limb as part of surgery or combat. -/mob/living/carbon/human/remove_organ(obj/item/organ/O, drop_organ, detach, ignore_children, in_place, update_icon) +/mob/living/carbon/human/remove_organ(obj/item/organ/O, drop_organ, detach, ignore_children, in_place, update_icon, skip_health_update = FALSE) if(!(. = ..())) return if(!O.is_internal()) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index ba5324b4324..2a062c62fe9 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -20,8 +20,9 @@ to_chat(src, SPAN_WARNING("You can't mess with your hair right now!")) return - if(h_style) - var/decl/sprite_accessory/hair/hair_style = GET_DECL(h_style) + var/hairstyle = get_hairstyle() + if(hairstyle) + var/decl/sprite_accessory/hair/hair_style = GET_DECL(hairstyle) if(!(hair_style.flags & HAIR_TIEABLE)) to_chat(src, SPAN_WARNING("Your hair isn't long enough to tie.")) return @@ -39,9 +40,9 @@ if(incapacitated()) to_chat(src, SPAN_WARNING("You can't mess with your hair right now!")) return - if(selected_type && h_style != selected_type) - h_style = selected_type - refresh_visible_overlays() + if(selected_type && hairstyle != selected_type) + set_hairstyle(selected_type) + try_refresh_visible_overlays() visible_message(SPAN_NOTICE("\The [src] pauses a moment to style their hair.")) else to_chat(src, SPAN_NOTICE("You're already using that style.")) @@ -103,5 +104,5 @@ set name = "Change Colour" set desc = "Choose the colour of your skin." - var/new_skin = input(usr, "Choose your new skin colour: ", "Change Colour", skin_colour) as color|null - change_skin_color(new_skin) + var/new_skin = input(usr, "Choose your new skin colour: ", "Change Colour", get_skin_colour()) as color|null + set_skin_colour(new_skin) diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 56c6441fe00..71eb35481c6 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -3,23 +3,24 @@ status_flags = GODMODE|CANPUSH virtual_mob = null -/mob/living/carbon/human/dummy/mannequin/Initialize() +/mob/living/carbon/human/dummy/mannequin/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) . = ..() STOP_PROCESSING(SSmobs, src) global.human_mob_list -= src -/mob/living/carbon/human/dummy/selfdress/Initialize() - . = ..() +/mob/living/carbon/human/dummy/selfdress/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + ..() + return INITIALIZE_HINT_LATELOAD + +/mob/living/carbon/human/dummy/selfdress/LateInitialize() for(var/obj/item/I in loc) equip_to_appropriate_slot(I) /mob/living/carbon/human/corpse real_name = "corpse" -/mob/living/carbon/human/corpse/Initialize(mapload, new_species, obj/abstract/landmark/corpse/corpse) - - . = ..(mapload, new_species) - +/mob/living/carbon/human/corpse/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype, obj/abstract/landmark/corpse/corpse) + . = ..(mapload, species_name, new_dna, new_bodytype) // do not pass the corpse landmark var/decl/cultural_info/culture = get_cultural_value(TAG_CULTURE) if(culture) var/newname = culture.get_random_name(src, gender, species.name) @@ -28,16 +29,20 @@ SetName(newname) if(mind) mind.name = real_name + if(corpse) + corpse.randomize_appearance(src, get_species_name()) + corpse.equip_corpse_outfit(src) + return INITIALIZE_HINT_LATELOAD - adjustOxyLoss(maxHealth)//cease life functions - setBrainLoss(maxHealth) +/mob/living/carbon/human/corpse/LateInitialize() + ..() + var/current_max_health = get_max_health() + adjustOxyLoss(current_max_health)//cease life functions + setBrainLoss(current_max_health) + death(FALSE, deathmessage = "no message", show_dead_message = FALSE) var/obj/item/organ/internal/heart/corpse_heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) if(corpse_heart) corpse_heart.pulse = PULSE_NONE//actually stops heart to make worried explorers not care too much - if(corpse) - corpse.randomize_appearance(src, new_species) - corpse.equip_outfit(src) - update_icon() /mob/living/carbon/human/dummy/mannequin/add_to_living_mob_list() return FALSE @@ -54,7 +59,8 @@ /mob/living/carbon/human/monkey gender = PLURAL -/mob/living/carbon/human/monkey/Initialize(mapload) +/mob/living/carbon/human/monkey/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) if(gender == PLURAL) gender = pick(MALE, FEMALE) - . = ..(mapload, SPECIES_MONKEY) + species_name = SPECIES_MONKEY + . = ..() diff --git a/code/modules/mob/living/carbon/human/human_verbs.dm b/code/modules/mob/living/carbon/human/human_verbs.dm index c233c51241e..f83e9512aee 100644 --- a/code/modules/mob/living/carbon/human/human_verbs.dm +++ b/code/modules/mob/living/carbon/human/human_verbs.dm @@ -11,18 +11,17 @@ src.verbs -= /mob/living/carbon/human/proc/morph return - var/new_facial = input("Please select facial hair color.", "Character Generation", facial_hair_colour) as color + var/new_facial = input("Please select facial hair color.", "Character Generation", get_facial_hair_colour()) as color if(new_facial) - facial_hair_colour = new_facial + set_facial_hair_colour(new_facial, skip_update = TRUE) - var/new_hair = input("Please select hair color.", "Character Generation", hair_colour) as color + var/new_hair = input("Please select hair color.", "Character Generation", get_hair_colour()) as color if(new_hair) - hair_colour = new_hair + set_hair_colour(new_hair, skip_update = TRUE) - var/new_eyes = input("Please select eye color.", "Character Generation", eye_colour) as color + var/new_eyes = input("Please select eye color.", "Character Generation", get_eye_colour()) as color if(new_eyes) - eye_colour = new_eyes - update_eyes() + set_eye_colour(new_eyes) var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-skin_tone]") as text @@ -39,11 +38,11 @@ for(var/x in all_hairs) hairs += all_hairs[x] - var/decl/new_style = input("Please select hair style", "Character Generation",h_style) as null|anything in hairs + var/decl/new_style = input("Please select hair style", "Character Generation",get_hairstyle()) as null|anything in hairs // if new style selected (not cancel) if(new_style) - h_style = new_style.type + set_hairstyle(new_style.type, skip_update = TRUE) // facial hair var/list/all_fhairs = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/facial_hair) @@ -52,10 +51,10 @@ for(var/x in all_fhairs) fhairs += all_fhairs[x] - new_style = input("Please select facial style", "Character Generation",f_style) as null|anything in fhairs + new_style = input("Please select facial style", "Character Generation", get_facial_hairstyle()) as null|anything in fhairs if(new_style) - f_style = new_style.type + set_facial_hairstyle(new_style.type, skip_update = TRUE) var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neutral") if (new_gender) @@ -65,7 +64,9 @@ gender = FEMALE else gender = NEUTER - refresh_visible_overlays() + + update_hair() + try_refresh_visible_overlays() check_dna() var/decl/pronouns/G = get_pronouns() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 177e602fb84..607e23fcf0d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -23,18 +23,6 @@ This saves us from having to call add_fingerprint() any time something is put in qdel(W) return null -/mob/living/carbon/human/get_equipped_items(var/include_carried = 0) - . = ..() - for(var/slot in global.equipped_slots) - var/obj/item/thing = get_equipped_item(slot) - if(istype(thing)) - LAZYADD(., thing) - if(include_carried) - for(var/slot in global.carried_slots) - var/obj/item/thing = get_equipped_item(slot) - if(istype(thing)) - LAZYADD(., thing) - //Same as get_covering_equipped_items, but using target zone instead of bodyparts flags /mob/living/carbon/human/proc/get_covering_equipped_item_by_zone(var/zone) var/obj/item/organ/external/O = GET_EXTERNAL_ORGAN(src, zone) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8bff80eb390..5255f7e662b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -3,14 +3,6 @@ //NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! #define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_TIME_CUSHION (10 MINUTES) //approximate time limit to stabilize someone in crit -#define HUMAN_CRIT_HEALTH_CUSHION (config.health_threshold_crit - config.health_threshold_dead) - -//The amount of damage you'll get when in critical condition. We want this to be a HUMAN_CRIT_TIME_CUSHION long deal. -//There are HUMAN_CRIT_HEALTH_CUSHION hp to get through, so (HUMAN_CRIT_HEALTH_CUSHION/HUMAN_CRIT_TIME_CUSHION) per tick. -//Breaths however only happen once every MOB_BREATH_DELAY life ticks. The delay between life ticks is set by the mob process. -#define HUMAN_CRIT_MAX_OXYLOSS ( MOB_BREATH_DELAY * process_schedule_interval("mob") * (HUMAN_CRIT_HEALTH_CUSHION/HUMAN_CRIT_TIME_CUSHION) ) - #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 1000K point @@ -36,36 +28,13 @@ var/pressure_alert = 0 var/stamina = 100 -/mob/living/carbon/human/Life() - set invisibility = 0 - set background = BACKGROUND_ENABLED - - if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) - return - - fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. - - ..() - - if(life_tick%30==15) - hud_updateflag = 1022 - - voice = GetVoice() - - //No need to update all of these procs if the guy is dead. - if(stat != DEAD && !is_in_stasis()) - last_pain = null // Clear the last cached pain value so further getHalloss() calls won't use an old value. - //Organs and blood - handle_organs() - handle_shock() - handle_pain() - handle_stamina() - - if(!handle_some_updates()) - return //We go ahead and process them 5 times for HUD images and other stuff though. - - //Update our name based on whether our face is obscured/disfigured - SetName(get_visible_name()) +/mob/living/carbon/human/handle_living_non_stasis_processes() + last_pain = null // Clear the last cached pain value so further getHalloss() calls won't use an old value. + //Organs and blood + handle_organs() + handle_shock() + handle_pain() + handle_stamina() /mob/living/carbon/human/get_stamina() return stamina @@ -86,7 +55,7 @@ /mob/living/carbon/human/proc/handle_stamina() if((world.time - last_quick_move_time) > 5 SECONDS) var/mod = (lying + (nutrition / get_max_nutrition())) / 2 - adjust_stamina(max(config.minimum_stamina_recovery, config.maximum_stamina_recovery * mod) * (1 + GET_CHEMICAL_EFFECT(src, CE_ENERGETIC))) + adjust_stamina(max(get_config_value(/decl/config/num/movement_max_stamina_recovery), get_config_value(/decl/config/num/movement_min_stamina_recovery) * mod) * (1 + GET_CHEMICAL_EFFECT(src, CE_ENERGETIC))) /mob/living/carbon/human/set_stat(var/new_stat) var/old_stat = stat @@ -144,7 +113,11 @@ return ONE_ATMOSPHERE + pressure_difference /mob/living/carbon/human/handle_impaired_vision() - ..() + + . = ..() + if(!.) + return + //Vision var/obj/item/organ/vision var/decl/bodytype/root_bodytype = get_bodytype() @@ -163,10 +136,9 @@ /mob/living/carbon/human/handle_disabilities() ..() - if(stat != DEAD) - if ((disabilities & COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) - drop_held_items() - cough() + if(stat != DEAD && (disabilities & COUGHING) && prob(5) && GET_STATUS(src, STAT_PARA) <= 1) + drop_held_items() + cough() /mob/living/carbon/human/handle_mutations_and_radiation() if(getFireLoss()) @@ -219,7 +191,7 @@ if(relative_density > 0.02) //don't bother if we are in vacuum or near-vacuum var/loc_temp = environment.temperature - if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < get_temperature_threshold(HEAT_LEVEL_1) && bodytemperature > get_temperature_threshold(COLD_LEVEL_1) && species.body_temperature) + if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < get_mob_temperature_threshold(HEAT_LEVEL_1) && bodytemperature > get_mob_temperature_threshold(COLD_LEVEL_1) && species.body_temperature) pressure_alert = 0 return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp @@ -238,29 +210,29 @@ bodytemperature += clamp(BODYTEMP_COOLING_MAX, temp_adj*relative_density, BODYTEMP_HEATING_MAX) // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. - if(bodytemperature >= get_temperature_threshold(HEAT_LEVEL_1)) + if(bodytemperature >= get_mob_temperature_threshold(HEAT_LEVEL_1)) //Body temperature is too hot. fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode var/burn_dam = 0 - if(bodytemperature < get_temperature_threshold(HEAT_LEVEL_2)) + if(bodytemperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) burn_dam = HEAT_DAMAGE_LEVEL_1 - else if(bodytemperature < get_temperature_threshold(HEAT_LEVEL_3)) + else if(bodytemperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) burn_dam = HEAT_DAMAGE_LEVEL_2 else burn_dam = HEAT_DAMAGE_LEVEL_3 take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature") fire_alert = max(fire_alert, 2) - else if(bodytemperature <= get_temperature_threshold(COLD_LEVEL_1)) + else if(bodytemperature <= get_mob_temperature_threshold(COLD_LEVEL_1)) fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode var/burn_dam = 0 - if(bodytemperature > get_temperature_threshold(COLD_LEVEL_2)) + if(bodytemperature > get_mob_temperature_threshold(COLD_LEVEL_2)) burn_dam = COLD_DAMAGE_LEVEL_1 - else if(bodytemperature > get_temperature_threshold(COLD_LEVEL_3)) + else if(bodytemperature > get_mob_temperature_threshold(COLD_LEVEL_3)) burn_dam = COLD_DAMAGE_LEVEL_2 else burn_dam = COLD_DAMAGE_LEVEL_3 @@ -382,103 +354,85 @@ return TRUE /mob/living/carbon/human/handle_regular_status_updates() - if(!handle_some_updates()) - return 0 - if(status_flags & GODMODE) return 0 + voice = GetVoice() + SetName(get_visible_name()) - //SSD check, if a logged player is awake put them back to sleep! - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_status(STAT_SILENCE, 0) - else //ALIVE. LIGHTS ARE ON - updatehealth() //TODO - - if(hallucination_power) - handle_hallucinations() - - if(get_shock() >= species.total_health) - if(!stat) - to_chat(src, "[species.halloss_message_self]") - src.visible_message("[src] [species.halloss_message]") - SET_STATUS_MAX(src, STAT_PARA, 10) - - if(HAS_STATUS(src, STAT_PARA) ||HAS_STATUS(src, STAT_ASLEEP)) - SET_STATUS_MAX(src, STAT_BLIND, 2) - set_stat(UNCONSCIOUS) - animate_tail_reset() - adjustHalLoss(-3) - - if(prob(2) && is_asystole() && isSynthetic()) - visible_message("[src] [pick("emits low pitched whirr","beeps urgently")].") - //CONSCIOUS - else - set_stat(CONSCIOUS) - - // Check everything else. - - //Periodically double-check embedded_flag - if(embedded_flag && !(life_tick % 10)) - if(!embedded_needs_process()) - embedded_flag = 0 - - //Resting - if(resting) - if(HAS_STATUS(src, STAT_DIZZY)) - ADJ_STATUS(src, STAT_DIZZY, -15) - if(HAS_STATUS(src, STAT_JITTER)) - ADJ_STATUS(src, STAT_JITTER, -15) - adjustHalLoss(-3) - else - if(HAS_STATUS(src, STAT_DIZZY)) - ADJ_STATUS(src, STAT_DIZZY, -3) - if(HAS_STATUS(src, STAT_JITTER)) - ADJ_STATUS(src, STAT_JITTER, -3) - adjustHalLoss(-1) + if(status_flags & GODMODE) + return FALSE - if(HAS_STATUS(src, STAT_DROWSY)) - SET_STATUS_MAX(src, STAT_BLURRY, 2) - var/sleepy = GET_STATUS(src, STAT_DROWSY) - if(sleepy > 10) - var/zzzchance = min(5, 5*sleepy/30) - if((prob(zzzchance) || sleepy >= 60)) - if(stat == CONSCIOUS) - to_chat(src, "You are about to fall asleep...") - SET_STATUS_MAX(src, STAT_ASLEEP, 5) - - // If you're dirty, your gloves will become dirty, too. - var/obj/item/gloves = get_equipped_item(slot_gloves_str) - if(gloves && germ_level > gloves.germ_level && prob(10)) - gloves.germ_level += 1 - - if(vsc.contaminant_control.CONTAMINATION_LOSS) - var/total_contamination= 0 - for(var/obj/item/I in src) - if(I.contaminated) - total_contamination += vsc.contaminant_control.CONTAMINATION_LOSS - adjustToxLoss(total_contamination) - - if(stasis_value > 1 && GET_STATUS(src, STAT_DROWSY) < stasis_value * 4) - ADJ_STATUS(src, STAT_DROWSY, min(stasis_value, 3)) - if(!stat && prob(1)) - to_chat(src, "You feel slow and sluggish...") + if(vsc.contaminant_control.CONTAMINATION_LOSS) + var/total_contamination= 0 + for(var/obj/item/I in src) + if(I.contaminated) + total_contamination += vsc.contaminant_control.CONTAMINATION_LOSS + adjustToxLoss(total_contamination) + + . = ..() + if(!.) + return + + if(get_shock() >= species.total_health) + if(!stat) + to_chat(src, "[species.halloss_message_self]") + src.visible_message("[src] [species.halloss_message]") + SET_STATUS_MAX(src, STAT_PARA, 10) + + if(HAS_STATUS(src, STAT_PARA) || HAS_STATUS(src, STAT_ASLEEP)) + set_stat(UNCONSCIOUS) + animate_tail_reset() + adjustHalLoss(-3) + if(prob(2) && is_asystole() && isSynthetic()) + visible_message("[src] [pick("emits low pitched whirr","beeps urgently")].") + else + set_stat(CONSCIOUS) + + // Check everything else. + //Periodically double-check embedded_flag + if(embedded_flag && !(life_tick % 10)) + if(!embedded_needs_process()) + embedded_flag = 0 + + //Resting + if(resting) + if(HAS_STATUS(src, STAT_DIZZY)) + ADJ_STATUS(src, STAT_DIZZY, -15) + if(HAS_STATUS(src, STAT_JITTER)) + ADJ_STATUS(src, STAT_JITTER, -15) + adjustHalLoss(-3) + else + if(HAS_STATUS(src, STAT_DIZZY)) + ADJ_STATUS(src, STAT_DIZZY, -3) + if(HAS_STATUS(src, STAT_JITTER)) + ADJ_STATUS(src, STAT_JITTER, -3) + adjustHalLoss(-1) + + if(HAS_STATUS(src, STAT_DROWSY)) + SET_STATUS_MAX(src, STAT_BLURRY, 2) + var/sleepy = GET_STATUS(src, STAT_DROWSY) + if(sleepy > 10) + var/zzzchance = min(5, 5*sleepy/30) + if((prob(zzzchance) || sleepy >= 60)) + if(stat == CONSCIOUS) + to_chat(src, SPAN_NOTICE("You are about to fall asleep...")) + SET_STATUS_MAX(src, STAT_ASLEEP, 5) - return 1 /mob/living/carbon/human/handle_regular_hud_updates() + fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. + if(life_tick%30==15) + hud_updateflag = 1022 if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head handle_hud_list() - - // now handle what we see on our screen - - if(!..()) + . = ..() + if(!.) return - if(stat != DEAD) - if(stat == UNCONSCIOUS && health < maxHealth/2) + var/half_health = get_max_health()/2 + if(stat == UNCONSCIOUS && current_health < half_health) //Critical damage passage overlay var/severity = 0 - switch(health - maxHealth/2) + switch(current_health - half_health) if(-20 to -10) severity = 1 if(-30 to -20) severity = 2 if(-40 to -30) severity = 3 @@ -608,8 +562,8 @@ if(260 to 280) bodytemp.icon_state = "temp-3" else bodytemp.icon_state = "temp-4" else - var/heat_1 = get_temperature_threshold(HEAT_LEVEL_1) - var/cold_1 = get_temperature_threshold(COLD_LEVEL_1) + var/heat_1 = get_mob_temperature_threshold(HEAT_LEVEL_1) + var/cold_1 = get_mob_temperature_threshold(COLD_LEVEL_1) //TODO: precalculate all of this stuff when the species datum is created var/base_temperature = species.body_temperature if(base_temperature == null) //some species don't have a set metabolic temperature @@ -683,7 +637,7 @@ var/stress_modifier = get_stress_modifier() if(stress_modifier) - stress_modifier *= config.stress_shock_recovery_constant + stress_modifier *= get_config_value(/decl/config/num/health_stress_shock_recovery_constant) if(is_asystole()) shock_stage = max(shock_stage + (BASE_SHOCK_RECOVERY + stress_modifier), 61) @@ -881,12 +835,12 @@ if(species) - if(burn_temperature < get_temperature_threshold(HEAT_LEVEL_2)) + if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) species_heat_mod = 0.5 - else if(burn_temperature < get_temperature_threshold(HEAT_LEVEL_3)) + else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) species_heat_mod = 0.75 - burn_temperature -= get_temperature_threshold(HEAT_LEVEL_1) + burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) if(burn_temperature < 1) return diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 0fe1aa2547e..58f39cb763c 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -2,41 +2,46 @@ real_name = "Pun Pun" gender = MALE -/mob/living/carbon/human/monkey/punpun/Initialize() - . = ..() - var/obj/item/clothing/C +/mob/living/carbon/human/monkey/punpun/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + ..() + return INITIALIZE_HINT_LATELOAD + +/mob/living/carbon/human/monkey/punpun/LateInitialize() + ..() if(prob(50)) - C = new /obj/item/clothing/under/waiter/monke(src) - equip_to_appropriate_slot(C) + equip_to_appropriate_slot(new /obj/item/clothing/under/waiter/monke(src)) else - C = new /obj/item/clothing/pants/casual/mustangjeans/monke(src) - C.attach_accessory(null, new/obj/item/clothing/accessory/toggleable/hawaii/random(src)) + var/obj/item/clothing/C = new /obj/item/clothing/pants/casual/mustangjeans/monke(src) + C.attach_accessory(null, new /obj/item/clothing/accessory/toggleable/hawaii/random(src)) equip_to_appropriate_slot(C) if(prob(10)) - C = new/obj/item/clothing/head/collectable/petehat(src) - equip_to_appropriate_slot(C) + equip_to_appropriate_slot(new /obj/item/clothing/head/collectable/petehat(src)) /decl/hierarchy/outfit/blank_subject name = "Test Subject" - uniform = /obj/item/clothing/under/color/white + uniform = /obj/item/clothing/under/color/white/blank shoes = /obj/item/clothing/shoes/color/white head = /obj/item/clothing/head/helmet/facecover mask = /obj/item/clothing/mask/muzzle suit = /obj/item/clothing/suit/straight_jacket -/decl/hierarchy/outfit/blank_subject/post_equip(mob/living/carbon/human/H) +/obj/item/clothing/under/color/white/blank/Initialize() + . = ..() + var/obj/item/clothing/accessory/vitals_sensor/sensor = new(src) + sensor.set_sensors_locked(TRUE) + sensor.set_sensor_mode(VITALS_SENSOR_OFF) + attach_accessory(null, sensor) + +/mob/living/carbon/human/blank/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + species_name = SPECIES_HUMAN ..() - var/obj/item/clothing/under/color/white/C = locate() in H - if(C) - C.has_sensor = SUIT_LOCKED_SENSORS - C.sensor_mode = SUIT_SENSOR_OFF + return INITIALIZE_HINT_LATELOAD -/mob/living/carbon/human/blank/Initialize(mapload) - . = ..(mapload, SPECIES_HUMAN) +/mob/living/carbon/human/blank/LateInitialize() var/number = "[pick(global.greek_letters)]-[rand(1,30)]" fully_replace_character_name("Subject [number]") var/decl/hierarchy/outfit/outfit = outfit_by_type(/decl/hierarchy/outfit/blank_subject) - outfit.equip(src) + outfit.equip_outfit(src) var/obj/item/clothing/head/helmet/facecover/F = locate() in src if(F) F.SetName("[F.name] ([number])") diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 9d8eba76351..e693d21e906 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -68,7 +68,7 @@ var/global/list/sparring_attack_cache = list() . = soft_variant /decl/natural_attack/proc/get_sparring_variant() - return sparring_variant_type && GET_DECL(sparring_variant_type) + return GET_DECL(sparring_variant_type) /decl/natural_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/target, var/zone) if(!user.restrained() && !user.incapacitated()) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ed09b8ebdbe..abd8a1a3b67 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -13,8 +13,9 @@ var/global/list/_limb_mask_cache = list() TODO: Proper documentation icon_key is [bodytype.get_icon_cache_uid(src)][g][husk][skin_tone] */ -var/global/list/human_icon_cache = list() -var/global/list/tail_icon_cache = list() //key is [bodytype.get_icon_cache_uid(src)][skin_colour] +var/global/list/human_icon_cache = list() +var/global/list/eye_icon_cache = list() +var/global/list/tail_icon_cache = list() //key is [bodytype.get_icon_cache_uid(src)][skin_colour] var/global/list/light_overlay_cache = list() /proc/overlay_image(icon,icon_state,color,flags) @@ -65,7 +66,7 @@ There are several things that need to be remembered: > There are also these special cases: update_mutations() //handles updating your appearance for certain mutations. e.g TK head-glows - UpdateDamageIcon() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) + update_damage_icon() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) update_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and ...eyes were merged into update_body) @@ -83,7 +84,7 @@ There are several things that need to be remembered: update_inhand_overlays(FALSE) update_icon() -> If you need to update all overlays you can use refresh_visible_overlays(). it works exactly like update_clothing used to. +> If you need to update all overlays you can use try_refresh_visible_overlays(). it works exactly like update_clothing used to. > I reimplimented an old unused variable which was in the code called (coincidentally) var/update_icon It can be used as another method of triggering update_icon(). It's basically a flag that when set to non-zero @@ -100,34 +101,9 @@ Please contact me on #coderbus IRC. ~Carn x */ /mob/living/carbon/human - var/list/mob_overlays[TOTAL_OVER_LAYERS] - var/list/mob_underlays[TOTAL_UNDER_LAYERS] var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed -/mob/living/carbon/human/get_all_current_mob_overlays() - return mob_overlays - -/mob/living/carbon/human/set_current_mob_overlay(var/overlay_layer, var/image/overlay, var/redraw_mob = TRUE) - mob_overlays[overlay_layer] = overlay - ..() - -/mob/living/carbon/human/get_current_mob_overlay(var/overlay_layer) - return mob_overlays[overlay_layer] - -/mob/living/carbon/human/get_all_current_mob_underlays() - return mob_underlays - -/mob/living/carbon/human/set_current_mob_underlay(var/underlay_layer, var/image/underlay, var/redraw_mob = TRUE) - mob_underlays[underlay_layer] = underlay - ..() - -/mob/living/carbon/human/get_current_mob_underlay(var/underlay_layer) - return mob_underlays[underlay_layer] - /mob/living/carbon/human/refresh_visible_overlays() - . = ..() - if(!.) - return update_mutations(FALSE) update_body(FALSE) update_skin(FALSE) @@ -137,19 +113,15 @@ Please contact me on #coderbus IRC. ~Carn x update_fire(FALSE) update_surgery(FALSE) update_bandages(FALSE) - UpdateDamageIcon(FALSE) - update_icon() - return TRUE + update_damage_icon(FALSE) + return ..() /mob/living/carbon/human/on_update_icon() - - ..() - if(regenerate_body_icon) regenerate_body_icon = FALSE - update_body(FALSE) - refresh_visible_overlays() + ..() +/mob/living/carbon/human/apply_visible_overlays() var/list/visible_overlays var/list/visible_underlays if(is_cloaked()) @@ -190,12 +162,6 @@ Please contact me on #coderbus IRC. ~Carn x underlay.transform = M underlays = visible_underlays - var/obj/item/organ/external/head/head = get_organ(BP_HEAD, /obj/item/organ/external/head) - if(head) - var/image/I = head.get_eye_overlay() - if(I) - add_overlay(I) - /mob/living/carbon/human/proc/get_icon_scale_mult() // If you want stuff like scaling based on species or something, here is a good spot to mix the numbers together. return list(icon_scale_x, icon_scale_y) @@ -243,7 +209,7 @@ var/global/list/damage_icon_parts = list() //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists -/mob/living/carbon/human/UpdateDamageIcon(var/update_icons=1) +/mob/living/carbon/human/update_damage_icon(var/update_icons=1) // first check whether something actually changed about damage appearance var/damage_appearance = "" @@ -290,63 +256,35 @@ var/global/list/damage_icon_parts = list() LAZYADD(bandage_overlays, image(bandage_icon, "[O.icon_state][bandage_level]")) set_current_mob_overlay(HO_DAMAGE_LAYER, bandage_overlays, update_icons) +/mob/living/carbon/human/proc/get_human_icon_cache_key() + . = list() + for(var/limb_tag in global.all_limb_tags) + . += "[limb_tag]_" + var/obj/item/organ/external/part = GET_EXTERNAL_ORGAN(src, limb_tag) + if(isnull(part) || part.skip_body_icon_draw) + . += "skip" + continue + part.update_icon() // This wil regenerate their icon if needed, and more importantly set their cache key. + . += part._icon_cache_key + . += "husked_[!!is_husked()]" + . = JOINTEXT(.) + //BASE MOB SPRITE -/mob/living/carbon/human/update_body(var/update_icons=1) +/mob/living/carbon/human/update_body(var/update_icons = TRUE) var/list/limbs = get_external_organs() if(!LAZYLEN(limbs)) return // Something is trying to update our body pre-init (probably loading a preview image during world startup). - var/husk_color_mod = rgb(96,88,80) - var/husk = is_husked() - - //CACHING: Generate an index key from visible bodyparts. - //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. - - //Create a new, blank icon for our mob to use. - if(stand_icon) - qdel(stand_icon) var/decl/bodytype/root_bodytype = get_bodytype() - stand_icon = new(root_bodytype.icon_template || 'icons/mob/human.dmi',"blank") - - var/icon_key = "[root_bodytype.get_icon_cache_uid(src)][skin_tone][skin_colour]" - if(lip_style) - icon_key += "[lip_style]" - else - icon_key += "nolips" - var/obj/item/organ/internal/eyes/eyes = get_organ((root_bodytype.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) - icon_key += istype(eyes) ? eyes.eye_colour : COLOR_BLACK + var/icon_key = get_human_icon_cache_key() - for(var/limb_tag in global.all_limb_tags) - var/obj/item/organ/external/part = GET_EXTERNAL_ORGAN(src, limb_tag) - if(isnull(part) || part.skip_body_icon_draw) - icon_key += "0" - continue - for(var/M in part.markings) - icon_key += "[M][part.markings[M]]" - if(part) - icon_key += "[part.bodytype.get_icon_cache_uid(part.owner)][part.render_alpha]" - icon_key += "[part.skin_tone]" - if(part.skin_colour) - icon_key += "[part.skin_colour]" - icon_key += "[part.skin_blend]" - for(var/M in part.markings) - icon_key += "[M][part.markings[M]]" - if(!BP_IS_PROSTHETIC(part) && (part.status & ORGAN_DEAD)) - icon_key += "2" - else - icon_key += "1" - - icon_key = "[icon_key][husk ? 1 : 0]" - - var/icon/base_icon - if(human_icon_cache[icon_key]) - base_icon = human_icon_cache[icon_key] - else + stand_icon = global.human_icon_cache[icon_key] + if(!stand_icon) //BEGIN CACHED ICON GENERATION. - base_icon = icon(root_bodytype.icon_template) + stand_icon = new(root_bodytype.icon_template || 'icons/mob/human.dmi', "blank") for(var/obj/item/organ/external/part in limbs) - var/icon/temp = part.get_icon() + var/icon/temp = part.icon // Grabbing the icon excludes overlays. //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position & (LEFT | RIGHT)) @@ -357,34 +295,28 @@ var/global/list/damage_icon_parts = list() temp2.Insert(new /icon(temp,dir=EAST),dir=EAST) if(!(part.icon_position & RIGHT)) temp2.Insert(new /icon(temp,dir=WEST),dir=WEST) - base_icon.Blend(temp2, ICON_OVERLAY) + stand_icon.Blend(temp2, ICON_OVERLAY) if(part.icon_position & LEFT) temp2.Insert(new /icon(temp,dir=EAST),dir=EAST) if(part.icon_position & RIGHT) temp2.Insert(new /icon(temp,dir=WEST),dir=WEST) - base_icon.Blend(temp2, ICON_UNDERLAY) + stand_icon.Blend(temp2, ICON_UNDERLAY) else if(part.icon_position & UNDER) - base_icon.Blend(temp, ICON_UNDERLAY) + stand_icon.Blend(temp, ICON_UNDERLAY) else - base_icon.Blend(temp, ICON_OVERLAY) - - if(husk) - base_icon.ColorTone(husk_color_mod) - + stand_icon.Blend(temp, ICON_OVERLAY) //Handle husk overlay. - if(husk) + if(is_husked()) var/husk_icon = root_bodytype.get_husk_icon(src) if(husk_icon) - var/icon/mask = new(base_icon) + var/icon/mask = new(stand_icon) var/icon/husk_over = new(husk_icon, "") mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) husk_over.Blend(mask, ICON_ADD) - base_icon.Blend(husk_over, ICON_OVERLAY) - - human_icon_cache[icon_key] = base_icon - - //END CACHED ICON GENERATION. - stand_icon.Blend(base_icon,ICON_OVERLAY) + stand_icon.Blend(husk_over, ICON_OVERLAY) + else + stand_icon.ColorTone("#605850") + global.human_icon_cache[icon_key] = stand_icon //tail update_tail_showing(0) @@ -395,24 +327,30 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/update_underwear(var/update_icons=1) var/list/undies = list() for(var/entry in worn_underwear) + var/obj/item/underwear/UW = entry - if (!UW || !UW.icon) // Avoid runtimes for nude underwear types + if (!UW?.icon) // Avoid runtimes for nude underwear types continue - var/image/I + var/decl/bodytype/root_bodytype = get_bodytype() + if(!root_bodytype) + continue // Avoid runtimes for dummy mobs with no bodytype set + + var/image/I if(UW.slot_offset_str && LAZYACCESS(root_bodytype.equip_adjust, UW.slot_offset_str)) - I = root_bodytype.get_offset_overlay_image(FALSE, UW.icon, UW.icon_state, UW.color, UW.slot_offset_str) + I = root_bodytype.get_offset_overlay_image(UW.icon, UW.icon_state, UW.color, UW.slot_offset_str) else I = image(icon = UW.icon, icon_state = UW.icon_state) I.color = UW.color - I.appearance_flags |= RESET_COLOR - undies += I + if(I) // get_offset_overlay_image() may potentially return null + I.appearance_flags |= RESET_COLOR + undies += I set_current_mob_overlay(HO_UNDERWEAR_LAYER, undies, update_icons) /mob/living/carbon/human/update_hair(var/update_icons=1) var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD, /obj/item/organ/external/head) + set_current_mob_overlay(HO_HAIR_LAYER, (istype(head_organ) ? head_organ.get_mob_overlays() : null), update_icons) - set_current_mob_overlay(HO_HAIR_LAYER, (istype(head_organ) ? head_organ.get_hair_icon() : null), update_icons) /mob/living/carbon/human/proc/update_skin(var/update_icons=1) // todo: make this use bodytype set_current_mob_overlay(HO_SKIN_LAYER, species.update_skin(src), update_icons) @@ -460,8 +398,8 @@ var/global/list/damage_icon_parts = list() set_current_mob_overlay(HO_TAIL_LAYER, null, FALSE) set_current_mob_underlay(HU_TAIL_LAYER, null, update_icons) - var/icon/tail_s = get_tail_icon(tail_organ) - var/tail_image = image(tail_s, icon_state = "[tail_state]_s") + var/icon/tail_s = get_tail_icon_for_organ(tail_organ) + var/tail_image = image(tail_s, icon_state = tail_state) animate_tail_reset(0) if(dir == NORTH) set_current_mob_underlay(HU_TAIL_LAYER, null, FALSE) @@ -470,26 +408,40 @@ var/global/list/damage_icon_parts = list() set_current_mob_overlay(HO_TAIL_LAYER, null, FALSE) set_current_mob_underlay(HU_TAIL_LAYER, tail_image, update_icons) -/mob/living/carbon/human/proc/get_tail_icon(var/obj/item/organ/external/tail/tail_organ) +/mob/living/carbon/human/proc/get_tail_icon_for_organ(var/obj/item/organ/external/tail/tail_organ) if(!istype(tail_organ)) return - var/icon_key = "[tail_organ.get_tail()]\ref[tail_organ.icon][tail_organ.get_tail_blend(src)][tail_organ.bodytype.appearance_flags & HAS_SKIN_COLOR][skin_colour][tail_organ.get_tail_hair()][tail_organ.get_tail_hair_blend()][hair_colour]" - var/icon/tail_icon = tail_icon_cache[icon_key] - if(!tail_icon) + + var/tail_state = tail_organ.get_tail() + var/tail_icon = tail_organ.get_tail_icon() + if(!tail_state || !tail_icon) + return // No tail data! + + // These values may be null and are generally optional. + var/hair_colour = get_hair_colour() + var/skin_colour = get_skin_colour() + var/tail_hair = tail_organ.get_tail_hair() + var/tail_blend = tail_organ.get_tail_blend() + var/tail_hair_blend = tail_organ.get_tail_hair_blend() + var/tail_color = (tail_organ.bodytype.appearance_flags & HAS_SKIN_COLOR) ? skin_colour : null + + var/icon_key = "[tail_state][tail_icon][tail_blend][tail_color][tail_hair][tail_hair_blend][hair_colour]" + var/icon/blended_tail_icon = global.tail_icon_cache[icon_key] + if(!blended_tail_icon) //generate a new one - var/tail_anim = tail_organ.get_tail_animation() || tail_organ.get_tail_icon() - tail_icon = new/icon(tail_anim) - if(tail_organ.bodytype.appearance_flags & HAS_SKIN_COLOR) - tail_icon.Blend(skin_colour, tail_organ.get_tail_blend(src)) + blended_tail_icon = icon(tail_icon, tail_state) + if(skin_colour && !isnull(tail_blend)) // 0 is a valid blend mode + blended_tail_icon.Blend(skin_colour, tail_blend) // The following will not work with animated tails. - var/use_tail = tail_organ.get_tail_hair() - if(use_tail) - var/icon/hair_icon = icon(tail_organ.get_tail_icon(src), "[tail_organ.get_tail()]_[use_tail]") - hair_icon.Blend(hair_colour, tail_organ.get_tail_hair_blend()) - tail_icon.Blend(hair_icon, ICON_OVERLAY) - tail_icon_cache[icon_key] = tail_icon - - return tail_icon + if(tail_hair) + var/tail_hair_state = "[tail_state]_[tail_hair]" + if(check_state_in_icon(tail_hair_state, tail_icon)) + var/icon/hair_icon = icon(tail_icon, tail_hair_state) + if(hair_colour && !isnull(tail_hair_blend)) // 0 is a valid blend mode + hair_icon.Blend(hair_colour, tail_hair_blend) + blended_tail_icon.Blend(hair_icon, ICON_OVERLAY) + global.tail_icon_cache[icon_key] = blended_tail_icon + return blended_tail_icon /mob/living/set_dir() . = ..() @@ -499,14 +451,13 @@ var/global/list/damage_icon_parts = list() update_tail_showing() /mob/living/carbon/human/proc/set_tail_state(var/t_state) - var/image/tail_overlay = get_current_tail_image() var/obj/item/organ/external/tail/tail_organ = get_organ(BP_TAIL, /obj/item/organ/external/tail) if(!tail_organ) return null - - if(tail_overlay && tail_organ.get_tail_animation()) + var/image/tail_overlay = get_current_tail_image() + if(tail_overlay && check_state_in_icon(tail_overlay.icon, t_state)) tail_overlay.icon_state = t_state - return tail_overlay + return tail_overlay //Not really once, since BYOND can't do that. //Update this if the ability to flick() images or make looping animation start at the first frame is ever added. diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm deleted file mode 100644 index ff3b7588e00..00000000000 --- a/code/modules/mob/living/carbon/life.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/carbon/Life() - if(!..()) - return - - // Increase germ_level regularly - if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level - germ_level++ - - if(stat != DEAD && !is_in_stasis()) - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Random events (vomiting etc) - handle_random_events() - - // eye, ear, brain damages - handle_disabilities() - - . = 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm index be5741d61b1..643fe0fbf3c 100644 --- a/code/modules/mob/living/carbon/taste.dm +++ b/code/modules/mob/living/carbon/taste.dm @@ -92,6 +92,3 @@ calculate text size per text. out += "[intensity_desc] [taste_desc]" return english_list(out, "something indescribable") - -/mob/living/carbon/proc/get_fullness() - return nutrition + (REAGENT_VOLUME(reagents, /decl/material/liquid/nutriment) * 25) \ No newline at end of file diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index f3ad31eec72..1b1257a75d2 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -27,7 +27,7 @@ adjustBruteLoss(damage) if(BURN) if(MUTATION_COLD_RESISTANCE in mutations) - damage = 0 + return adjustFireLoss(damage) if(TOX) adjustToxLoss(damage) @@ -41,8 +41,6 @@ electrocute_act(damage, used_weapon, 1, def_zone) if(IRRADIATE) apply_radiation(damage) - - updatehealth() return TRUE @@ -64,7 +62,6 @@ /mob/living/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) if(!effect || (blocked >= 100)) return FALSE - switch(effecttype) if(STUN) SET_STATUS_MAX(src, STAT_STUN, effect * blocked_mult(blocked)) @@ -81,7 +78,6 @@ SET_STATUS_MAX(src, STAT_BLURRY, effect * blocked_mult(blocked)) if(DROWSY) SET_STATUS_MAX(src, STAT_DROWSY, effect * blocked_mult(blocked)) - updatehealth() return TRUE /mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0) diff --git a/code/modules/mob/living/deity/deity.dm b/code/modules/mob/living/deity/deity.dm index f3a5f2ff9dd..be98a7e030a 100644 --- a/code/modules/mob/living/deity/deity.dm +++ b/code/modules/mob/living/deity/deity.dm @@ -5,8 +5,7 @@ icon_state = "egg" pixel_x = -128 pixel_y = -128 - health = 100 - maxHealth = 100 //I dunno what to do with health at this point. + mob_default_max_health = 100 universal_understand = TRUE mob_sort_value = 5 @@ -52,14 +51,34 @@ return STATUS_INTERACTIVE /mob/living/deity/Destroy() + + for(var/phenom in phenomenas) + remove_phenomena(phenom) + + if(length(items_by_category)) + for(var/cat in items_by_category) + var/list/L = items_by_category[cat] + L.Cut() + items_by_category.Cut() + + if(length(items)) + for(var/i in items) + qdel(items[i]) + items.Cut() + death(0) - minions.Cut() - structures.Cut() - eyeobj.release() + if(length(minions)) + minions.Cut() + if(length(structures)) + structures.Cut() + if(eyeobj) + eyeobj.release() + QDEL_NULL(eyeobj) QDEL_NULL(eyenet) //We do it here as some mobs have eyes that have access to the visualnet and we only want to destroy it when the deity is destroyed - QDEL_NULL(eyeobj) + QDEL_NULL(form) + return ..() /mob/living/deity/verb/return_to_plane() diff --git a/code/modules/mob/living/deity/deity_items.dm b/code/modules/mob/living/deity/deity_items.dm index 9245a8dbbd0..3dfa6e4dc64 100644 --- a/code/modules/mob/living/deity/deity_items.dm +++ b/code/modules/mob/living/deity/deity_items.dm @@ -31,14 +31,3 @@ if(items[name]) var/datum/deity_item/di = items[name] . = di.level - - -/mob/living/deity/Destroy() - for(var/cat in items_by_category) - var/list/L = items_by_category[cat] - L.Cut() - items_by_category.Cut() - for(var/i in items) - qdel(items[i]) - items.Cut() - . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/deity/deity_phenomena.dm b/code/modules/mob/living/deity/deity_phenomena.dm index 02533e6186c..0ca6dd7514b 100644 --- a/code/modules/mob/living/deity/deity_phenomena.dm +++ b/code/modules/mob/living/deity/deity_phenomena.dm @@ -18,31 +18,28 @@ /mob/living/deity/proc/silence(var/amount) if(!silenced) to_chat(src, "You've been silenced! Your phenomenas are disabled!") - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.color = "#ff0000" + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.color = "#ff0000" silenced += amount for(var/phenom in phenomenas) //Also make it so that you don't do cooldowns. var/datum/phenomena/P = phenomenas[phenom] if(P.refresh_time) P.refresh_time += amount -/mob/living/deity/Life() +/mob/living/deity/handle_regular_status_updates() . = ..() if(.) if(silenced > 0) silenced-- if(!silenced) to_chat(src, "You are no longer silenced.") - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.color = null + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.color = null if(power_per_regen < 0 || power < power_min) adjust_power(power_per_regen) -/mob/living/deity/Destroy() - for(var/phenom in phenomenas) - remove_phenomena(phenom) - return ..() - /mob/living/deity/proc/add_phenomena(var/type) if(!phenomenas) phenomenas = list() @@ -67,8 +64,9 @@ for(var/mod in intent_list) if(intent_list[mod] == P) intent_list[mod] = null - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.update_text() + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.update_text() update_phenomenas() update_phenomena_bindings() if(selected == to_remove) diff --git a/code/modules/mob/living/deity/deity_sources.dm b/code/modules/mob/living/deity/deity_sources.dm index 181957044cb..4c479cff036 100644 --- a/code/modules/mob/living/deity/deity_sources.dm +++ b/code/modules/mob/living/deity/deity_sources.dm @@ -10,8 +10,8 @@ if(form) L.faction = form.faction update_followers() - events_repository.register(/decl/observ/destroyed, L,src, .proc/dead_follower) - events_repository.register(/decl/observ/death, L,src, .proc/update_followers) + events_repository.register(/decl/observ/destroyed, L,src, PROC_REF(dead_follower)) + events_repository.register(/decl/observ/death, L,src, PROC_REF(update_followers)) /mob/living/deity/proc/dead_follower(var/mob/living/L) events_repository.unregister(/decl/observ/death, L,src) diff --git a/code/modules/mob/living/deity/deity_tracking.dm b/code/modules/mob/living/deity/deity_tracking.dm index 0ac0cd7ba75..0b8de46e9f4 100644 --- a/code/modules/mob/living/deity/deity_tracking.dm +++ b/code/modules/mob/living/deity/deity_tracking.dm @@ -25,9 +25,9 @@ eyeobj.setLoc(get_turf(L)) to_chat(src, "You begin to follow \the [L].") following = L - events_repository.register(/decl/observ/moved, L, src, /mob/living/deity/proc/keep_following) - events_repository.register(/decl/observ/destroyed, L, src, /mob/living/deity/proc/stop_follow) - events_repository.register(/decl/observ/death, L, src, /mob/living/deity/proc/stop_follow) + events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/mob/living/deity, keep_following)) + events_repository.register(/decl/observ/destroyed, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) + events_repository.register(/decl/observ/death, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) /mob/living/deity/proc/stop_follow() events_repository.unregister(/decl/observ/moved, following, src) diff --git a/code/modules/mob/living/deity/menu/deity_nano.dm b/code/modules/mob/living/deity/menu/deity_nano.dm index 63053cac5ed..046276fcffe 100644 --- a/code/modules/mob/living/deity/menu/deity_nano.dm +++ b/code/modules/mob/living/deity/menu/deity_nano.dm @@ -76,5 +76,6 @@ phenomena_bindings[++phenomena_bindings.len] = list("intent" = intent, "intent_data" = intent_data) nano_data["bindings"] = phenomena_bindings //Update the hud as well. - var/obj/screen/intent/deity/SD = hud_used.action_intent - SD.update_text() \ No newline at end of file + var/obj/screen/intent/deity/SD = hud_used?.action_intent + if(istype(SD)) + SD.update_text() \ No newline at end of file diff --git a/code/modules/mob/living/deity/phenomena/communication.dm b/code/modules/mob/living/deity/phenomena/communication.dm index 72876f3f9e9..9a76f59dba8 100644 --- a/code/modules/mob/living/deity/phenomena/communication.dm +++ b/code/modules/mob/living/deity/phenomena/communication.dm @@ -37,7 +37,7 @@ if((M in view) && M.client) to_chat(M, "Your attention is eerily drawn to \the [a].") M.client.images += arrow - events_repository.register(/decl/observ/logged_out, M, src, /datum/phenomena/point/proc/remove_image) + events_repository.register(/decl/observ/logged_out, M, src, TYPE_PROC_REF(/datum/phenomena/point, remove_image)) spawn(20) if(M.client) remove_image(M) diff --git a/code/modules/mob/living/deity/phenomena/conjuration.dm b/code/modules/mob/living/deity/phenomena/conjuration.dm index 86f717641fa..ac0f27c6075 100644 --- a/code/modules/mob/living/deity/phenomena/conjuration.dm +++ b/code/modules/mob/living/deity/phenomena/conjuration.dm @@ -27,7 +27,7 @@ var/obj/effect/portal/P = new(get_turf(a), null, 0) P.failchance = 0 portals += P - events_repository.register(/decl/observ/destroyed, P,src,/datum/phenomena/portals/proc/remove_portal) + events_repository.register(/decl/observ/destroyed, P,src, TYPE_PROC_REF(/datum/phenomena/portals, remove_portal)) if(portals.len > 2) var/removed = portals[1] remove_portal(removed) @@ -59,7 +59,7 @@ L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) to_chat(L, "Something hard hits you!") - if(L.health < L.maxHealth/2) //If it reduces past 50% + if(L.current_health < L.get_max_health()/2) //If it reduces past 50% var/obj/effect/rift/R = new(get_turf(L)) L.visible_message("\The [L] is quickly sucked into \a [R]!") L.forceMove(R) @@ -71,7 +71,6 @@ desc = "a tear in space and time." icon = 'icons/obj/wizard.dmi' icon_state = "rift" - unacidable = 1 anchored = TRUE density = FALSE diff --git a/code/modules/mob/living/deity/phenomena/generic.dm b/code/modules/mob/living/deity/phenomena/generic.dm index 33b53f57bf5..633cd96eb7f 100644 --- a/code/modules/mob/living/deity/phenomena/generic.dm +++ b/code/modules/mob/living/deity/phenomena/generic.dm @@ -18,7 +18,7 @@ if(object_to_move) events_repository.unregister(/decl/observ/destroyed, object_to_move,src) object_to_move = new object_type() - events_repository.register(/decl/observ/destroyed, object_to_move, src, .proc/add_object) + events_repository.register(/decl/observ/destroyed, object_to_move, src, PROC_REF(add_object)) /datum/phenomena/movable_object/activate(var/atom/a, var/mob/living/deity/user) ..() diff --git a/code/modules/mob/living/deity/phenomena/starlight.dm b/code/modules/mob/living/deity/phenomena/starlight.dm index 6a8a98f1990..762cb18d549 100644 --- a/code/modules/mob/living/deity/phenomena/starlight.dm +++ b/code/modules/mob/living/deity/phenomena/starlight.dm @@ -139,8 +139,8 @@ to_chat(L, "[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"") linked.eyenet.add_source(L) - events_repository.register(/decl/observ/destroyed, L, src, .proc/deactivate_look) - addtimer(CALLBACK(src, .proc/deactivate_look, L), 30 SECONDS) + events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) + addtimer(CALLBACK(src, PROC_REF(deactivate_look), L), 30 SECONDS) /datum/phenomena/flickering_whisper/proc/deactivate_look(var/mob/viewer) if(!linked.is_follower(viewer)) //Don't remove if they are follower @@ -198,8 +198,8 @@ SET_STATUS_MAX(L, STAT_WEAK, 1) new /obj/aura/starborn(L) L.status_flags |= GODMODE - events_repository.register(/decl/observ/destroyed, L,src,.proc/fail_ritual) - addtimer(CALLBACK(src, .proc/succeed_ritual, L), 600 SECONDS) //6 minutes + events_repository.register(/decl/observ/destroyed, L,src,PROC_REF(fail_ritual)) + addtimer(CALLBACK(src, PROC_REF(succeed_ritual), L), 600 SECONDS) //6 minutes for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') if(player?.mind?.assigned_job?.is_holy) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index bf5d487d5bc..1c102bb0552 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -2,21 +2,30 @@ var/_held_item_slot_selected var/list/_held_item_slots var/list/_inventory_slots + var/list/_inventory_slot_priority var/pending_hand_rebuild /mob/living/get_inventory_slots() return _inventory_slots +/mob/living/get_inventory_slot_priorities() + if(!_inventory_slot_priority) + _inventory_slot_priority = list() + var/list/all_slots = list() + for(var/slot in get_inventory_slots()) + all_slots += get_inventory_slot_datum(slot) + for(var/datum/inventory_slot/inv_slot as anything in sortTim(all_slots, /proc/cmp_inventory_slot_desc)) + _inventory_slot_priority += inv_slot.slot_id + return _inventory_slot_priority + /mob/living/get_inventory_slot_datum(var/slot) return LAZYACCESS(_inventory_slots, slot) /mob/living/get_held_item_slots() return _held_item_slots -// Temporary proc, replace when the main inventory rewrite goes in. -/mob/living/get_all_valid_equipment_slots() - for(var/slot in get_held_item_slots()) - LAZYDISTINCTADD(., slot) +/mob/living/get_all_available_equipment_slots() + . = ..() var/decl/species/my_species = get_species() for(var/slot in my_species?.hud?.equip_slots) LAZYDISTINCTADD(., slot) @@ -30,17 +39,17 @@ qdel(existing_slot) LAZYDISTINCTADD(_held_item_slots, held_slot.slot_id) add_inventory_slot(held_slot) - if(!get_active_hand()) + if(!get_active_held_item_slot()) select_held_item_slot(held_slot.slot_id) queue_hand_rebuild() /mob/living/remove_held_item_slot(var/slot) var/datum/inventory_slot/inv_slot = istype(slot, /datum/inventory_slot) ? slot : get_inventory_slot_datum(slot) if(inv_slot) - LAZYREMOVE(_held_item_slots, slot) + LAZYREMOVE(_held_item_slots, inv_slot.slot_id) remove_inventory_slot(inv_slot) var/held_slots = get_held_item_slots() - if(get_active_held_item_slot() == slot && length(held_slots)) + if(!get_active_held_item_slot() && length(held_slots)) select_held_item_slot(held_slots[1]) queue_hand_rebuild() @@ -115,6 +124,7 @@ /mob/living/set_inventory_slots(var/list/new_slots) var/list/old_slots = _inventory_slots + _inventory_slot_priority = null _inventory_slots = null // Keep held item slots. @@ -147,16 +157,18 @@ qdel(old_slot) /mob/living/add_inventory_slot(var/datum/inventory_slot/inv_slot) + _inventory_slot_priority = null LAZYSET(_inventory_slots, inv_slot.slot_id, inv_slot) /mob/living/remove_inventory_slot(var/slot) + _inventory_slot_priority = null var/datum/inventory_slot/inv_slot = istype(slot, /datum/inventory_slot) ? slot : LAZYACCESS(_inventory_slots, slot) if(inv_slot) var/held = inv_slot.get_equipped_item() if(held) drop_from_inventory(held) qdel(inv_slot) - LAZYREMOVE(_inventory_slots, slot) + LAZYREMOVE(_inventory_slots, inv_slot.slot_id) /mob/living/proc/get_jetpack() var/obj/item/tank/jetpack/thrust = get_equipped_item(slot_back_str) @@ -166,4 +178,7 @@ var/obj/item/rig/rig = thrust for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules) return module.jets + thrust = get_equipped_item(slot_s_store_str) + if(istype(thrust)) + return thrust return null diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index ef92418ffee..e05521f4a06 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -1,10 +1,10 @@ /mob/living/Life() - set invisibility = 0 + set invisibility = FALSE set background = BACKGROUND_ENABLED ..() - if (HasMovementHandler(/datum/movement_handler/mob/transformation/)) + if (HasMovementHandler(/datum/movement_handler/mob/transformation)) return // update the current life tick, can be used to e.g. only do something every 4 ticks @@ -20,38 +20,47 @@ //Handle temperature/pressure differences between body and environment handle_environment(loc.return_air()) - - if(stat != DEAD && !is_in_stasis()) - //Breathing, if applicable - handle_breathing() - handle_nutrition_and_hydration() - handle_immunity() - //Body temperature adjusts itself (self-regulation) - stabilize_body_temperature() - - // human/handle_regular_status_updates() needs a cleanup, as blindness should be handled in handle_disabilities() handle_regular_status_updates() // Status & health update, are we dead or alive etc. handle_stasis() if(stat != DEAD) + if(!is_in_stasis()) + . = handle_living_non_stasis_processes() aura_check(AURA_TYPE_LIFE) - //Check if we're on fire - handle_fire() - for(var/obj/item/grab/G in get_active_grabs()) G.Process() + //Check if we're on fire + handle_fire() handle_actions() - UpdateLyingBuckledAndVerbStatus() - handle_regular_hud_updates() - handle_status_effects() return 1 +/mob/living/proc/handle_living_non_stasis_processes() + // hungy + handle_nutrition_and_hydration() + // Breathing, if applicable + handle_breathing() + // Mutations and radiation + handle_mutations_and_radiation() + // Chemicals in the body + handle_chemicals_in_body() + // Random events (vomiting etc) + handle_random_events() + // eye, ear, brain damages + handle_disabilities() + handle_immunity() + //Body temperature adjusts itself (self-regulation) + stabilize_body_temperature() + // Only handle AI stuff if we're not being played. + if(!key) + handle_legacy_ai() + return TRUE + /mob/living/proc/experiences_hunger_and_thirst() return TRUE @@ -67,6 +76,10 @@ return my_species.hunger_factor return 0 +// Used to handle non-datum AI. +/mob/living/proc/handle_legacy_ai() + return + /mob/living/proc/handle_nutrition_and_hydration() SHOULD_CALL_PARENT(TRUE) if(!experiences_hunger_and_thirst()) @@ -130,14 +143,14 @@ damage = FLOOR(damage * (my_species ? my_species.get_radiation_mod(src) : 1)) if(damage) - adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT) immunity = max(0, immunity - damage * 15 * RADIATION_SPEED_COEFFICIENT) - updatehealth() + adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT) var/list/limbs = get_external_organs() if(!isSynthetic() && LAZYLEN(limbs)) var/obj/item/organ/external/O = pick(limbs) if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) + #undef RADIATION_SPEED_COEFFICIENT // Get valid, unique reagent holders for metabolizing. Avoids metabolizing the same holder twice in a tick. @@ -182,9 +195,8 @@ LAZYSET(chem_doses, T, dose) if(LAZYACCESS(chem_doses, T) <= 0) LAZYREMOVE(chem_doses, T) - if(apply_chemical_effects()) - updatehealth() + update_health() return TRUE @@ -192,9 +204,9 @@ var/burn_regen = GET_CHEMICAL_EFFECT(src, CE_REGEN_BURN) var/brute_regen = GET_CHEMICAL_EFFECT(src, CE_REGEN_BRUTE) if(burn_regen || brute_regen) - heal_organ_damage(brute_regen, burn_regen) + heal_organ_damage(brute_regen, burn_regen, FALSE) // apply_chemical_effects() calls update_health() if it returns true; don't do it unnecessarily. return TRUE - + return FALSE /mob/living/proc/handle_random_events() return @@ -214,7 +226,7 @@ // If we're standing in the rain, use the turf weather. . = istype(actual_loc) && actual_loc.weather if(!.) // If we're under or inside shelter, use the z-level rain (for ambience) - . = SSweather.get_weather_for_level(my_turf.z) + . = SSweather.weather_by_z[my_turf.z] /mob/living/proc/handle_environment(var/datum/gas_mixture/environment) @@ -254,37 +266,76 @@ //This updates the health and status of the mob (conscious, unconscious, dead) /mob/living/proc/handle_regular_status_updates() - updatehealth() - if(stat != DEAD) - if(HAS_STATUS(src, STAT_PARA)) - set_stat(UNCONSCIOUS) - else if (status_flags & FAKEDEATH) - set_stat(UNCONSCIOUS) - else - set_stat(CONSCIOUS) + + SHOULD_CALL_PARENT(TRUE) + + // Check if we are (or should be) dead at this point. + update_health() + + if(!handle_some_updates()) + return FALSE + + // Godmode just skips most of this processing. + if(status_flags & GODMODE) + set_stat(CONSCIOUS) + germ_level = 0 return TRUE + // TODO: move hallucinations into a status condition decl. + if(hallucination_power) + handle_hallucinations() + + // Increase germ_level regularly + if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level + germ_level++ + // If you're dirty, your gloves will become dirty, too. + var/obj/item/gloves = get_equipped_item(slot_gloves_str) + if(gloves && germ_level > gloves.germ_level && prob(10)) + gloves.germ_level++ + + // If we're dead, don't continue further. + if(stat == DEAD) + return FALSE + + // Handle some general state updates. + if(HAS_STATUS(src, STAT_PARA)) + set_stat(UNCONSCIOUS) + else if (status_flags & FAKEDEATH) + set_stat(UNCONSCIOUS) + else + set_stat(CONSCIOUS) + return TRUE + /mob/living/proc/handle_disabilities() handle_impaired_vision() handle_impaired_hearing() /mob/living/proc/handle_impaired_vision() - if((sdisabilities & BLINDED) || stat) //blindness from disability or unconsciousness doesn't get better on its own + SHOULD_CALL_PARENT(TRUE) + if(stat == DEAD) + SET_STATUS_MAX(src, STAT_BLIND, 0) + if(stat != CONSCIOUS && (sdisabilities & BLINDED)) //blindness from disability or unconsciousness doesn't get better on its own SET_STATUS_MAX(src, STAT_BLIND, 2) + else + return TRUE + return FALSE /mob/living/proc/handle_impaired_hearing() if((sdisabilities & DEAFENED) || stat) //disabled-deaf, doesn't get better on its own SET_STATUS_MAX(src, STAT_TINNITUS, 2) +/mob/living/proc/should_do_hud_updates() + return client + //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() - if(!client) return 0 - + SHOULD_CALL_PARENT(TRUE) + if(!should_do_hud_updates()) + return FALSE handle_hud_icons() handle_vision() handle_low_light_vision() - - return 1 + return TRUE /mob/living/proc/handle_low_light_vision() @@ -315,20 +366,16 @@ /mob/living/proc/handle_vision() update_sight() - if(stat == DEAD) return - - if(GET_STATUS(src, STAT_BLIND)) + if(is_blind()) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else clear_fullscreen("blind") set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) - set_fullscreen(stat == UNCONSCIOUS, "blackout", /obj/screen/fullscreen/blackout) - if(machine) var/viewflags = machine.check_eye(src) if(viewflags < 0) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3608af3aba9..c82af3d160a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,5 +1,6 @@ /mob/living/Initialize() + current_health = get_max_health() original_fingerprint_seed = sequential_id(/mob) fingerprint = md5(num2text(original_fingerprint_seed)) original_genetic_seed = sequential_id(/mob) @@ -185,22 +186,35 @@ default behaviour is: /mob/living/verb/succumb() set hidden = 1 - if ((src.health < src.maxHealth/2)) // Health below half of maxhealth. - src.adjustBrainLoss(src.health + src.maxHealth * 2) // Deal 2x health in BrainLoss damage, as before but variable. - updatehealth() - to_chat(src, "You have given up life and succumbed to death.") + var/current_max_health = get_max_health() + if (current_health < (current_max_health/2)) // Health below half of maxhealth. + adjustBrainLoss(current_max_health * 2) // Deal 2x health in BrainLoss damage, as before but variable. + to_chat(src, SPAN_NOTICE("You have given up life and succumbed to death.")) /mob/living/proc/update_body(var/update_icons=1) if(update_icons) queue_icon_update() -/mob/living/proc/updatehealth() +/mob/living/proc/should_be_dead() + return current_health <= 0 + +/mob/living/proc/get_total_life_damage() + return (getOxyLoss()+getToxLoss()+getFireLoss()+getBruteLoss()+getCloneLoss()+getHalLoss()) + +/mob/living/proc/update_health() + SHOULD_CALL_PARENT(TRUE) if(status_flags & GODMODE) - health = maxHealth + current_health = get_max_health() set_stat(CONSCIOUS) - else - health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - getHalLoss() + return + var/max_health = get_max_health() + current_health = clamp(max_health-get_total_life_damage(), -(max_health), max_health) + if(stat != DEAD && should_be_dead()) + death() + if(!QDELETED(src)) // death() may delete or remove us + set_status(STAT_BLIND, 1) + set_status(STAT_SILENCE, 0) //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage @@ -231,19 +245,24 @@ default behaviour is: return btemperature +/mob/living/proc/setBruteLoss(var/amount) + adjustBruteLoss((amount * 0.5)-getBruteLoss()) + /mob/living/proc/getBruteLoss() - return maxHealth - health + return get_max_health() - current_health -/mob/living/proc/adjustBruteLoss(var/amount) - if (status_flags & GODMODE) - return - health = clamp(health - amount, 0, maxHealth) +/mob/living/proc/adjustBruteLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() /mob/living/proc/getOxyLoss() return 0 -/mob/living/proc/adjustOxyLoss(var/amount) - return +/mob/living/proc/adjustOxyLoss(var/damage, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() /mob/living/proc/setOxyLoss(var/amount) return @@ -251,8 +270,8 @@ default behaviour is: /mob/living/proc/getToxLoss() return 0 -/mob/living/proc/adjustToxLoss(var/amount) - adjustBruteLoss(amount * 0.5) +/mob/living/proc/adjustToxLoss(var/amount, var/do_update_health = TRUE) + adjustBruteLoss(amount * 0.5, do_update_health) /mob/living/proc/setToxLoss(var/amount) adjustBruteLoss((amount * 0.5)-getBruteLoss()) @@ -260,8 +279,8 @@ default behaviour is: /mob/living/proc/getFireLoss() return -/mob/living/proc/adjustFireLoss(var/amount) - adjustBruteLoss(amount * 0.5) +/mob/living/proc/adjustFireLoss(var/amount, var/do_update_health = TRUE) + adjustBruteLoss(amount * 0.5, do_update_health) /mob/living/proc/setFireLoss(var/amount) adjustBruteLoss((amount * 0.5)-getBruteLoss()) @@ -269,17 +288,16 @@ default behaviour is: /mob/living/proc/getHalLoss() return 0 -/mob/living/proc/adjustHalLoss(var/amount) - adjustBruteLoss(amount * 0.5) +/mob/living/proc/adjustHalLoss(var/amount, var/do_update_health = TRUE) + adjustBruteLoss(amount * 0.5, do_update_health) /mob/living/proc/setHalLoss(var/amount) adjustBruteLoss((amount * 0.5)-getBruteLoss()) -/mob/living/proc/getBrainLoss() - return 0 - -/mob/living/proc/adjustBrainLoss(var/amount) - return +/mob/living/proc/adjustBrainLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() /mob/living/proc/setBrainLoss(var/amount) return @@ -290,14 +308,24 @@ default behaviour is: /mob/living/proc/setCloneLoss(var/amount) return -/mob/living/proc/adjustCloneLoss(var/amount) - return +/mob/living/proc/adjustCloneLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(TRUE) + if(do_update_health) + update_health() -/mob/living/proc/getMaxHealth() - return maxHealth +/mob/living/proc/get_health_ratio() // ratio might be the wrong word + return current_health/get_max_health() -/mob/living/proc/setMaxHealth(var/newMaxHealth) - maxHealth = newMaxHealth +/mob/living/proc/get_health_percent(var/sigfig = 1) + return round(get_health_ratio()*100, sigfig) + +/mob/living/proc/get_max_health() + return mob_default_max_health + +/mob/living/proc/set_max_health(var/val, var/skip_health_update = FALSE) + mob_default_max_health = val + if(!skip_health_update) + update_health() // ++++ROCKDTBEN++++ MOB PROCS //END @@ -344,30 +372,27 @@ default behaviour is: // heal ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE) - adjustBruteLoss(-brute) - adjustFireLoss(-burn) - src.updatehealth() +/mob/living/proc/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) + adjustBruteLoss(-brute, do_update_health = FALSE) + adjustFireLoss(-burn, do_update_health = update_health) // damage ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) - if(!(status_flags & GODMODE)) - adjustBruteLoss(brute) - adjustFireLoss(burn) - updatehealth() + if(status_flags & GODMODE) + return + adjustBruteLoss(brute, do_update_health = FALSE) + adjustFireLoss(burn) // heal MANY external organs, in random order /mob/living/proc/heal_overall_damage(var/brute, var/burn) - adjustBruteLoss(-brute) + adjustBruteLoss(-brute, do_update_health = FALSE) adjustFireLoss(-burn) - src.updatehealth() // damage MANY external organs, in random order /mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) if(status_flags & GODMODE) return 0 //godmode - adjustBruteLoss(brute) + adjustBruteLoss(brute, do_update_health = FALSE) adjustFireLoss(burn) - src.updatehealth() /mob/living/proc/restore_all_organs() return @@ -470,7 +495,7 @@ default behaviour is: brain.update_icon() ..(repair_brain) -/mob/living/proc/UpdateDamageIcon() +/mob/living/proc/update_damage_icon() return /mob/living/handle_grabs_after_move(var/turf/old_loc, var/direction) @@ -719,21 +744,10 @@ default behaviour is: update_icon() return 1 -/mob/living/update_icon() - ..() - compile_overlays() - -/mob/living/on_update_icon() - SHOULD_CALL_PARENT(TRUE) - ..() - cut_overlays() - if(auras) - for(var/obj/aura/aura as anything in auras) - var/image/A = new() - A.appearance = aura - add_overlay(A) - /mob/living/Destroy() + QDEL_NULL(aiming) + QDEL_NULL_LIST(_hallucinations) + QDEL_NULL_LIST(aimed_at_by) if(stressors) // Do not QDEL_NULL, keys are managed instances. stressors = null if(auras) @@ -844,9 +858,12 @@ default behaviour is: /mob/living/proc/eyecheck() return FLASH_PROTECTION_NONE -/mob/living/proc/get_max_nutrition() +/mob/living/proc/get_satiated_nutrition() return 500 +/mob/living/proc/get_max_nutrition() + return 550 + /mob/living/proc/set_nutrition(var/amt) nutrition = clamp(amt, 0, get_max_nutrition()) @@ -914,9 +931,6 @@ default behaviour is: else if(skip_delays || do_after(src, 5 SECONDS, user)) . = ..() -/mob/living/can_be_injected_by(var/atom/injector) - return ..() && (can_inject(null, 0, BP_CHEST) || can_inject(null, 0, BP_GROIN)) - /mob/living/handle_grab_damage() ..() if(!has_gravity()) @@ -937,19 +951,33 @@ default behaviour is: /mob/living/proc/can_do_special_ranged_attack(var/check_flag = TRUE) return TRUE +/mob/living/proc/get_food_satiation() + . = get_nutrition() + (get_ingested_reagents()?.total_volume * 10) + /mob/living/proc/get_ingested_reagents() + RETURN_TYPE(/datum/reagents) return reagents -/mob/living/proc/should_have_organ(var/organ_check) - return FALSE +/mob/living/proc/should_have_organ(organ_to_check) + var/decl/bodytype/root_bodytype = get_bodytype() + return root_bodytype?.has_organ[organ_to_check] + +/// Returns null if the mob's bodytype doesn't have a limb tag by default. +/// Otherwise, returns the data of the limb instead. +/mob/living/proc/should_have_limb(limb_to_check) + var/decl/bodytype/root_bodytype = get_bodytype() + return root_bodytype?.has_limbs[limb_to_check] /mob/living/proc/get_contact_reagents() + RETURN_TYPE(/datum/reagents) return reagents /mob/living/proc/get_injected_reagents() + RETURN_TYPE(/datum/reagents) return reagents /mob/living/proc/get_inhaled_reagents() + RETURN_TYPE(/datum/reagents) return reagents /mob/living/proc/get_adjusted_metabolism(metabolism) @@ -958,7 +986,7 @@ default behaviour is: /mob/living/get_admin_job_string() return "Living" -/mob/living/handle_mouse_drop(atom/over, mob/user) +/mob/living/handle_mouse_drop(atom/over, mob/user, params) if(!anchored && user == src && user != over) if(isturf(over)) @@ -1041,46 +1069,39 @@ default behaviour is: if(hud_used.action_buttons_hidden) if(!hud_used.hide_actions_toggle) hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.UpdateIcon() + hud_used.hide_actions_toggle.update_icon() hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1) client.screen += hud_used.hide_actions_toggle return var/button_number = 0 - for(var/datum/action/A in actions) + for(var/datum/action/action in actions) button_number++ - if(A.button == null) - var/obj/screen/action_button/N = new(hud_used) - N.owner = A - A.button = N - - var/obj/screen/action_button/B = A.button - - B.UpdateIcon() - - B.SetName(A.UpdateName()) - B.desc = A.UpdateDesc() - - client.screen += B - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + if(isnull(action.button)) + action.button = new /obj/screen/action_button(null, src, null, null, null, action) + action.button.SetName(action.UpdateName()) + action.button.desc = action.UpdateDesc() + action.button.update_icon() + action.button.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + client.screen |= action.button if(button_number > 0) if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.InitialiseIcon(src) + hud_used.hide_actions_toggle = new(hud_used, src) hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) client.screen += hud_used.hide_actions_toggle /mob/living/handle_fall_effect(var/turf/landing) ..() - apply_fall_damage(landing) - if(client) - var/area/A = get_area(landing) - if(A) - A.alert_on_fall(src) + if(istype(landing) && !landing.is_open()) + apply_fall_damage(landing) + if(client) + var/area/A = get_area(landing) + if(A) + A.alert_on_fall(src) /mob/living/proc/apply_fall_damage(var/turf/landing) - adjustBruteLoss(rand(max(1, CEILING(mob_size * 0.33)), max(1, CEILING(mob_size * 0.66)))) + adjustBruteLoss(rand(max(1, CEILING(mob_size * 0.33)), max(1, CEILING(mob_size * 0.66))) * get_fall_height()) /mob/living/proc/get_toxin_resistance() var/decl/species/species = get_species() @@ -1135,30 +1156,6 @@ default behaviour is: /mob/living/proc/get_seconds_until_next_special_ability_string() return ticks2readable(next_special_ability - world.time) -//Get species or synthetic temp if the mob is a FBP/robot. Used when a synthetic mob is exposed to a temp check. -//Essentially, used when a synthetic mob should act diffferently than a normal type mob. -/mob/living/get_temperature_threshold(var/threshold) - if(isSynthetic()) - switch(threshold) - if(COLD_LEVEL_1) - return SYNTH_COLD_LEVEL_1 - if(COLD_LEVEL_2) - return SYNTH_COLD_LEVEL_2 - if(COLD_LEVEL_3) - return SYNTH_COLD_LEVEL_3 - if(HEAT_LEVEL_1) - return SYNTH_HEAT_LEVEL_1 - if(HEAT_LEVEL_2) - return SYNTH_HEAT_LEVEL_2 - if(HEAT_LEVEL_3) - return SYNTH_HEAT_LEVEL_3 - else - CRASH("synthetic get_temperature_threshold() called with invalid threshold value.") - var/decl/species/my_species = get_species() - if(my_species) - return my_species.get_species_temperature_threshold(threshold) - return ..() - /mob/living/proc/handle_some_updates() //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle return life_tick <= 5 || !timeofdeath || (timeofdeath >= 5 && (world.time-timeofdeath) <= 10 MINUTES) @@ -1173,18 +1170,23 @@ default behaviour is: var/decl/species/my_species = get_species() return my_species?.get_footstep(src, footstep_type) -/mob/living/GetIdCards(exceptions = null) +/mob/living/GetIdCards(list/exceptions) . = ..() - var/list/candidates = get_held_items() - var/id = get_equipped_item(slot_wear_id_str) - if(id) - LAZYDISTINCTADD(candidates, id) - for(var/atom/movable/candidate in candidates) - if(!candidate || is_type_in_list(candidate, exceptions)) - continue - var/list/obj/item/card/id/id_cards = candidate.GetIdCards() - if(LAZYLEN(id_cards)) - LAZYDISTINCTADD(., id_cards) + // Grab our equipped ID. + // TODO: consider just iterating the entire equipment list here? + // Mask/neck slot lanyards or IDs as uniform accessories someday? + // TODO: May need handling for a held or equipped item returning + // multiple ID cards, currently will take the last one added. + var/obj/item/id = get_equipped_item(slot_wear_id_str) + if(istype(id)) + id = id.GetIdCard() + if(istype(id) && !is_type_in_list(id, exceptions)) + LAZYDISTINCTADD(., id) + // Go over everything we're holding. + for(var/obj/item/thing in get_held_items()) + thing = thing.GetIdCard() + if(istype(thing) && !is_type_in_list(thing, exceptions)) + LAZYDISTINCTADD(., thing) /mob/living/proc/update_surgery(update_icons) SHOULD_CALL_PARENT(TRUE) @@ -1218,3 +1220,92 @@ default behaviour is: LAZYADD(overlays_to_add, image(icon = surgery_icon, icon_state = overlay_state, layer = -HO_SURGERY_LAYER)) total.overlays |= overlays_to_add set_current_mob_overlay(HO_SURGERY_LAYER, total, update_icons) + +/mob/living/get_overhead_text_x_offset() + var/decl/bodytype/bodytype = get_bodytype() + return ..() + bodytype?.antaghud_offset_x + +/mob/living/get_overhead_text_y_offset() + var/decl/bodytype/bodytype = get_bodytype() + return ..() + bodytype?.antaghud_offset_y + +// Get rank from ID, ID inside PDA, PDA, ID in wallet, etc. +/mob/living/proc/get_authentification_rank(if_no_id = "No id", if_no_job = "No job") + var/obj/item/card/id/id = GetIdCard() + return istype(id) ? (id.position || if_no_job) : if_no_id + +//gets assignment from ID or ID inside PDA or PDA itself +//Useful when player do something with computers +/mob/living/proc/get_assignment(if_no_id = "No id", if_no_job = "No job") + var/obj/item/card/id/id = GetIdCard() + if(istype(id)) + return id.assignment ? id.assignment : if_no_job + return if_no_id + +//gets name from ID or ID inside PDA or PDA itself +//Useful when players do something with computers +/mob/living/proc/get_authentification_name(if_no_id = "Unknown") + var/obj/item/card/id/id = GetIdCard() + if(istype(id)) + return id.registered_name + return if_no_id + +//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere +/mob/living/proc/get_visible_name() + var/face_name = get_face_name() + var/id_name = get_id_name("") + if((face_name == "Unknown") && id_name && (id_name != face_name)) + return "[face_name] (as [id_name])" + return face_name + +//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable +//Also used in AI tracking people by face, so added in checks for head coverings like masks and helmets +/mob/living/proc/get_face_name() + if(identity_is_visible()) + return real_name + var/obj/item/clothing/mask = get_equipped_item(slot_wear_mask_str) + var/obj/item/clothing/head = get_equipped_item(slot_head_str) + if(istype(head) && head.visible_name) + return head.visible_name + else if(istype(mask) && mask.visible_name) + return mask.visible_name + else if(get_rig()?.visible_name) + return get_rig()?.visible_name + return "Unknown" + +/mob/living/proc/identity_is_visible() + if(!real_name) + return FALSE + var/obj/item/clothing/mask/mask = get_equipped_item(slot_wear_mask_str) + var/obj/item/head = get_equipped_item(slot_head_str) + if((mask?.flags_inv & HIDEFACE) || (head?.flags_inv & HIDEFACE)) + return FALSE + if(should_have_limb(BP_HEAD)) + var/obj/item/organ/external/skull = GET_EXTERNAL_ORGAN(src, BP_HEAD) + if(!skull || (skull.status & ORGAN_DISFIGURED)) //Face is unrecognizeable + return FALSE + return TRUE + +//gets name from ID or PDA itself, ID inside PDA doesn't matter +//Useful when player is being seen by other mobs +/mob/living/proc/get_id_name(if_no_id = "Unknown") + return GetIdCard(exceptions = list(/obj/item/holder))?.registered_name || if_no_id + +/mob/living/get_default_temperature_threshold(threshold) + if(isSynthetic()) + switch(threshold) + if(COLD_LEVEL_1) + return SYNTH_COLD_LEVEL_1 + if(COLD_LEVEL_2) + return SYNTH_COLD_LEVEL_2 + if(COLD_LEVEL_3) + return SYNTH_COLD_LEVEL_3 + if(HEAT_LEVEL_1) + return SYNTH_HEAT_LEVEL_1 + if(HEAT_LEVEL_2) + return SYNTH_HEAT_LEVEL_2 + if(HEAT_LEVEL_3) + return SYNTH_HEAT_LEVEL_3 + else + CRASH("synthetic get_default_temperature_threshold() called with invalid threshold value.") + return ..() diff --git a/code/modules/mob/living/living_appearance.dm b/code/modules/mob/living/living_appearance.dm new file mode 100644 index 00000000000..359cb835ccf --- /dev/null +++ b/code/modules/mob/living/living_appearance.dm @@ -0,0 +1,80 @@ +/mob/living + var/list/mob_overlays[TOTAL_OVER_LAYERS] + var/list/mob_underlays[TOTAL_UNDER_LAYERS] + +/mob/living/update_icon() + ..() + compile_overlays() + +/mob/living/on_update_icon() + SHOULD_CALL_PARENT(TRUE) + ..() + cut_overlays() + if(auras) + for(var/obj/aura/aura as anything in auras) + var/image/A = new() + A.appearance = aura + add_overlay(A) + try_refresh_visible_overlays() + +/mob/living/proc/get_skin_colour() + return + +/mob/living/proc/get_eye_colour() + return + +/mob/living/proc/get_lip_colour() + return + +/mob/living/proc/get_hairstyle() + return + +/mob/living/proc/get_facial_hairstyle() + return + +/mob/living/proc/get_hair_colour() + return + +/mob/living/proc/get_facial_hair_colour() + return + +/mob/living/proc/set_skin_colour(var/new_color) + return get_skin_colour() != new_color + +/mob/living/proc/set_eye_colour(var/new_color) + return get_eye_colour() != new_color + +/mob/living/proc/set_lip_colour(var/new_color) + return get_lip_colour() != new_color + +/mob/living/proc/set_facial_hair_colour(var/new_color, var/skip_update = FALSE) + return get_facial_hair_colour() != new_color + +/mob/living/proc/set_hair_colour(var/new_color, var/skip_update = FALSE) + return get_hair_colour() != new_color + +/mob/living/proc/set_hairstyle(var/new_hairstyle) + return new_hairstyle && get_hairstyle() != new_hairstyle && ispath(new_hairstyle, /decl/sprite_accessory/hair) + +/mob/living/proc/set_facial_hairstyle(var/new_facial_hairstyle) + return new_facial_hairstyle && get_facial_hairstyle() != new_facial_hairstyle && ispath(new_facial_hairstyle, /decl/sprite_accessory/facial_hair) + +/mob/living/get_all_current_mob_overlays() + return mob_overlays + +/mob/living/set_current_mob_overlay(var/overlay_layer, var/image/overlay, var/redraw_mob = TRUE) + mob_overlays[overlay_layer] = overlay + ..() + +/mob/living/get_current_mob_overlay(var/overlay_layer) + return mob_overlays[overlay_layer] + +/mob/living/get_all_current_mob_underlays() + return mob_underlays + +/mob/living/set_current_mob_underlay(var/underlay_layer, var/image/underlay, var/redraw_mob = TRUE) + mob_underlays[underlay_layer] = underlay + ..() + +/mob/living/get_current_mob_underlay(var/underlay_layer) + return mob_underlays[underlay_layer] diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index fbfc94d3ab1..2958ceb4b6a 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -5,15 +5,6 @@ SHOULD_CALL_PARENT(TRUE) - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable && hattable.hat) - hattable.hat.forceMove(get_turf(src)) - user.put_in_hands(hattable.hat) - user.visible_message(SPAN_DANGER("\The [user] removes \the [src]'s [hattable.hat]!")) - hattable.hat = null - update_icon() - return TRUE - switch(user.a_intent) if(I_HURT) . = default_hurt_interaction(user) diff --git a/code/modules/mob/living/living_bodytemp.dm b/code/modules/mob/living/living_bodytemp.dm index 58a184891ab..eee7572b398 100644 --- a/code/modules/mob/living/living_bodytemp.dm +++ b/code/modules/mob/living/living_bodytemp.dm @@ -27,8 +27,8 @@ if (abs(body_temperature_difference) < 0.5) return //fuck this precision - var/cold_1 = get_temperature_threshold(COLD_LEVEL_1) - var/heat_1 = get_temperature_threshold(HEAT_LEVEL_1) + var/cold_1 = get_mob_temperature_threshold(COLD_LEVEL_1) + var/heat_1 = get_mob_temperature_threshold(HEAT_LEVEL_1) if(bodytemperature < cold_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects. var/nut_remove = 10 * DEFAULT_HUNGER_FACTOR if(get_nutrition() >= nut_remove) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index 06a3150811d..57ad8ef78a7 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -34,7 +34,7 @@ if(ticks_since_last_successful_breath>0) //Suffocating so do not take a breath ticks_since_last_successful_breath-- if (prob(10) && !is_asystole() && active_breathe) //Gasp per 10 ticks? Sounds about right. - INVOKE_ASYNC(src, .proc/emote, "gasp") + INVOKE_ASYNC(src, PROC_REF(emote), "gasp") else //Okay, we can breathe, now check if we can get air var/volume_needed = get_breath_volume() @@ -57,8 +57,8 @@ // First handle being in a submerged environment. var/datum/gas_mixture/breath - var/turf/my_turf = get_turf(src) - if(istype(my_turf) && my_turf.is_flooded(lying)) + if(is_flooded(lying)) + var/turf/my_turf = get_turf(src) //Can we get air from the turf above us? var/can_breathe_air_above = FALSE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 63e2dc294da..5cfb37d77a8 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -170,7 +170,7 @@ /mob/living/momentum_do(var/power, var/datum/thrownthing/TT, var/atom/movable/AM) if(power >= 0.75) //snowflake to enable being pinned to walls var/direction = TT.init_dir - throw_at(get_edge_target_turf(src, direction), min((TT.maxrange - TT.dist_travelled) * power, 10), throw_speed * min(power, 1.5), callback = CALLBACK(src,/mob/living/proc/pin_to_wall,AM,direction)) + throw_at(get_edge_target_turf(src, direction), min((TT.maxrange - TT.dist_travelled) * power, 10), throw_speed * min(power, 1.5), callback = CALLBACK(src, TYPE_PROC_REF(/mob/living, pin_to_wall), AM, direction)) visible_message(SPAN_DANGER("\The [src] staggers under the impact!"),SPAN_DANGER("You stagger under the impact!")) return @@ -222,23 +222,25 @@ if(!damage || !istype(user)) return - adjustBruteLoss(damage) admin_attack_log(user, src, "Attacked", "Was attacked", "attacked") src.visible_message("\The [user] has [attack_message] \the [src]!") + adjustBruteLoss(damage) user.do_attack_animation(src) - spawn(1) updatehealth() return 1 +/mob/living/proc/can_ignite() + return fire_stacks > 0 && !on_fire + /mob/living/proc/IgniteMob() - if(fire_stacks > 0 && !on_fire) - on_fire = 1 + if(can_ignite()) + on_fire = TRUE set_light(4, l_color = COLOR_ORANGE) update_fire() /mob/living/proc/ExtinguishMob() if(on_fire) - on_fire = 0 + on_fire = FALSE fire_stacks = 0 set_light(0) update_fire() @@ -269,12 +271,16 @@ var/turf/location = get_turf(src) location.hotspot_expose(fire_burn_temperature(), 50, 1) +/mob/living/proc/increase_fire_stacks(exposed_temperature) + if(fire_stacks <= 4 || fire_burn_temperature() < exposed_temperature) + adjust_fire_stacks(2) + /mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) //once our fire_burn_temperature has reached the temperature of the fire that's giving fire_stacks, stop adding them. //allow fire_stacks to go up to 4 for fires cooler than 700 K, since are being immersed in flame after all. - if(fire_stacks <= 4 || fire_burn_temperature() < exposed_temperature) - adjust_fire_stacks(2) + increase_fire_stacks(exposed_temperature) IgniteMob() + return ..() /mob/living/proc/get_cold_protection() return 0 @@ -297,4 +303,34 @@ /mob/living/lava_act(datum/gas_mixture/air, temperature, pressure) fire_act(air, temperature) FireBurn(0.4*vsc.fire_firelevel_multiplier, temperature, pressure) - . = (health <= 0) ? ..() : FALSE + . = (current_health <= 0) ? ..() : FALSE + +// called when something steps onto a mob +// this handles mulebots and vehicles +/mob/living/Crossed(var/atom/movable/AM) + AM.crossed_mob(src) + +/mob/living/proc/solvent_act(var/severity, var/amount_per_item, var/solvent_power = MAT_SOLVENT_STRONG) + + for(var/slot in global.standard_headgear_slots) + var/obj/item/thing = get_equipped_item(slot) + if(!istype(thing)) + continue + if(!thing.solvent_can_melt(solvent_power) || !try_unequip(thing)) + to_chat(src, SPAN_NOTICE("Your [thing] protects you from the solvent.")) + return TRUE + to_chat(src, SPAN_DANGER("Your [thing] dissolves!")) + qdel(thing) + severity -= amount_per_item + if(severity <= 0) + return TRUE + + // TODO move this to a contact var or something. + if(solvent_power >= MAT_SOLVENT_STRONG) + var/screamed + for(var/obj/item/organ/external/affecting in get_external_organs()) + if(!screamed && affecting.can_feel_pain()) + screamed = TRUE + emote("scream") + affecting.status |= ORGAN_DISFIGURED + take_organ_damage(0, severity, override_droplimb = DISMEMBER_METHOD_ACID) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4020796aa03..7eab17ec15a 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -5,8 +5,8 @@ abstract_type = /mob/living //Health and life related vars - var/maxHealth = 100 //Maximum health that should be possible. - var/health = 100 //A mob's health + var/mob_default_max_health = 100 //Maximum health that should be possible. + var/current_health = INFINITY // A mob's current health. Set by update_health(). Defaults to INFINITY so mobs don't die on init. var/hud_updateflag = 0 diff --git a/code/modules/mob/living/living_dreams.dm b/code/modules/mob/living/living_dreams.dm new file mode 100644 index 00000000000..53b15252827 --- /dev/null +++ b/code/modules/mob/living/living_dreams.dm @@ -0,0 +1,14 @@ +/mob/living + var/dreaming = FALSE + +/mob/living/proc/handle_dreams() + set waitfor = FALSE + if(!client || dreaming || !prob(5)) + return + dreaming = TRUE + for(var/i = 1 to rand(1,4)) + to_chat(src, SPAN_NOTICE("... [pick(SSlore.dreams)] ...")) + sleep(rand(4 SECONDS, 7 SECONDS)) + if(!HAS_STATUS(src, STAT_ASLEEP)) + break + dreaming = FALSE diff --git a/code/modules/mob/living/living_hallucinations.dm b/code/modules/mob/living/living_hallucinations.dm new file mode 100644 index 00000000000..c5e4d290f96 --- /dev/null +++ b/code/modules/mob/living/living_hallucinations.dm @@ -0,0 +1,52 @@ +/mob/living + var/hallucination_power = 0 + var/hallucination_duration = 0 + var/next_hallucination + var/list/_hallucinations + +/mob/living/proc/adjust_hallucination(duration, power) + hallucination_duration = max(0, hallucination_duration + duration) + hallucination_power = max(0, hallucination_power + power) + +/mob/living/proc/set_hallucination(duration, power) + hallucination_duration = max(hallucination_duration, duration) + hallucination_power = max(hallucination_power, power) + +/mob/living/proc/handle_hallucinations() + //Tick down the duration + hallucination_duration = max(0, hallucination_duration - 1) + //Adjust power if we have some chems that affect it + if(has_chemical_effect(CE_MIND, threshold_under = -1)) + hallucination_power = hallucination_power++ + else if(has_chemical_effect(CE_MIND, threshold_under = 0)) + hallucination_power = min(hallucination_power++, 50) + else if(has_chemical_effect(CE_MIND, 1)) + hallucination_duration = max(0, hallucination_duration - 1) + hallucination_power = max(hallucination_power - GET_CHEMICAL_EFFECT(src, CE_MIND), 0) + + //See if hallucination is gone + if(!hallucination_power) + hallucination_duration = 0 + return + if(!hallucination_duration) + hallucination_power = 0 + return + + if(!client || stat || world.time < next_hallucination) + return + if(has_chemical_effect(CE_MIND, 1) && prob(GET_CHEMICAL_EFFECT(src, CE_MIND)*40)) //antipsychotics help + return + var/hall_delay = rand(10,20) SECONDS + + if(hallucination_power < 50) + hall_delay *= 2 + next_hallucination = world.time + hall_delay + var/list/candidates = list() + for(var/T in subtypesof(/datum/hallucination)) + var/datum/hallucination/H = new T + if(H.can_affect(src)) + candidates += H + if(candidates.len) + var/datum/hallucination/H = pick(candidates) + H.holder = src + H.activate_hallucination() diff --git a/code/modules/mob/living/living_maneuvers.dm b/code/modules/mob/living/living_maneuvers.dm index 5637a34e83e..89a47a1f63b 100644 --- a/code/modules/mob/living/living_maneuvers.dm +++ b/code/modules/mob/living/living_maneuvers.dm @@ -15,16 +15,25 @@ if(!can_fall(location_override = check)) break if(check && check != loc) - addtimer(CALLBACK(src, /mob/living/proc/reflexive_maneuver_callback, lastloc, check), 0) + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, reflexive_maneuver_callback), lastloc, check), 0) return . = ..() /mob/living/proc/reflexive_maneuver_callback(var/turf/origin, var/turf/check) if(prepared_maneuver) - if(origin) + if(origin) // Used to avoid falling into open space. forceMove(get_turf(origin)) prepared_maneuver.perform(src, check, get_acrobatics_multiplier(prepared_maneuver), reflexively = TRUE) prepared_maneuver = null + maneuver_icon?.icon_state = "maneuver_off" + +/mob/living/proc/try_maneuver(var/atom/target) + if(prepared_maneuver && (isturf(target) || isturf(target.loc))) // Avoid trying to jump at your backpack contents. + prepared_maneuver.perform(src, get_turf(target), get_acrobatics_multiplier(prepared_maneuver)) + prepared_maneuver = null + maneuver_icon?.icon_state = "maneuver_off" + return TRUE + return FALSE /mob/living/verb/prepare_maneuver() set name = "Prepare To Maneuver" @@ -35,22 +44,34 @@ to_chat(src, SPAN_WARNING("You are unable to perform any maneuvers.")) return + var/list/maneuvers_by_name = list() var/list/maneuvers = list() for(var/maneuver in available_maneuvers) - maneuvers += GET_DECL(maneuver) + var/decl/maneuver/maneuver_decl = GET_DECL(maneuver) + maneuvers_by_name[maneuver_decl.name] = maneuver_decl + var/image/I = image(maneuver_decl.selection_icon, maneuver_decl.selection_icon_state) + I.name = capitalize(maneuver_decl.name) + maneuvers[maneuver_decl.name] = I - var/next_maneuver = input(src, "Select a maneuver.") as null|anything in maneuvers + var/next_maneuver = show_radial_menu(src, src, maneuvers, require_near = TRUE, radius = 42, tooltips = TRUE, check_locs = list(src), use_labels = TRUE) if(next_maneuver) - prepared_maneuver = next_maneuver + var/decl/maneuver/maneuver = maneuvers_by_name[next_maneuver] + if(!maneuver.can_be_used_by(src, null)) + return + prepared_maneuver = maneuver + maneuver_icon?.icon_state = "maneuver_on" to_chat(src, SPAN_NOTICE("You prepare to [prepared_maneuver.name].")) else prepared_maneuver = null + maneuver_icon?.icon_state = "maneuver_off" to_chat(src, SPAN_NOTICE("You are no longer preparing to perform a maneuver.")) /mob/living/proc/perform_maneuver(var/maneuver, var/atom/target) var/decl/maneuver/performing_maneuver = ispath(maneuver) ? GET_DECL(maneuver) : maneuver if(istype(performing_maneuver)) . = performing_maneuver.perform(src, target, get_acrobatics_multiplier(performing_maneuver)) + prepared_maneuver = null + maneuver_icon?.icon_state = "maneuver_off" /mob/living/proc/get_acrobatics_multiplier(var/decl/maneuver/attempting_maneuver) return 1 diff --git a/code/modules/mob/living/living_organs.dm b/code/modules/mob/living/living_organs.dm index 7ab280144bf..7881fb555df 100644 --- a/code/modules/mob/living/living_organs.dm +++ b/code/modules/mob/living/living_organs.dm @@ -21,16 +21,17 @@ return LAZYLEN(get_internal_organs()) > 0 //Can be called when we want to add an organ in a detached state or an attached state. -/mob/living/proc/add_organ(var/obj/item/organ/O, var/obj/item/organ/external/affected = null, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) +/mob/living/proc/add_organ(var/obj/item/organ/O, var/obj/item/organ/external/affected = null, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE, var/skip_health_update = FALSE) . = O.do_install(src, affected, in_place, update_icon, detached) //Only run install effects if we're not detached and we're not adding in place if(!in_place && !(O.status & ORGAN_CUT_AWAY)) on_gained_organ(O) - updatehealth() + if(!skip_health_update) + update_health() return TRUE //Can be called when the organ is detached or attached. -/mob/living/proc/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = FALSE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE) +/mob/living/proc/remove_organ(var/obj/item/organ/O, var/drop_organ = TRUE, var/detach = FALSE, var/ignore_children = FALSE, var/in_place = FALSE, var/update_icon = TRUE, var/skip_health_update = FALSE) //Only run effects if we're not already detached, and we're not doing a in-place removal if(!in_place && !(O.status & ORGAN_CUT_AWAY)) //Gotta check the flag here, because of prosthetics handling detached state differently on_lost_organ(O) @@ -41,7 +42,8 @@ if(client) client.screen -= O - updatehealth() + if(!skip_health_update) + update_health() if(drop_organ) var/drop_loc = get_turf(src) diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index e3dcb6505eb..49d07235d00 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -67,6 +67,6 @@ to_chat(target,"\The [src] scrapes your flesh from your bones!") to_chat(src,"You feed hungrily off \the [target]'s flesh.") target.adjustBruteLoss(25) - if(target.getBruteLoss() < -target.maxHealth) + if(target.getBruteLoss() < -target.get_max_health()) target.gib() src.adjustBruteLoss(-25) \ No newline at end of file diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 1014107e700..11c01992201 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -13,7 +13,7 @@ if(amount == PENDING_STATUS(src, condition)) return FALSE LAZYSET(pending_status_counters, condition, amount) - addtimer(CALLBACK(src, .proc/apply_pending_status_changes), 0, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(apply_pending_status_changes)), 0, TIMER_UNIQUE) return TRUE /mob/living/proc/rebuild_status_markers() diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index bd96ef839e9..5ef4b739097 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -16,6 +16,13 @@ var/mob_ref = weakref(src) if(istype(weather)) - weather.mob_shown_weather -= mob_ref - weather.mob_shown_wind -= mob_ref - global.current_mob_ambience -= mob_ref + weather.mob_shown_weather -= mob_ref + weather.mob_shown_wind -= mob_ref + global.current_mob_ambience -= mob_ref + + // Update our equipped item presence. + for(var/slot in (get_inventory_slots()|get_held_item_slots())) + var/datum/inventory_slot/inv_slot = get_inventory_slot_datum(slot) + var/obj/item/held = inv_slot?.get_equipped_item() + if(held) + held.reconsider_client_screen_presence(client, slot) diff --git a/code/modules/mob/living/maneuvers/_maneuver.dm b/code/modules/mob/living/maneuvers/_maneuver.dm index e3effad6518..788c299aa2d 100644 --- a/code/modules/mob/living/maneuvers/_maneuver.dm +++ b/code/modules/mob/living/maneuvers/_maneuver.dm @@ -1,9 +1,21 @@ /decl/maneuver + abstract_type = /decl/maneuver var/name = "unnamed" var/delay = 2 SECONDS var/cooldown = 10 SECONDS var/stamina_cost = 10 var/reflexive_modifier = 1 + var/selection_icon = 'icons/screen/maneuver.dmi' + var/selection_icon_state + +/decl/maneuver/validate() + . = ..() + if(!selection_icon) + . += "no selection icon" + else if(!selection_icon_state) + . += "no selection icon_state" + else if(!check_state_in_icon(selection_icon_state, selection_icon)) + . += "selection icon_state [selection_icon_state] not found in icon [selection_icon]" /decl/maneuver/proc/can_be_used_by(var/mob/living/user, var/atom/target, var/silent = FALSE) if(!istype(user) || !user.can_do_maneuver(src, silent)) @@ -22,7 +34,7 @@ return FALSE if(user.is_on_special_ability_cooldown()) if(!silent) - to_chat(user, SPAN_WARNING("You cannot maneuver again for another [user.get_seconds_until_next_special_ability_string()]")) + to_chat(user, SPAN_WARNING("You cannot maneuver again for another [user.get_seconds_until_next_special_ability_string()].")) return FALSE if(user.get_stamina() < stamina_cost) if(!silent) diff --git a/code/modules/mob/living/maneuvers/maneuver_leap.dm b/code/modules/mob/living/maneuvers/maneuver_leap.dm index e148d33e705..5dd783f2765 100644 --- a/code/modules/mob/living/maneuvers/maneuver_leap.dm +++ b/code/modules/mob/living/maneuvers/maneuver_leap.dm @@ -2,6 +2,7 @@ name = "leap" stamina_cost = 10 reflexive_modifier = 1.5 + selection_icon_state = "leap" /decl/maneuver/leap/perform(var/mob/living/user, var/atom/target, var/strength, var/reflexively = FALSE) . = ..() @@ -15,8 +16,8 @@ user.jump_layer_shift() animate(user, pixel_z = 16, time = 3, easing = SINE_EASING | EASE_IN) animate(pixel_z = user.default_pixel_z, time = 3, easing = SINE_EASING | EASE_OUT) - user.throw_at(get_turf(target), strength, 1, user, FALSE, CALLBACK(src, /decl/maneuver/leap/proc/end_leap, user, target, old_pass_flags)) - addtimer(CALLBACK(user, /mob/living/proc/jump_layer_shift_end), 4.5) + user.throw_at(get_turf(target), strength, 1, user, FALSE, CALLBACK(src, TYPE_PROC_REF(/decl/maneuver/leap, end_leap), user, target, old_pass_flags)) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living, jump_layer_shift_end)), 4.5) /decl/maneuver/leap/proc/end_leap(var/mob/living/user, var/atom/target, var/pass_flag) user.pass_flags = pass_flag @@ -29,6 +30,8 @@ if(.) var/can_leap_distance = user.get_jump_distance() * user.get_acrobatics_multiplier() . = (can_leap_distance > 0 && (!target || get_dist(user, target) <= can_leap_distance)) + if(!. && !silent) + to_chat(user, SPAN_WARNING("You cannot leap that far!")) /decl/maneuver/leap/spider stamina_cost = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c199d132c36..6bf47b4c9a9 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -6,8 +6,8 @@ return FALSE /mob/living/proc/get_default_language() - var/lang = ispath(default_language, /decl/language) && GET_DECL(default_language) - if(can_speak(lang)) + var/decl/language/lang = GET_DECL(default_language) + if(istype(lang) && can_speak(lang)) return lang /mob/living/proc/get_any_good_language(set_default=FALSE) @@ -83,6 +83,7 @@ // It then processes the message_mode to implement an additional behavior needed for the message, such // as retrieving radios or looking for an intercom nearby. /mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + SHOULD_CALL_PARENT(TRUE) if(!message_mode) return var/list/assess_items_as_radios = get_radios(message_mode) @@ -118,6 +119,10 @@ return html_encode(message) +/mob/living/proc/handle_mob_specific_speech(message, message_mode, verb = "says", decl/language/speaking) + SHOULD_CALL_PARENT(TRUE) + return FALSE + /mob/living/say(var/message, var/decl/language/speaking, var/verb = "says", var/alt_name = "", whispering) set waitfor = FALSE if(client) @@ -158,6 +163,9 @@ emote("custom", AUDIBLE_MESSAGE, "[pick("grunts", "babbles", "gibbers", "jabbers", "burbles")] aimlessly.") return + if(handle_mob_specific_speech(message, message_mode, verb, speaking)) + return + // This is broadcast to all mobs with the language, // irrespective of distance or anything else. if(speaking && (speaking.flags & LANG_FLAG_HIVEMIND)) @@ -292,10 +300,10 @@ if(O) //It's possible that it could be deleted in the meantime. O.hear_talk(src, stars(message), verb, speaking) - INVOKE_ASYNC(GLOBAL_PROC, .proc/animate_speech_bubble, speech_bubble, speech_bubble_recipients | eavesdroppers, 30) - INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, speaking, italics, speech_bubble_recipients) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(animate_speech_bubble), speech_bubble, speech_bubble_recipients | eavesdroppers, 30) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, animate_chat), message, speaking, italics, speech_bubble_recipients) if(length(eavesdroppers)) - INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, stars(message), speaking, italics, eavesdroppers) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, animate_chat), stars(message), speaking, italics, eavesdroppers) if(whispering) log_whisper("[name]/[key] : [message]") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f78d5049548..8f2b8462ee2 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -56,7 +56,11 @@ var/global/list/ai_verbs_default = list( density = TRUE status_flags = CANSTUN|CANPARALYSE|CANPUSH shouldnt_see = list(/obj/effect/rune) - maxHealth = 200 + mob_default_max_health = 200 + + silicon_camera = /obj/item/camera/siliconcam/ai_camera + silicon_radio = /obj/item/radio/headset/heads/ai_integrated + var/obj/machinery/camera/camera = null var/list/connected_robots = list() var/aiRestorePowerRoutine = 0 @@ -65,9 +69,6 @@ var/global/list/ai_verbs_default = list( var/icon/holo_icon_longrange //Yellow hologram. var/holo_icon_malf = FALSE // for new hologram system var/obj/item/multitool/aiMulti = null - - silicon_camera = /obj/item/camera/siliconcam/ai_camera - silicon_radio = /obj/item/radio/headset/heads/ai_integrated var/obj/item/radio/headset/heads/ai_integrated/ai_radio var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. @@ -103,7 +104,7 @@ var/global/list/ai_verbs_default = list( src.verbs -= ai_verbs_default src.verbs += /mob/living/verb/ghost -/mob/living/silicon/ai/Initialize(mapload, var/datum/ai_laws/L, var/obj/item/mmi/B, var/safety = 0) +/mob/living/silicon/ai/Initialize(mapload, var/datum/ai_laws/L, var/obj/item/organ/internal/brain_interface/B, var/safety = 0) announcement = new() announcement.title = "A.I. Announcement" announcement.announcement_type = "A.I. Announcement" @@ -143,11 +144,12 @@ var/global/list/ai_verbs_default = list( add_language(/decl/language/sign, 0) if(!safety)//Only used by AIize() to successfully spawn an AI. - if (!B)//If there is no player/brain inside. + var/mob/living/brainmob = B?.get_brainmob() + if(!brainmob) // If there is no player/brain inside. empty_playable_ai_cores += new/obj/structure/aicore/deactivated(loc)//New empty terminal. . = INITIALIZE_HINT_QDEL - else if(B.brainmob.mind) - B.brainmob.mind.transfer_to(src) + else if(brainmob.mind) + brainmob.mind.transfer_to(src) hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") diff --git a/code/modules/mob/living/silicon/ai/ai_damage.dm b/code/modules/mob/living/silicon/ai/ai_damage.dm index 087e8ecafcb..6949d387b0c 100644 --- a/code/modules/mob/living/silicon/ai/ai_damage.dm +++ b/code/modules/mob/living/silicon/ai/ai_damage.dm @@ -12,17 +12,27 @@ /mob/living/silicon/ai/getOxyLoss() return oxyloss -/mob/living/silicon/ai/adjustFireLoss(var/amount) +/mob/living/silicon/ai/adjustFireLoss(var/amount, var/do_update_health = TRUE) if(status_flags & GODMODE) return - fireloss = max(0, fireloss + min(amount, health)) + fireloss = max(0, fireloss + min(amount, current_health)) + if(do_update_health) + update_health() -/mob/living/silicon/ai/adjustBruteLoss(var/amount) - if(status_flags & GODMODE) return - bruteloss = max(0, bruteloss + min(amount, health)) +/mob/living/silicon/ai/adjustBruteLoss(var/amount, var/do_update_health = TRUE) + if(!(status_flags & GODMODE)) + bruteloss = max(0, bruteloss + min(amount, current_health)) + ..() -/mob/living/silicon/ai/adjustOxyLoss(var/amount) - if(status_flags & GODMODE) return - oxyloss = max(0, oxyloss + min(amount, maxHealth - oxyloss)) +/mob/living/silicon/ai/adjustOxyLoss(var/damage, var/do_update_health = TRUE) + if(!(status_flags & GODMODE)) + oxyloss = max(0, oxyloss + min(damage, get_max_health() - oxyloss)) + ..() + +/mob/living/silicon/ai/setBruteLoss(var/amount) + if(status_flags & GODMODE) + bruteloss = 0 + return + bruteloss = max(0, amount) /mob/living/silicon/ai/setFireLoss(var/amount) if(status_flags & GODMODE) @@ -36,22 +46,16 @@ return oxyloss = max(0, amount) -/mob/living/silicon/ai/updatehealth() +/mob/living/silicon/ai/update_health() + ..() if(status_flags & GODMODE) - health = maxHealth - set_stat(CONSCIOUS) setOxyLoss(0) - else - health = maxHealth - getFireLoss() - getBruteLoss() // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine. /mob/living/silicon/ai/rejuvenate() ..() add_ai_verbs(src) -// Returns percentage of AI's remaining backup capacitor charge (maxhealth - oxyloss). +// Returns percentage of AI's remaining backup capacitor charge (max_health - oxyloss). /mob/living/silicon/ai/proc/backup_capacitor() - return ((getOxyLoss() - maxHealth) / maxHealth) * (-100) - -// Returns percentage of AI's remaining hardware integrity (maxhealth - (bruteloss + fireloss)) -/mob/living/silicon/ai/proc/hardware_integrity() - return (health / maxHealth) * 100 \ No newline at end of file + var/current_max_health = get_max_health() + return ((getOxyLoss() - current_max_health) / current_max_health) * (-100) diff --git a/code/modules/mob/living/silicon/ai/ai_radio.dm b/code/modules/mob/living/silicon/ai/ai_radio.dm index a4b198194e6..c9a32ee9cd3 100644 --- a/code/modules/mob/living/silicon/ai/ai_radio.dm +++ b/code/modules/mob/living/silicon/ai/ai_radio.dm @@ -12,7 +12,9 @@ /obj/item/encryptionkey/heads/ai_integrated name = "ai integrated encryption key" desc = "Integrated encryption key." - icon_state = "cap_cypherkey" + color = COLOR_GOLD + fill_color = COLOR_PALE_GOLD + inlay_color = COLOR_ROYAL_BLUE can_decrypt = list( access_bridge, access_security, diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 06d5c557536..68df276f1d2 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -1,50 +1,35 @@ -/mob/living/silicon/ai/Life() +/mob/living/silicon/ai/should_be_dead() + return get_health_percent() <= 0 || backup_capacitor() <= 0 - SHOULD_CALL_PARENT(FALSE) - - if (src.stat == DEAD) - return - - if (src.stat!=CONSCIOUS) +/mob/living/silicon/ai/handle_regular_status_updates() + . = ..() + if(stat != CONSCIOUS) src.cameraFollow = null src.reset_view(null) - src.updatehealth() - - if ((hardware_integrity() <= 0) || (backup_capacitor() <= 0)) - death() - return +/mob/living/silicon/ai/update_lying() + lying = FALSE +/mob/living/silicon/ai/handle_living_non_stasis_processes() + . = ..() // If our powersupply object was destroyed somehow, create new one. if(!psupply) create_powersupply() - - lying = 0 // Handle lying down - // We aren't shut down, and we lack external power. Try to fix it using the restoration routine. if (!self_shutdown && !has_power(0)) // AI's restore power routine is not running. Start it automatically. if(aiRestorePowerRoutine == AI_RESTOREPOWER_IDLE) aiRestorePowerRoutine = AI_RESTOREPOWER_STARTING handle_power_failure() - - handle_impaired_vision() update_power_usage() handle_power_oxyloss() - update_sight() - process_queued_alarms() - handle_regular_hud_updates() - switch(src.sensor_mode) if (SEC_HUD) process_sec_hud(src,0,src.eyeobj,get_computer_network()) if (MED_HUD) process_med_hud(src,0,src.eyeobj,get_computer_network()) - process_os() - handle_status_effects() - if(controlling_drone && stat != CONSCIOUS) controlling_drone.release_ai_control("WARNING: Primary control loop failure. Session terminated.") diff --git a/code/modules/mob/living/silicon/ai/power.dm b/code/modules/mob/living/silicon/ai/power.dm index af813d5e6d1..aa92b054d91 100644 --- a/code/modules/mob/living/silicon/ai/power.dm +++ b/code/modules/mob/living/silicon/ai/power.dm @@ -195,8 +195,8 @@ active_power_usage = AI_POWERUSAGE_NORMAL * AI_POWERUSAGE_OXYLOSS_TO_WATTS_MULTIPLIER use_power = POWER_USE_ACTIVE power_channel = EQUIP + invisibility = INVISIBILITY_ABSTRACT var/mob/living/silicon/ai/powered_ai = null - invisibility = 100 /obj/machinery/ai_powersupply/Initialize() . = ..() diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 3f3e5e90fdc..0fb383db64b 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -106,7 +106,7 @@ var/list/channels = new() channels += MAIN_CHANNEL channels += additional_law_channels - for(var/datum/radio_channel/channel in silicon_radio.get_available_channels()) + for(var/datum/radio_channel/channel in silicon_radio?.get_available_channels()) channels |= channel.key channels += "Binary" return channels diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 6e2db95e39c..81d63dea087 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -8,6 +8,6 @@ fold() if(mind) qdel(mind) - ..(gibbed, deathmessage, "You have suffered a critical system failure, and are dead.") + ..(gibbed, "gives one shrill beep before falling lifeless.", "You have suffered a critical system failure, and are dead.") ghostize() qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index f3697bfefe9..c59c817f66a 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -1,40 +1,19 @@ -/mob/living/silicon/pai/Life() - - SHOULD_CALL_PARENT(FALSE) - - if (src.stat == DEAD) - return - - if(src.cable) - if(get_dist(src, cable) > 1) - visible_message( \ - message = SPAN_NOTICE("The data cable rapidly retracts back into its spool."), \ - blind_message = SPAN_NOTICE("You hear a click and the sound of wire spooling rapidly.")) - QDEL_NULL(cable) - - handle_regular_hud_updates() - - if(src.secHUD == 1) - process_sec_hud(src, 1, network = get_computer_network()) - - if(src.medHUD == 1) - process_med_hud(src, 1, network = get_computer_network()) - +/mob/living/silicon/pai/handle_regular_hud_updates() + . = ..() + if(.) + if(src.secHUD == 1) + process_sec_hud(src, 1, network = get_computer_network()) + if(src.medHUD == 1) + process_med_hud(src, 1, network = get_computer_network()) + +/mob/living/silicon/pai/handle_regular_status_updates() + . = ..() process_os() // better safe than sorry, in case some pAI has it - - if(silence_time) - if(world.timeofday >= silence_time) - silence_time = null - to_chat(src, SPAN_NOTICE("Communication circuit reinitialized. Speech and messaging functionality restored.")) - - handle_status_effects() - - if(health <= 0) - death(null,"gives one shrill beep before falling lifeless.") - -/mob/living/silicon/pai/updatehealth() - if(status_flags & GODMODE) - health = 100 - set_stat(CONSCIOUS) - else - health = 100 - getBruteLoss() - getFireLoss() \ No newline at end of file + if(src.cable && get_dist(src, cable) > 1) + visible_message( \ + message = SPAN_NOTICE("The data cable rapidly retracts back into its spool."), \ + blind_message = SPAN_NOTICE("You hear a click and the sound of wire spooling rapidly.")) + QDEL_NULL(cable) + +/mob/living/silicon/pai/death(gibbed, deathmessage, show_dead_message) + return ..(deathmessage = "gives one shrill beep before falling lifeless.") diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index f7ab6c949c2..2be9d6e687e 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -34,6 +34,7 @@ var/global/list/possible_say_verbs = list( holder_type = /obj/item/holder idcard = /obj/item/card/id silicon_radio = null // pAIs get their radio from the card they belong to. + mob_default_max_health = 100 os_type = /datum/extension/interactive/os/silicon/small starting_stock_parts = list( @@ -58,8 +59,6 @@ var/global/list/possible_say_verbs = list( var/pai_law0 = "Serve your master." var/pai_laws // String for additional operating instructions our master might give us - var/silence_time // Timestamp when we were silenced (normally via EMP burst), set to null after silence has faded - // Various software-specific vars var/secHUD = 0 // Toggles whether the Security HUD is active or not @@ -83,30 +82,39 @@ var/global/list/possible_say_verbs = list( set_extension(src, /datum/extension/base_icon_state, icon_state) status_flags |= NO_ANTAG - card = loc + if(!card) + if(istype(loc, /obj/item/paicard)) + card = loc + else + card.radio = new /obj/item/radio(card) + if(istype(card)) + if(!card.radio) + card.radio = new /obj/item/radio(card) + silicon_radio = card.radio + card.setPersonality(src) + else + return INITIALIZE_HINT_QDEL //As a human made device, we'll understand sol common without the need of the translator add_language(/decl/language/human/common, 1) - verbs -= /mob/living/verb/ghost . = ..() - if(card) - if(!card.radio) - card.radio = new /obj/item/radio(card) - silicon_radio = card.radio + software = default_pai_software.Copy() /mob/living/silicon/pai/Destroy() - card = null + if(card) + if(card.pai == src) + card.removePersonality() + card = null silicon_radio = null // Because this radio actually belongs to another instance we simply null . = ..() // this function shows the information about being silenced as a pAI in the Status panel /mob/living/silicon/pai/proc/show_silenced() - if(silence_time) - var/timeleft = round((silence_time - world.timeofday)/10 ,1) - stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") + var/timeleft = round((HAS_STATUS(src, STAT_SILENCE) * SSmobs.wait) / 10, 1) + stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") /mob/living/silicon/pai/Stat() . = ..() @@ -129,7 +137,7 @@ var/global/list/possible_say_verbs = list( // 33% chance to change prime directive (based on severity) // 33% chance of no additional effect - silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes + SET_STATUS_MAX(src, STAT_SILENCE, 2 MINUTES) to_chat(src, SPAN_DANGER("Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.")) if(prob(20)) visible_message( \ @@ -266,7 +274,6 @@ var/global/list/possible_say_verbs = list( if(W.force) visible_message(SPAN_DANGER("[user] attacks [src] with [W]!")) adjustBruteLoss(W.force) - updatehealth() else visible_message(SPAN_WARNING("[user] bonks [src] harmlessly with [W].")) diff --git a/code/modules/mob/living/silicon/pai/paiwire.dm b/code/modules/mob/living/silicon/pai/paiwire.dm index 5684813d326..0e1f737e601 100644 --- a/code/modules/mob/living/silicon/pai/paiwire.dm +++ b/code/modules/mob/living/silicon/pai/paiwire.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/power.dmi' icon_state = "wire1" material = /decl/material/solid/metal/copper - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) var/obj/machinery/machine /obj/item/pai_cable/proc/plugin(obj/machinery/M, mob/user) diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index 34265366562..732261c052d 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,5 +1,5 @@ /mob/living/silicon/pai/say(var/msg) - if(silence_time) - to_chat(src, SPAN_WARNING("Communication circuits remain uninitialized.")) - else - ..(msg) \ No newline at end of file + if(HAS_STATUS(src, STAT_SILENCE)) + to_chat(src, SPAN_WARNING("Communication circuits are disabled.")) + return + return ..(msg) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index d55cb711c2b..72c1af676bb 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -33,16 +33,14 @@ var/global/list/default_pai_software = list() default_pai_software[P.id] = P return r -/mob/living/silicon/pai/Initialize() - . = ..() - software = default_pai_software.Copy() - /mob/living/silicon/pai/proc/paiInterface() ui_interact(src) /mob/living/silicon/pai/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) - if(user != src) - if(ui) ui.set_status(STATUS_CLOSE, 0) + + if(user != src || !istype(card)) + if(ui) + ui.set_status(STATUS_CLOSE, 0) return if(ui_key != "main") diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 952f1dacb0d..c3187cfa3d9 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -3,21 +3,20 @@ // /obj/item/robotanalyzer name = "robot analyzer" - icon = 'icons/obj/items/device/robot_analyzer.dmi' - icon_state = "robotanalyzer" - item_state = "analyzer" desc = "A hand-held scanner able to diagnose robotic injuries." + icon = 'icons/obj/items/device/robot_analyzer.dmi' + icon_state = ICON_STATE_WORLD obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY throwforce = 3 w_class = ITEM_SIZE_SMALL throw_speed = 5 throw_range = 10 - origin_tech = "{'magnets':2,'biotech':1,'engineering':2}" + origin_tech = @'{"magnets":2,"biotech":1,"engineering":2}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/robotanalyzer/attack(mob/living/M, mob/living/user) @@ -45,7 +44,7 @@ if("robot") var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.getHalLoss()]% functional"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.current_health - M.getHalLoss()]% functional"]") user.show_message("\t Key: Electronics/Brute", 1) user.show_message("\t Damage Specifics: [BU] - [BR]") if(M.stat == DEAD) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 245fce44990..3fd56f6b134 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -1,4 +1,4 @@ -// TODO: remove the robot.mmi and robot.cell variables and completely rely on the robot component system +// TODO: remove the robot.central_processor and robot.cell variables and completely rely on the robot component system /datum/robot_component/var/name /datum/robot_component/var/installed = 0 diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index c275e273f0f..655e3a9c54f 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,7 +1,5 @@ /mob/living/silicon/robot/dust() - //Delete the MMI first so that it won't go popping out. - if(mmi) - qdel(mmi) + clear_brain() ..() /mob/living/silicon/robot/death(gibbed,deathmessage, show_dead_message) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 25719998f40..57ed84e6ed3 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -2,8 +2,7 @@ name = "maintenance drone" real_name = "drone" icon = 'icons/mob/robots/drones/drone.dmi' - maxHealth = 35 - health = 35 + mob_default_max_health = 35 cell_emp_mult = 1 universal_speak = FALSE universal_understand = TRUE @@ -26,34 +25,28 @@ mob_swap_flags = SIMPLE_ANIMAL mob_push_flags = SIMPLE_ANIMAL mob_always_swap = 1 - mob_size = MOB_SIZE_SMALL laws = /datum/ai_laws/drone - silicon_camera = /obj/item/camera/siliconcam/drone_camera - - var/module_type = /obj/item/robot_module/drone - var/hat_x = 0 - var/hat_y = -13 - holder_type = /obj/item/holder/drone os_type = null starting_stock_parts = null + var/module_type = /obj/item/robot_module/drone + /mob/living/silicon/robot/drone/Initialize() . = ..() - + add_inventory_slot(new /datum/inventory_slot/head/simple) set_extension(src, /datum/extension/base_icon_state, icon_state) verbs += /mob/living/proc/hide remove_language(/decl/language/binary) add_language(/decl/language/binary, 0) add_language(/decl/language/binary/drone, 1) - set_extension(src, /datum/extension/hattable, list(hat_x, hat_y)) default_language = /decl/language/binary/drone // NO BRAIN. - mmi = null + central_processor = null //We need to screw with their HP a bit. They have around one fifth as much HP as a full borg. for(var/V in components) if(V != "power cell") @@ -63,10 +56,10 @@ verbs -= /mob/living/silicon/robot/verb/Namepick update_icon() - events_repository.register(/decl/observ/moved, src, src, /mob/living/silicon/robot/drone/proc/on_moved) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/mob/living/silicon/robot/drone, on_moved)) /mob/living/silicon/robot/drone/Destroy() - events_repository.unregister(/decl/observ/moved, src, src, /mob/living/silicon/robot/drone/proc/on_moved) + events_repository.unregister(/decl/observ/moved, src, src, TYPE_PROC_REF(/mob/living/silicon/robot/drone, on_moved)) . = ..() /mob/living/silicon/robot/drone/proc/on_moved(var/atom/movable/am, var/turf/old_loc, var/turf/new_loc) @@ -84,7 +77,7 @@ /mob/living/silicon/robot/drone/can_be_possessed_by(var/mob/observer/ghost/possessor) if(!istype(possessor) || !possessor.client || !possessor.ckey) return 0 - if(!config.allow_drone_spawn) + if(!get_config_value(/decl/config/toggle/on/allow_drone_spawn)) to_chat(src, "Playing as drones is not currently permitted.") return 0 if(too_many_active_drones()) @@ -118,8 +111,20 @@ can_pull_mobs = MOB_PULL_SAME integrated_light_power = 0.8 integrated_light_range = 5 - hat_x = 1 - hat_y = -12 + +/mob/living/silicon/robot/drone/costruction/get_bodytype() + return GET_DECL(/decl/bodytype/drone/construction) + +/decl/bodytype/drone/construction/Initialize() + equip_adjust = list( + slot_head_str = list( + "[NORTH]" = list(1, -12), + "[SOUTH]" = list(1, -12), + "[EAST]" = list(1, -12), + "[WEST]" = list(1, -12) + ) + ) + . = ..() /mob/living/silicon/robot/drone/init() additional_law_channels["Drone"] = "d" @@ -174,7 +179,7 @@ if(stat == DEAD) - if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave. + if(!get_config_value(/decl/config/toggle/on/allow_drone_spawn) || emagged || should_be_dead()) //It's dead, Dave. to_chat(user, "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.") return @@ -238,31 +243,14 @@ to_chat(src, SPAN_DANGER("ALERT: [user.real_name] is your new master. Obey your new laws and [G.his] commands.")) return 1 -//DRONE LIFE/DEATH -//For some goddamn reason robots have this hardcoded. Redefining it for our fragile friends here. -/mob/living/silicon/robot/drone/updatehealth() - if(status_flags & GODMODE) - health = 35 - set_stat(CONSCIOUS) - return - health = 35 - (getBruteLoss() + getFireLoss()) - return - -//Easiest to check this here, then check again in the robot proc. -//Standard robots use config for crit, which is somewhat excessive for these guys. -//Drones killed by damage will gib. -/mob/living/silicon/robot/drone/handle_regular_status_updates() - if(health <= -35 && src.stat != DEAD) +/mob/living/silicon/robot/drone/death() + if(stat != DEAD && should_be_dead()) self_destruct() - return - if(health <= 0 && src.stat != DEAD) - death() - return - ..() + return FALSE + . = ..() /mob/living/silicon/robot/drone/self_destruct() timeofdeath = world.time - death() //Possibly redundant, having trouble making death() cooperate. gib() //DRONE MOVEMENT. @@ -352,7 +340,7 @@ for(var/mob/living/silicon/robot/drone/D in global.silicon_mob_list) if(D.key && D.client) drones++ - return drones >= config.max_maint_drones + return drones >= get_config_value(/decl/config/num/max_maint_drones) /mob/living/silicon/robot/drone/show_laws(var/everyone = 0) if(!controlling_ai) @@ -368,3 +356,23 @@ if(!controlling_ai) return ..() controlling_ai.open_subsystem(/datum/nano_module/law_manager) + +/mob/living/silicon/robot/drone/get_bodytype() + return GET_DECL(/decl/bodytype/drone) + +/decl/bodytype/drone + name = "drone" + bodytype_flag = 0 + bodytype_category = "drone body" + +/decl/bodytype/drone/Initialize() + if(!length(equip_adjust)) + equip_adjust = list( + slot_head_str = list( + "[NORTH]" = list(0, -13), + "[SOUTH]" = list(0, -13), + "[EAST]" = list(0, -13), + "[WEST]" = list(0, -13) + ) + ) + . = ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm index db105871c13..2e5a4d814c6 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm @@ -6,19 +6,21 @@ /mob/living/silicon/robot/drone/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null) bruteloss += brute fireloss += burn + update_health() /mob/living/silicon/robot/drone/heal_overall_damage(var/brute, var/burn) - bruteloss -= brute fireloss -= burn - - if(bruteloss<0) bruteloss = 0 - if(fireloss<0) fireloss = 0 + if(bruteloss<0) + bruteloss = 0 + if(fireloss<0) + fireloss = 0 + update_health() /mob/living/silicon/robot/drone/take_organ_damage(var/brute = 0, var/burn = 0, var/bypass_armour = FALSE, var/override_droplimb) take_overall_damage(brute, burn) -/mob/living/silicon/robot/drone/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE) +/mob/living/silicon/robot/drone/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) heal_overall_damage(brute, burn) /mob/living/silicon/robot/drone/getFireLoss() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index a4d759a82de..cef20e56fe9 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -76,12 +76,11 @@ can_hold = list( /obj/item/cell, /obj/item/stock_parts, - /obj/item/mmi, + /obj/item/organ/internal/brain_interface, /obj/item/robot_parts, /obj/item/borg/upgrade, /obj/item/flash, /obj/item/organ/internal/brain, - /obj/item/organ/internal/posibrain, /obj/item/stack/cable_coil, /obj/item/stock_parts/circuitboard, /obj/item/chems/glass, @@ -199,7 +198,7 @@ var/resolved = wrapped.resolve_attackby(target,user,params) //If resolve_attackby forces waiting before taking wrapped, we need to let it finish before doing the rest. - addtimer(CALLBACK(src, .proc/finish_using, target, user, params, force_holder, resolved), 0) + addtimer(CALLBACK(src, PROC_REF(finish_using), target, user, params, force_holder, resolved), 0) else if(istype(target,/obj/item)) //Check that we're not pocketing a mob. var/obj/item/I = target diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 8e53f6adbaf..da19e46697c 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -64,14 +64,14 @@ icon_state = "drone_fab_active" var/elapsed = world.time - time_last_drone - drone_progress = round((elapsed/config.drone_build_time)*100) + drone_progress = round((elapsed/get_config_value(/decl/config/num/drone_build_time))*100) if(drone_progress >= 100) visible_message("\The [src] voices a strident beep, indicating a drone chassis is prepared.") /obj/machinery/drone_fabricator/examine(mob/user) . = ..() - if(produce_drones && drone_progress >= 100 && isghost(user) && config.allow_drone_spawn && count_drones() < config.max_maint_drones) + if(produce_drones && drone_progress >= 100 && isghost(user) && get_config_value(/decl/config/toggle/on/allow_drone_spawn) && count_drones() < get_config_value(/decl/config/num/max_maint_drones)) to_chat(user, "
    A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone.") /obj/machinery/drone_fabricator/proc/create_drone(var/client/player) @@ -79,7 +79,7 @@ if(stat & NOPOWER) return - if(!produce_drones || !config.allow_drone_spawn || count_drones() >= config.max_maint_drones) + if(!produce_drones || !get_config_value(/decl/config/toggle/on/allow_drone_spawn) || count_drones() >= get_config_value(/decl/config/num/max_maint_drones)) return if(player && !isghost(player.mob)) @@ -110,7 +110,7 @@ to_chat(user, "The game hasn't started yet!") return - if(!(config.allow_drone_spawn)) + if(!get_config_value(/decl/config/toggle/on/allow_drone_spawn)) to_chat(user, "That verb is not currently permitted.") return @@ -118,7 +118,7 @@ to_chat(user, "You are banned from playing synthetics and cannot spawn as a drone.") return - if(config.use_age_restriction_for_jobs && isnum(user.client.player_age)) + if(get_config_value(/decl/config/num/use_age_restriction_for_jobs) && isnum(user.client.player_age)) if(user.client.player_age <= 3) to_chat(user, " Your account is not old enough to play as a maintenance drone.") return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm index 12e65e16e6a..36b89ea29cf 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_remote_control.dm @@ -7,14 +7,14 @@ /mob/living/silicon/robot/drone/attack_ai(mob/living/silicon/ai/user) - if(!istype(user) || controlling_ai || !config.allow_drone_spawn) + if(!istype(user) || controlling_ai || !get_config_value(/decl/config/toggle/on/allow_drone_spawn)) return if(stat != DEAD || client || key) to_chat(user, SPAN_WARNING("You cannot take control of an autonomous, active drone.")) return - if(health < -35 || emagged) + if(current_health < -(get_max_health()) || emagged) to_chat(user, SPAN_WARNING("WARNING: connection timed out.")) return @@ -46,7 +46,7 @@ /obj/machinery/drone_fabricator/attack_ai(mob/living/silicon/ai/user) - if(!istype(user) || user.controlling_drone || !config.allow_drone_spawn) + if(!istype(user) || user.controlling_drone || !get_config_value(/decl/config/toggle/on/allow_drone_spawn)) return if(stat & NOPOWER) @@ -61,7 +61,7 @@ to_chat(user, "\The [src] is not ready to produce a new drone.") return - if(count_drones() >= config.max_maint_drones) + if(count_drones() >= get_config_value(/decl/config/num/max_maint_drones)) to_chat(user, "The drone control subsystems are tasked to capacity; they cannot support any more drones.") return diff --git a/code/modules/mob/living/silicon/robot/flying/flying.dm b/code/modules/mob/living/silicon/robot/flying/flying.dm index b242c869bb7..dbd40ea19a0 100644 --- a/code/modules/mob/living/silicon/robot/flying/flying.dm +++ b/code/modules/mob/living/silicon/robot/flying/flying.dm @@ -21,7 +21,7 @@ components["comms"] = new/datum/robot_component/binary_communication(src) components["armour"] = new/datum/robot_component/armour/light(src) -/mob/living/silicon/robot/flying/Life() +/mob/living/silicon/robot/flying/handle_regular_status_updates() . = ..() if(incapacitated() || !is_component_functioning("actuator")) stop_flying() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index df81ed97210..bf9ed519c5d 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,39 +1,12 @@ -/mob/living/silicon/robot/Life() - - SHOULD_CALL_PARENT(FALSE) - - set invisibility = 0 - set background = 1 - - if (HAS_TRANSFORMATION_MOVEMENT_HANDLER(src)) - return - - //Status updates, death etc. - clamp_values() - handle_regular_status_updates() - handle_actions() - - if(client) - handle_regular_hud_updates() - update_items() - if (src.stat != DEAD) //still using power +/mob/living/silicon/robot/handle_living_non_stasis_processes() + . = ..() + if(.) use_power() process_killswitch() process_locks() process_queued_alarms() process_os() - handle_status_effects() - UpdateLyingBuckledAndVerbStatus() - -/mob/living/silicon/robot/proc/clamp_values() - set_status(STAT_PARA, min(GET_STATUS(src, STAT_PARA), 30)) - set_status(STAT_ASLEEP, 0) - adjustBruteLoss(0) - adjustToxLoss(0) - adjustOxyLoss(0) - adjustFireLoss(0) - /mob/living/silicon/robot/proc/use_power() used_power_this_tick = 0 for(var/V in components) @@ -67,39 +40,41 @@ lights_on = 0 set_light(0) +/mob/living/silicon/robot/should_be_dead() + return current_health < get_config_value(/decl/config/num/health_health_threshold_dead) + /mob/living/silicon/robot/handle_regular_status_updates() - updatehealth() + SHOULD_CALL_PARENT(FALSE) + update_health() + set_status(STAT_PARA, min(GET_STATUS(src, STAT_PARA), 30)) if(HAS_STATUS(src, STAT_ASLEEP)) SET_STATUS_MAX(src, STAT_PARA, 3) - if(src.resting) + if(resting) SET_STATUS_MAX(src, STAT_WEAK, 5) - if(health < config.health_threshold_dead && src.stat != DEAD) //die only once - death() - - if (src.stat != DEAD) //Alive. - if (incapacitated(INCAPACITATION_DISRUPTED) || !has_power) - src.set_stat(UNCONSCIOUS) + if (stat != DEAD) //Alive. + // This previously used incapacitated(INCAPACITATION_DISRUPTED) but that was setting the robot to be permanently unconscious, which isn't ideal. + if(!has_power || incapacitated(INCAPACITATION_STUNNED) || HAS_STATUS(src, STAT_PARA)) SET_STATUS_MAX(src, STAT_BLIND, 2) - else //Not stunned. - src.set_stat(CONSCIOUS) + set_stat(UNCONSCIOUS) + else + set_stat(CONSCIOUS) else //Dead. cameranet.update_visibility(src, FALSE) SET_STATUS_MAX(src, STAT_BLIND, 2) - src.set_stat(DEAD) - src.set_density(!src.lying) - if(src.sdisabilities & BLINDED) + set_density(!lying) + if(sdisabilities & BLINDED) SET_STATUS_MAX(src, STAT_BLIND, 2) if(src.sdisabilities & DEAFENED) src.set_status(STAT_DEAF, 1) //update the state of modules and components here - if (src.stat != CONSCIOUS) + if (stat != CONSCIOUS) uneq_all() if(silicon_radio) @@ -115,8 +90,9 @@ return 1 /mob/living/silicon/robot/handle_regular_hud_updates() - ..() - + . = ..() + if(!.) + return var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src) if(hud && hud.hud) hud.hud.process_hud(src) @@ -128,16 +104,16 @@ process_med_hud(src,0,network = get_computer_network()) if(length(get_active_grabs())) - ui_drop_grab.invisibility = 0 + ui_drop_grab.set_invisibility(INVISIBILITY_NONE) ui_drop_grab.alpha = 255 else - ui_drop_grab.invisibility = INVISIBILITY_MAXIMUM + ui_drop_grab.set_invisibility(INVISIBILITY_ABSTRACT) ui_drop_grab.alpha = 0 if (src.healths) if (src.stat != DEAD) if(isdrone(src)) - switch(health) + switch(current_health) if(35 to INFINITY) src.healths.icon_state = "health0" if(25 to 34) @@ -153,7 +129,7 @@ else src.healths.icon_state = "health6" else - switch(health) + switch(current_health) if(200 to INFINITY) src.healths.icon_state = "health0" if(150 to 200) @@ -165,7 +141,7 @@ if(0 to 50) src.healths.icon_state = "health4" else - if(health > config.health_threshold_dead) + if(current_health > get_config_value(/decl/config/num/health_health_threshold_dead)) src.healths.icon_state = "health5" else src.healths.icon_state = "health6" @@ -230,6 +206,7 @@ set_fullscreen(GET_STATUS(src, STAT_BLURRY), "blurry", /obj/screen/fullscreen/blurry) set_fullscreen(GET_STATUS(src, STAT_DRUGGY), "high", /obj/screen/fullscreen/high) + update_items() return 1 /mob/living/silicon/robot/handle_vision() @@ -265,7 +242,7 @@ if (src.client) src.client.screen -= src.contents for(var/obj/I in src.contents) - if(I && !(istype(I,/obj/item/cell) || istype(I,/obj/item/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/mmi))) + if(I && !(istype(I,/obj/item/cell) || istype(I,/obj/item/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/organ/internal/brain_interface))) src.client.screen += I if(src.module_state_1) src.module_state_1:screen_loc = ui_inv1 @@ -300,6 +277,9 @@ if(on_fire) overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") -/mob/living/silicon/robot/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them - IgniteMob() +//Silicons don't gain stacks from hotspots, but hotspots can ignite them +/mob/living/silicon/increase_fire_stacks(exposed_temperature) + return + +/mob/living/silicon/can_ignite() + return !on_fire diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 8c66d4b590c..761f3e6d450 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -5,5 +5,3 @@ // Forces synths to select an icon relevant to their module if(!icon_selected && module) choose_icon(module.get_sprites_for(src)) - if(hands) - hands.icon_state = istype(module) ? lowertext(module.display_name) : "nomod" diff --git a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm index 31acbf6348a..a716a3b158c 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm @@ -57,7 +57,7 @@ var/obj/item/rsf/M = locate() in equipment M.stored_matter = 30 var/obj/item/flame/lighter/zippo/L = locate() in equipment - L.lit = 1 + L.lit = TRUE /obj/item/robot_module/clerical/butler/finalize_emag() . = ..() diff --git a/code/modules/mob/living/silicon/robot/modules/module_security.dm b/code/modules/mob/living/silicon/robot/modules/module_security.dm index 1a2421bb265..9322a91f744 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_security.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_security.dm @@ -23,15 +23,12 @@ /obj/item/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() for(var/obj/item/gun/energy/T in equipment) - if(T && T.power_supply) - if(T.power_supply.charge < T.power_supply.maxcharge) - T.power_supply.give(T.charge_cost * amount) - T.update_icon() - else - T.charge_tick = 0 - var/obj/item/baton/robot/B = locate() in equipment - if(B && B.bcell) - B.bcell.give(amount) + var/obj/item/cell/power_supply = T.get_cell() + if(power_supply.charge < power_supply.maxcharge) + power_supply.give(T.charge_cost * amount) + update_icon() + else + T.charge_tick = 0 /obj/item/robot_module/security/general name = "security robot module" diff --git a/code/modules/mob/living/silicon/robot/modules/module_uncertified.dm b/code/modules/mob/living/silicon/robot/modules/module_uncertified.dm index 582805b0e9d..6b21bb2b420 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_uncertified.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_uncertified.dm @@ -20,7 +20,7 @@ equipment = list( /obj/item/boombox, /obj/item/bikehorn/airhorn, - /obj/item/party_light, + /obj/item/flashlight/party, /obj/item/gun/launcher/money ) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5dd0f8b14c2..6bfee52611b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,8 +5,7 @@ real_name = "robot" icon = 'icons/mob/robots/robot.dmi' icon_state = ICON_STATE_WORLD - maxHealth = 300 - health = 300 + mob_default_max_health = 300 mob_sort_value = 4 z_flags = ZMM_MANGLE_PLANES @@ -35,13 +34,13 @@ //Hud stuff - var/obj/screen/inv1 = null - var/obj/screen/inv2 = null - var/obj/screen/inv3 = null + var/obj/screen/robot_module_one/inv1 + var/obj/screen/robot_module_two/inv2 + var/obj/screen/robot_module_three/inv3 var/obj/screen/robot_drop_grab/ui_drop_grab var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not - var/obj/screen/robot_modules_background + var/obj/screen/robot_modules_background/robot_modules_background //3 Modules can be activated at any one time. var/obj/item/robot_module/module = null @@ -61,7 +60,7 @@ // Components are basically robot organs. var/list/components = list() - var/obj/item/mmi/mmi = null + var/obj/item/organ/internal/central_processor var/opened = 0 var/emagged = 0 @@ -103,8 +102,7 @@ wires = new(src) - robot_modules_background = new() - robot_modules_background.icon_state = "block" + robot_modules_background = new(null, src) ident = random_id(/mob/living/silicon/robot, 1, 999) updatename(modtype) @@ -197,21 +195,15 @@ return amount return 0 -//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO -//Improved /N /mob/living/silicon/robot/Destroy() - if(mmi)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - if(mind) - mmi.dropInto(loc) - if(mmi.brainmob) - mind.transfer_to(mmi.brainmob) - else - to_chat(src, "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.") - ghostize() - //ERROR("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].") - mmi = null + if(central_processor) + central_processor.dropInto(loc) + var/mob/living/brainmob = central_processor.get_brainmob() + if(mind && brainmob) + mind.transfer_to(brainmob) else - QDEL_NULL(mmi) + ghostize() + central_processor = null if(connected_ai) connected_ai.connected_robots -= src connected_ai = null @@ -282,12 +274,10 @@ if(prefix) modtype = prefix - if(istype(mmi, /obj/item/organ/internal/posibrain)) - braintype = "Robot" - else if(istype(mmi, /obj/item/mmi/digital/robot)) - braintype = "Drone" + if(istype(central_processor)) + braintype = central_processor.get_synthetic_owner_name() else - braintype = "Cyborg" + braintype = "Robot" var/changed_name = "" if(custom_name) @@ -497,7 +487,6 @@ if (WT.weld(0)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustBruteLoss(-30) - updatehealth() add_fingerprint(user) user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the dents on \the [src]!")) else @@ -512,30 +501,36 @@ if (coil.use(1)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustFireLoss(-30) - updatehealth() user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the burnt wires on \the [src]!")) else if(IS_CROWBAR(W) && user.a_intent != I_HURT) // crowbar means open or close the cover - we all know what a crowbar is by now if(opened) if(cell) - user.visible_message("\The [user] begins clasping shut \the [src]'s maintenance hatch.", "You begin closing up \the [src].") + + user.visible_message( + SPAN_NOTICE("\The [user] begins clasping shut \the [src]'s maintenance hatch."), + SPAN_NOTICE("You begin closing up \the [src].")) + if(do_after(user, 50, src)) - to_chat(user, "You close \the [src]'s maintenance hatch.") + to_chat(user, SPAN_NOTICE("You close \the [src]'s maintenance hatch.")) opened = 0 update_icon() else if(wiresexposed && wires.IsAllCut()) - //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. - if(!mmi) - to_chat(user, "\The [src] has no brain to remove.") + //Cell is out, wires are exposed, remove CPU, produce damaged chassis, baleet original mob. + if(!central_processor) + to_chat(user, "\The [src] has no central processor to remove.") return - user.visible_message("\The [user] begins ripping [mmi] from [src].", "You jam the crowbar into the robot and begin levering [mmi].") + user.visible_message( + SPAN_NOTICE("\The [user] begins ripping \the [central_processor] out of \the [src]."), + SPAN_NOTICE("You jam the crowbar into the robot and begin levering out \the [central_processor].")) + if(do_after(user, 50, src)) dismantle(user) else - // Okay we're not removing the cell or an MMI, but maybe something else? + // Okay we're not removing the cell or a CPU, but maybe something else? var/list/removable_components = list() for(var/V in components) if(V == "power cell") continue @@ -723,11 +718,6 @@ if(module_active && istype(module_active, /obj/item/borg/combat/shield)) add_overlay("[icon_state]-shield") - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - var/image/hat = hattable?.get_hat_overlay(src) - if(hat) - add_overlay(hat) - /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) to_chat(src, "Weapon lock active, unable to use modules! Count:[weaponlock_time]") @@ -1108,7 +1098,10 @@ return ASSIGNMENT_ROBOT /mob/living/silicon/robot/handle_pre_transformation() - QDEL_NULL(mmi) + clear_brain() + +/mob/living/silicon/robot/proc/clear_brain() + QDEL_NULL(central_processor) /mob/living/silicon/robot/do_flash_animation() set waitfor = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index cb83947ce63..550429f8d68 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -1,11 +1,3 @@ -/mob/living/silicon/robot/updatehealth() - if(status_flags & GODMODE) - health = maxHealth - stat = CONSCIOUS - return - health = maxHealth - (getBruteLoss() + getFireLoss()) - return - /mob/living/silicon/robot/getBruteLoss() var/amount = 0 for(var/V in components) @@ -20,13 +12,14 @@ if(C.installed != 0) amount += C.electronics_damage return amount -/mob/living/silicon/robot/adjustBruteLoss(var/amount) +/mob/living/silicon/robot/adjustBruteLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) // take/heal overall call update_health regardless of arg if(amount > 0) take_overall_damage(amount, 0) else heal_overall_damage(-amount, 0) -/mob/living/silicon/robot/adjustFireLoss(var/amount) +/mob/living/silicon/robot/adjustFireLoss(var/amount, var/do_update_health = TRUE) if(amount > 0) take_overall_damage(0, amount) else @@ -56,7 +49,7 @@ return C return 0 -/mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE) +/mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn, var/affect_robo = FALSE, var/update_health = TRUE) var/list/datum/robot_component/parts = get_damaged_components(brute, burn) if(!parts.len) return var/datum/robot_component/picked = pick(parts) @@ -133,20 +126,16 @@ var/datum/robot_component/armour/A = get_armour() if(A) A.take_damage(brute,burn,sharp) - return - - while(parts.len && (brute>0 || burn>0) ) - var/datum/robot_component/picked = pick(parts) - - var/brute_was = picked.brute_damage - var/burn_was = picked.electronics_damage - - picked.take_damage(brute,burn) - - brute -= (picked.brute_damage - brute_was) - burn -= (picked.electronics_damage - burn_was) - - parts -= picked + else + while(parts.len && (brute>0 || burn>0) ) + var/datum/robot_component/picked = pick(parts) + var/brute_was = picked.brute_damage + var/burn_was = picked.electronics_damage + picked.take_damage(brute,burn) + brute -= (picked.brute_damage - brute_was) + burn -= (picked.electronics_damage - burn_was) + parts -= picked + update_health() /mob/living/silicon/robot/emp_act(severity) uneq_all() diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 68ba90bee99..f61cee15c28 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/borg_module/borg_rnd_analyser.dmi' icon_state = "portable_analyzer" desc = "Similar to the stationary version, this rather unwieldy device allows you to break down objects in the name of science." - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, @@ -77,77 +77,6 @@ for(var/tech in saved_tech_levels) to_chat(user, "[tech]: [saved_tech_levels[tech]]") -/obj/item/party_light - name = "party light" - desc = "An array of LEDs in tons of colors." - icon = 'icons/obj/lighting.dmi' - icon_state = "partylight-off" - item_state = "partylight-off" - material = /decl/material/solid/plastic - matter = list( - /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, - /decl/material/solid/silicon = MATTER_AMOUNT_TRACE, - ) - var/activated = 0 - var/strobe_effect = null - -/obj/item/party_light/attack_self() - if (activated) - deactivate_strobe() - else - activate_strobe() - -/obj/item/party_light/on_update_icon() - . = ..() - if (activated) - icon_state = "partylight-on" - set_light(7, 1) - else - icon_state = "partylight_off" - set_light(0) - -/obj/item/party_light/proc/activate_strobe() - activated = 1 - - // Create the party light effect and place it on the turf of who/whatever has it. - var/turf/T = get_turf(src) - var/obj/effect/party_light/L = new(T) - strobe_effect = L - - // Make the light effect follow this party light object. - events_repository.register(/decl/observ/moved, src, L, /atom/movable/proc/move_to_turf_or_null) - - update_icon() - -/obj/item/party_light/proc/deactivate_strobe() - activated = 0 - - // Cause the party light effect to stop following this object, and then delete it. - events_repository.unregister(/decl/observ/moved, src, strobe_effect, /atom/movable/proc/move_to_turf_or_null) - QDEL_NULL(strobe_effect) - - update_icon() - -/obj/item/party_light/Destroy() - deactivate_strobe() - . = .. () - -/obj/effect/party_light - name = "party light" - desc = "This is probably bad for your eyes." - icon = 'icons/effects/lens_flare.dmi' - icon_state = "party_strobe" - simulated = 0 - anchored = TRUE - pixel_x = -30 - pixel_y = -4 - -/obj/effect/party_light/Initialize() - update_icon() - . = ..() - //This is used to unlock other borg covers. /obj/item/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers. name = "access code transmission device" diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index ff5553a8004..89e537c8125 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -27,4 +27,4 @@ if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) tally-=3 - return tally+config.robot_delay + return tally+get_config_value(/decl/config/num/movement_robot) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 60f4b8dcff2..39099ccdbf0 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,34 +1,27 @@ -/mob/living/silicon/say(var/message, var/sanitize = 1) - return ..(sanitize ? sanitize(message) : message) - -/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) - log_say("[key_name(src)] : [message]") - -/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) - if(message_mode) - if(!is_component_functioning("radio")) - to_chat(src, SPAN_WARNING("Your radio isn't functional at this time.")) - else - used_radios += silicon_radio - . = TRUE +/mob/living/silicon/get_radios(var/message_mode) + . = ..() + if(message_mode && silicon_radio) + LAZYDISTINCTADD(., silicon_radio) + +/mob/living/silicon/robot/get_radios(var/message_mode) + . = ..() + if((silicon_radio in .) && !is_component_functioning("radio")) + to_chat(src, SPAN_WARNING("Your radio isn't functional at this time.")) + LAZYREMOVE(., silicon_radio) + +/mob/living/silicon/ai/handle_mob_specific_speech(message, message_mode, verb = "says", decl/language/speaking) + if(message_mode == MESSAGE_MODE_DEPARTMENT) + holopad_talk(message, verb, speaking) + return TRUE return ..() -/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) - if(message_mode) - if(message_mode == MESSAGE_MODE_DEPARTMENT) - holopad_talk(message, verb, speaking) - else if (ai_radio.disabledAi || !has_power() || stat) +/mob/living/silicon/ai/get_radios(var/message_mode) + . = ..() + if(ai_radio) + if(ai_radio.disabledAi || !has_power() || stat) to_chat(src, SPAN_DANGER("System Error - Transceiver Disabled.")) else - used_radios += ai_radio - . = TRUE - ..() - -/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) - if(message_mode) - used_radios += silicon_radio - . = TRUE - ..() + LAZYDISTINCTADD(., ai_radio) /mob/living/silicon/say_quote(var/text) var/ending = copytext(text, length(text)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index a2e3accfcb1..d0958ccfa38 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -140,16 +140,13 @@ return /mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) - if(!Proj.nodamage) switch(Proj.damage_type) if(BRUTE) adjustBruteLoss(Proj.damage) if(BURN) adjustFireLoss(Proj.damage) - Proj.on_hit(src,100) //wow this is a terrible hack - updatehealth() return 100 /mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) @@ -166,7 +163,7 @@ // this function shows the health of the AI in the Status panel /mob/living/silicon/proc/show_system_integrity() if(!src.stat) - stat(null, text("System integrity: [round((health/maxHealth)*100)]%")) + stat(null, text("System integrity: [get_health_percent()]%")) else stat(null, text("Systems nonfunctional")) @@ -193,9 +190,8 @@ //can't inject synths /mob/living/silicon/can_inject(var/mob/user, var/target_zone) - to_chat(user, "The armoured plating is too tough.") - return 0 - + to_chat(user, SPAN_WARNING("The armoured plating is too tough.")) + return FALSE //Silicon mob language procs @@ -451,15 +447,20 @@ os.Process() /mob/living/silicon/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + SET_STATUS_MAX(src, STAT_PARA, flash_strength) SET_STATUS_MAX(src, STAT_WEAK, flash_strength) return TRUE /mob/living/silicon/get_speech_bubble_state_modifier() return "synth" -/mob/living/silicon/GetIdCards() +/mob/living/silicon/GetIdCards(list/exceptions) . = ..() - if(stat || (ckey && !client)) - return // Unconscious, dead or once possessed but now client-less silicons are not considered to have id access. - if(istype(idcard)) + // Unconscious, dead or once possessed but now client-less silicons are not considered to have id access. + // This seems to be specifically to stop ghosted maintenance drones being used as free all-access cards. + if(istype(idcard) && !stat && !(ckey && !client) && !is_type_in_list(idcard, exceptions)) LAZYDISTINCTADD(., idcard) + +/mob/living/silicon/get_total_life_damage() + return (getBruteLoss() + getFireLoss()) + diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index be952b3df5e..fb03130e74d 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -30,7 +30,7 @@ if(/datum/nano_module/alarm_monitor/all in silicon_subsystems) for(var/datum/alarm_handler/AH in SSalarm.all_handlers) - AH.register_alarm(src, /mob/living/silicon/proc/receive_alarm) + AH.register_alarm(src, TYPE_PROC_REF(/mob/living/silicon, receive_alarm)) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order /mob/living/silicon/proc/init_subsystem(var/subsystem_type) diff --git a/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm b/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm index eab06762cf6..9da0d3f917f 100644 --- a/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm +++ b/code/modules/mob/living/simple_animal/aquatic/_aquatic.dm @@ -11,8 +11,8 @@ meat_amount = 1 bone_amount = 1 skin_amount = 2 - bone_material = /decl/material/solid/bone/fish - skin_material = /decl/material/solid/skin/fish + bone_material = /decl/material/solid/organic/bone/fish + skin_material = /decl/material/solid/organic/skin/fish /mob/living/simple_animal/aquatic/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm b/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm index 6b9d6e14a65..44f14afd565 100644 --- a/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm +++ b/code/modules/mob/living/simple_animal/aquatic/_aquatic_hostile.dm @@ -13,5 +13,5 @@ meat_amount = 3 bone_amount = 5 skin_amount = 5 - bone_material = /decl/material/solid/bone/fish - skin_material = /decl/material/solid/skin/fish + bone_material = /decl/material/solid/organic/bone/fish + skin_material = /decl/material/solid/organic/skin/fish diff --git a/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm b/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm index 0dc9992caf6..a77a133afb5 100644 --- a/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm +++ b/code/modules/mob/living/simple_animal/aquatic/_aquatic_retaliate.dm @@ -13,5 +13,5 @@ meat_amount = 3 bone_amount = 5 skin_amount = 5 - bone_material = /decl/material/solid/bone/fish - skin_material = /decl/material/solid/skin/fish \ No newline at end of file + bone_material = /decl/material/solid/organic/bone/fish + skin_material = /decl/material/solid/organic/skin/fish \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm index 2ff829b00dc..1200dcd7cd6 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_carp.dm @@ -3,8 +3,7 @@ desc = "A ferocious fish. May be too hardcore." icon = 'icons/mob/simple_animal/fish_carp.dmi' faction = "fishes" - maxHealth = 20 - health = 20 + mob_default_max_health = 20 meat_type = /obj/item/chems/food/fish/carp /mob/living/simple_animal/hostile/retaliate/aquatic/carp/Initialize() diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index 6e9debe9174..ebab3555537 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -2,8 +2,7 @@ name = "small fish" desc = "Glub glub." faction = "fishes" - maxHealth = 10 - health = 10 + mob_default_max_health = 10 mob_size = MOB_SIZE_TINY can_pull_size = 0 can_pull_mobs = 0 diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm index f88940480cf..12516db07ff 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_sharks.dm @@ -2,8 +2,7 @@ name = "shark" desc = "A ferocious fish with many, many teeth." icon = 'icons/mob/simple_animal/shark.dmi' - maxHealth = 150 - health = 150 + mob_default_max_health = 150 natural_weapon = /obj/item/natural_weapon/bite/shark break_stuff_probability = 15 faction = "sharks" @@ -12,8 +11,8 @@ meat_amount = 5 bone_amount = 15 skin_amount = 15 - bone_material = /decl/material/solid/bone/cartilage - skin_material = /decl/material/solid/skin/shark + bone_material = /decl/material/solid/organic/bone/cartilage + skin_material = /decl/material/solid/organic/skin/shark /obj/item/natural_weapon/bite/shark force = 20 @@ -28,8 +27,7 @@ speed = 0 mob_size = MOB_SIZE_LARGE pixel_x = -16 - health = 400 - maxHealth = 400 + mob_default_max_health = 400 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/giantshark break_stuff_probability = 35 diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index e42bc8a005a..23d000c9ea5 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -43,6 +43,9 @@ var/list/construct_spells = list() +/mob/living/simple_animal/construct/check_has_mouth() + return FALSE + /mob/living/simple_animal/construct/on_defilement() return @@ -65,7 +68,7 @@ /mob/living/simple_animal/construct/attack_animal(var/mob/user) if(istype(user, /mob/living/simple_animal/construct/builder)) - if(health < maxHealth) + if(current_health < get_max_health()) adjustBruteLoss(-5) user.visible_message("\The [user] mends some of \the [src]'s wounds.") else @@ -75,8 +78,9 @@ /mob/living/simple_animal/construct/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..(user) - if(health < maxHealth) - if(health >= maxHealth/2) + var/current_max_health = get_max_health() + if(current_health < current_max_health) + if(current_health >= current_max_health/2) to_chat(user, SPAN_WARNING("It looks slightly dented.")) else to_chat(user, SPAN_DANGER("It looks severely dented!")) @@ -98,8 +102,7 @@ real_name = "Juggernaut" desc = "A possessed suit of armour driven by the will of the restless dead" icon = 'icons/mob/simple_animal/construct_behemoth.dmi' - maxHealth = 250 - health = 250 + mob_default_max_health = 250 speak_emote = list("rumbles") response_harm = "harmlessly punches" harm_intent_damage = 0 @@ -119,7 +122,7 @@ hitsound = 'sound/weapons/heavysmash.ogg' force = 30 -/mob/living/simple_animal/construct/armoured/Life() +/mob/living/simple_animal/construct/armoured/handle_regular_status_updates() set_status(STAT_WEAK, 0) if ((. = ..())) return @@ -156,8 +159,7 @@ real_name = "Wraith" desc = "A wicked bladed shell contraption piloted by a bound spirit" icon = 'icons/mob/simple_animal/construct_floating.dmi' - maxHealth = 75 - health = 75 + mob_default_max_health = 75 natural_weapon = /obj/item/natural_weapon/wraith speed = -1 environment_smash = 1 @@ -181,8 +183,7 @@ real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" icon = 'icons/mob/simple_animal/construct_artificer.dmi' - maxHealth = 50 - health = 50 + mob_default_max_health = 50 response_harm = "viciously beaten" harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/cult_builder @@ -208,8 +209,7 @@ real_name = "Behemoth" desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." icon = 'icons/mob/simple_animal/construct_behemoth.dmi' - maxHealth = 750 - health = 750 + mob_default_max_health = 750 speak_emote = list("rumbles") response_harm = "harmlessly punches" harm_intent_damage = 0 @@ -232,8 +232,7 @@ real_name = "Harvester" desc = "The promised reward of the livings who follow Nar-Sie. Obtained by offering their bodies to the geometer of blood" icon = 'icons/mob/simple_animal/construct_harvester.dmi' - maxHealth = 150 - health = 150 + mob_default_max_health = 150 natural_weapon = /obj/item/natural_weapon/harvester speed = -1 environment_smash = 1 @@ -252,18 +251,22 @@ force = 25 ////////////////HUD////////////////////// +/mob/living/simple_animal/construct/handle_regular_status_updates() + . = ..() + if(.) + silence_spells(purge) -/mob/living/simple_animal/construct/Life() +/mob/living/simple_animal/construct/handle_regular_hud_updates() . = ..() if(.) if(fire) fire.icon_state = "fire[!!fire_alert]" silence_spells(purge) -/mob/living/simple_animal/construct/armoured/Life() +/mob/living/simple_animal/construct/armoured/handle_regular_hud_updates() . = ..() - if(healths) - switch(health) + if(. && healths) + switch(current_health) if(250 to INFINITY) healths.icon_state = "juggernaut_health0" if(208 to 249) healths.icon_state = "juggernaut_health1" if(167 to 207) healths.icon_state = "juggernaut_health2" @@ -274,10 +277,10 @@ else healths.icon_state = "juggernaut_health7" -/mob/living/simple_animal/construct/behemoth/Life() +/mob/living/simple_animal/construct/behemoth/handle_regular_hud_updates() . = ..() - if(healths) - switch(health) + if(. && healths) + switch(current_health) if(750 to INFINITY) healths.icon_state = "juggernaut_health0" if(625 to 749) healths.icon_state = "juggernaut_health1" if(500 to 624) healths.icon_state = "juggernaut_health2" @@ -287,10 +290,10 @@ if(1 to 124) healths.icon_state = "juggernaut_health6" else healths.icon_state = "juggernaut_health7" -/mob/living/simple_animal/construct/builder/Life() +/mob/living/simple_animal/construct/builder/handle_regular_hud_updates() . = ..() - if(healths) - switch(health) + if(. && healths) + switch(current_health) if(50 to INFINITY) healths.icon_state = "artificer_health0" if(42 to 49) healths.icon_state = "artificer_health1" if(34 to 41) healths.icon_state = "artificer_health2" @@ -302,10 +305,10 @@ -/mob/living/simple_animal/construct/wraith/Life() +/mob/living/simple_animal/construct/wraith/handle_regular_hud_updates() . = ..() - if(healths) - switch(health) + if(. && healths) + switch(current_health) if(75 to INFINITY) healths.icon_state = "wraith_health0" if(62 to 74) healths.icon_state = "wraith_health1" if(50 to 61) healths.icon_state = "wraith_health2" @@ -316,10 +319,10 @@ else healths.icon_state = "wraith_health7" -/mob/living/simple_animal/construct/harvester/Life() +/mob/living/simple_animal/construct/harvester/handle_regular_hud_updates() . = ..() - if(healths) - switch(health) + if(. && healths) + switch(current_health) if(150 to INFINITY) healths.icon_state = "harvester_health0" if(125 to 149) healths.icon_state = "harvester_health1" if(100 to 124) healths.icon_state = "harvester_health2" diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index cba1c3eed2f..884576424d5 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -5,7 +5,7 @@ desc = "A strange, ridged chunk of some glassy red material. Achingly cold to the touch." w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY - origin_tech = "{'wormholes':4,'materials':4}" + origin_tech = @'{"wormholes":4,"materials":4}' material = /decl/material/solid/gemstone/crystal var/full = SOULSTONE_EMPTY var/is_evil = 1 diff --git a/code/modules/mob/living/simple_animal/crow/crow.dm b/code/modules/mob/living/simple_animal/crow/crow.dm index bb043602245..e15325ad048 100644 --- a/code/modules/mob/living/simple_animal/crow/crow.dm +++ b/code/modules/mob/living/simple_animal/crow/crow.dm @@ -1,12 +1,12 @@ -/obj/item/storage/messenger - name = "messenger bag" +/obj/item/storage/backpack/messenger/corvid_couriers + name = "corvid messenger bag" desc = "A small green-grey messenger bag with a blue Corvid Couriers logo on it." - icon = 'icons/obj/items/messenger_bag.dmi' + icon = 'icons/obj/items/storage/backpack/corvid.dmi' icon_state = ICON_STATE_WORLD storage_slots = 7 w_class = ITEM_SIZE_SMALL max_w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth /mob/living/simple_animal/crow name = "crow" @@ -26,8 +26,16 @@ universal_speak = TRUE pass_flags = PASS_FLAG_TABLE - var/obj/item/storage/messenger/messenger_bag - var/obj/item/card/id/access_card + +/mob/living/simple_animal/crow/get_overlay_state_modifier() + return (stat == DEAD) ? "-dead" : null + +/decl/bodytype/animal/crow + name = "crow" + bodytype_category = "crow body" + +/mob/living/simple_animal/crow/get_bodytype() + return GET_DECL(/decl/bodytype/animal/crow) /obj/item/natural_weapon/crow_claws name = "claws" @@ -38,102 +46,40 @@ /mob/living/simple_animal/crow/Initialize() . = ..() - messenger_bag = new(src) + add_inventory_slot(new /datum/inventory_slot/back/simple) + add_inventory_slot(new /datum/inventory_slot/id) + add_held_item_slot(new /datum/inventory_slot/gripper/mouth/simple) + equip_to_slot_or_del(new /obj/item/storage/backpack/messenger/corvid_couriers(src), slot_back_str) update_icon() -/mob/living/simple_animal/crow/GetIdCards() - . = ..() - if (istype(access_card)) - LAZYDISTINCTADD(., access_card) - -/mob/living/simple_animal/crow/show_stripping_window(var/mob/user) - if(user.incapacitated()) - return - var/list/dat = list() - if(access_card) - dat += "ID: [access_card] (Remove)" - else - dat += "ID: Nothing" - if(messenger_bag) - dat += "Back: [messenger_bag] (Remove)" - else - dat += "Back: Nothing" - var/datum/browser/popup = new(user, "[name]", "Inventory of \the [name]", 350, 150, src) - popup.set_content(jointext(dat, "
    ")) - popup.open() +/mob/living/simple_animal/crow/get_dexterity(var/silent) + return (DEXTERITY_EQUIP_ITEM|DEXTERITY_HOLD_ITEM) /mob/living/simple_animal/crow/DefaultTopicState() return global.physical_topic_state -/mob/living/simple_animal/crow/OnTopic(mob/user, href_list) - if(!ishuman(user)) - return ..() - if(href_list["remove_inv"]) - var/obj/item/removed - switch(href_list["remove_inv"]) - if("access cuff") - removed = access_card - access_card = null - if("back") - removed = messenger_bag - messenger_bag = null - if(removed) - removed.dropInto(loc) - usr.put_in_hands(removed) - visible_message("\The [usr] removes \the [removed] from \the [src]'s [href_list["remove_inv"]].") - show_stripping_window(usr) - update_icon() - else - to_chat(user, "There is nothing to remove from \the [src]'s [href_list["remove_inv"]].") - return TOPIC_HANDLED - if(href_list["add_inv"]) - var/obj/item/equipping = user.get_active_hand() - if(!equipping) - to_chat(user, "You have nothing in your hand to put on \the [src]'s [href_list["add_inv"]].") - return 0 - var/obj/item/equipped - var/checktype - switch(href_list["add_inv"]) - if("access cuff") - equipped = access_card - checktype = /obj/item/card/id - if("back") - equipped = messenger_bag - checktype = /obj/item/storage/messenger - if(equipped) - to_chat(user, "There is already something worn on \the [src]'s [href_list["add_inv"]].") - return TOPIC_HANDLED - if(!istype(equipping, checktype)) - to_chat(user, "\The [equipping] won't fit on \the [src]'s [href_list["add_inv"]].") - return TOPIC_HANDLED - switch(href_list["add_inv"]) - if("access cuff") - access_card = equipping - if("back") - messenger_bag = equipping - if(!user.try_unequip(equipping, src)) - return TOPIC_HANDLED - visible_message("\The [user] places \the [equipping] on to \the [src]'s [href_list["add_inv"]].") - update_icon() - show_stripping_window(user) - return TOPIC_HANDLED +// Let people interact with the Bird Storage. +/mob/living/simple_animal/crow/attack_hand(mob/user) + if(user.a_intent == I_HELP) + var/obj/item/backpack = get_equipped_item(slot_back_str) + if(backpack) + return backpack.attack_hand(user) return ..() -/mob/living/simple_animal/crow/show_examined_worn_held_items(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - . = ..() - if(Adjacent(src)) - if(messenger_bag) - if(messenger_bag.contents.len) - to_chat(user, "It's wearing a little messenger bag with a Corvid Couriers logo on it. There's something stuffed inside.") - else - to_chat(user, "It's wearing a little messenger bag with a Corvid Couriers logo on it. It seems to be empty.") - if(access_card) - to_chat(user, "It has an access cuff with \the [access_card] inserted.") +/mob/living/simple_animal/crow/attackby(obj/item/I, mob/user) + if(user.a_intent == I_HELP) + var/obj/item/backpack = get_equipped_item(slot_back_str) + if(backpack) + return backpack.attackby(I, user) + return ..() /mob/living/simple_animal/crow/on_update_icon() ..() - if(messenger_bag) - add_overlay("[icon_state]-bag") + var/obj/item/backpack = get_equipped_item(slot_back_str) + if(backpack) + var/overlay_state = "crow-[icon_state]-bag" + if(check_state_in_icon(overlay_state, backpack.icon)) + add_overlay(image(backpack.icon, overlay_state)) /mob/living/simple_animal/crow/cyber name = "cybercrow" diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm index 5778aa1450c..05a97123b3f 100644 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ b/code/modules/mob/living/simple_animal/familiars/familiars.dm @@ -23,12 +23,8 @@ name = "carcinus" desc = "A small crab said to be made of stone and starlight." icon = 'icons/mob/simple_animal/evilcrab.dmi' - speak_emote = list("chitters","clicks") - - - health = 200 - maxHealth = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/pincers/strong resistance = 9 can_escape = TRUE //snip snip @@ -44,16 +40,13 @@ desc = "A bigger, more magical cousin of the space carp." icon = 'icons/mob/simple_animal/spaceshark.dmi' pixel_x = -16 + offset_overhead_text_x = 16 speak_emote = list("gnashes") - - health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite can_escape = TRUE - min_gas = null - wizardy_spells = list(/spell/aoe_turf/conjure/forcewall) /mob/living/simple_animal/familiar/pike/Process_Spacemove() @@ -64,14 +57,10 @@ desc = "Looking at it fills you with dread." icon = 'icons/mob/simple_animal/horror.dmi' speak_emote = list("moans", "groans") - response_help_1p = "You think better of touching $TARGET$." response_help_3p = "$USER$ thinks better of touching $TARGET$." - - health = 150 - maxHealth = 150 + mob_default_max_health = 150 natural_weapon = /obj/item/natural_weapon/horror - wizardy_spells = list(/spell/targeted/torment) /obj/item/natural_weapon/horror @@ -94,8 +83,7 @@ icon = 'icons/mob/simple_animal/amaros.dmi' speak_emote = list("entones") mob_size = MOB_SIZE_SMALL - health = 25 - maxHealth = 25 + mob_default_max_health = 25 wizardy_spells = list( /spell/targeted/heal_target, /spell/targeted/heal_target/area @@ -105,16 +93,12 @@ name = "elderly mouse" desc = "A small rodent. It looks very old." icon = 'icons/mob/simple_animal/mouse_gray.dmi' - speak_emote = list("squeeks") holder_type = /obj/item/holder/mouse pass_flags = PASS_FLAG_TABLE mob_size = MOB_SIZE_MINISCULE - response_harm = "stamps on" - - health = 15 - maxHealth = 15 + mob_default_max_health = 15 natural_weapon = /obj/item/natural_weapon/bite/mouse can_escape = TRUE @@ -133,7 +117,6 @@ speak_emote = list("meows", "purrs") holder_type = /obj/item/holder mob_size = MOB_SIZE_SMALL - health = 25 - maxHealth = 25 + mob_default_max_health = 25 natural_weapon = /obj/item/natural_weapon/claws/weak wizardy_spells = list(/spell/targeted/subjugation) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 3f6d9e3d949..5dd92b4c64b 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -16,21 +16,24 @@ mob_size = MOB_SIZE_SMALL possession_candidate = 1 pass_flags = PASS_FLAG_TABLE - skin_material = /decl/material/solid/skin/fur/orange + skin_material = /decl/material/solid/organic/skin/fur/orange base_animal_type = /mob/living/simple_animal/cat - var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target var/mob/flee_target -/mob/living/simple_animal/cat/Initialize() - if(isnull(hat_offsets)) - hat_offsets = list( +/mob/living/simple_animal/cat/get_bodytype() + return GET_DECL(/decl/bodytype/animal/cat) + +/decl/bodytype/animal/cat/Initialize() + equip_adjust = list( + slot_head_str = list( "[NORTH]" = list( 1, -9), "[SOUTH]" = list( 1, -12), "[EAST]" = list( 7, -10), "[WEST]" = list(-7, -10) ) + ) . = ..() /mob/living/simple_animal/cat/do_delayed_life_action() @@ -138,7 +141,7 @@ desc = "The by-product of cat farming." icon = 'icons/obj/items/sheet_hide.dmi' icon_state = "sheet-cat" - material = /decl/material/solid/leather/fur + material = /decl/material/solid/organic/leather/fur //Basic friend AI /mob/living/simple_animal/cat/fluff @@ -150,7 +153,7 @@ var/follow_dist = 4 if (friend.stat >= DEAD || friend.is_asystole()) //danger follow_dist = 1 - else if (friend.stat || friend.health <= 50) //danger or just sleeping + else if (friend.stat || friend.current_health <= 50) //danger or just sleeping follow_dist = 2 var/near_dist = max(follow_dist - 2, 1) var/current_dist = get_dist(src, friend) @@ -192,7 +195,7 @@ "brushes against [friend].", "rubs against [friend].", "purrs.")) - else if (friend.health <= 50) + else if (friend.current_health <= 50) if (prob(10)) var/verb = pick("meows", "mews", "mrowls") audible_emote("[verb] anxiously.") @@ -226,11 +229,11 @@ desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally." gender = FEMALE icon = 'icons/mob/simple_animal/cat_black.dmi' - skin_material = /decl/material/solid/skin/fur/black + skin_material = /decl/material/solid/organic/skin/fur/black holder_type = /obj/item/holder/runtime /obj/item/holder/runtime - origin_tech = "{'programming':1,'biotech':1}" + origin_tech = @'{"programming":1,"biotech":1}' /mob/living/simple_animal/cat/kitten name = "kitten" @@ -241,14 +244,21 @@ bone_amount = 3 skin_amount = 3 -/mob/living/simple_animal/cat/kitten/Initialize() - if(isnull(hat_offsets)) - hat_offsets = list( +/mob/living/simple_animal/cat/kitten/get_bodytype() + return GET_DECL(/decl/bodytype/animal/kitten) + +/decl/bodytype/animal/kitten/Initialize() + equip_adjust = list( + slot_head_str = list( "[NORTH]" = list( 1, -14), "[SOUTH]" = list( 1, -14), "[EAST]" = list( 5, -14), "[WEST]" = list(-5, -14) ) + ) + . = ..() + +/mob/living/simple_animal/cat/kitten/Initialize() . = ..() gender = pick(MALE, FEMALE) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index e89026fcb0e..38823335ca0 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -20,16 +20,20 @@ meat_type = /obj/item/chems/food/meat/corgi meat_amount = 3 - skin_material = /decl/material/solid/skin/fur/orange + skin_material = /decl/material/solid/organic/skin/fur/orange -/mob/living/simple_animal/corgi/Initialize() - if(isnull(hat_offsets)) - hat_offsets = list( +/mob/living/simple_animal/corgi/get_bodytype() + return GET_DECL(/decl/bodytype/animal/corgi) + +/decl/bodytype/animal/corgi/Initialize() + equip_adjust = list( + slot_head_str = list( "[NORTH]" = list( 1, -8), "[SOUTH]" = list( 1, -8), "[EAST]" = list( 7, -8), "[WEST]" = list(-7, -8) ) + ) . = ..() /mob/living/simple_animal/corgi/harvest_skin() @@ -41,7 +45,7 @@ desc = "The by-product of corgi farming." icon = 'icons/obj/items/sheet_hide.dmi' icon_state = "sheet-corgi" - material = /decl/material/solid/skin/fur/orange + material = /decl/material/solid/organic/skin/fur/orange //IAN! SQUEEEEEEEEE~ /mob/living/simple_animal/corgi/Ian @@ -126,14 +130,21 @@ skin_amount = 3 bone_amount = 3 -/mob/living/simple_animal/corgi/puppy/Initialize() - if(isnull(hat_offsets)) - hat_offsets = list( +/mob/living/simple_animal/corgi/puppy/get_bodytype() + return GET_DECL(/decl/bodytype/animal/puppy) + +/decl/bodytype/animal/puppy/Initialize() + equip_adjust = list( + slot_head_str = list( "[NORTH]" = list( 0, -12), "[SOUTH]" = list( 0, -12), "[EAST]" = list( 5, -14), "[WEST]" = list(-5, -14) ) + ) + . = ..() + +/mob/living/simple_animal/corgi/puppy/Initialize() . = ..() gender = pick(MALE, FEMALE) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 4d45259f996..764b7b281d4 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -21,14 +21,23 @@ ai = /datum/ai/crab meat_amount = 3 - skin_material = /decl/material/solid/skin/insect + skin_material = /decl/material/solid/organic/skin/insect skin_amount = 10 bone_material = null bone_amount = 0 -/mob/living/simple_animal/crab/Initialize() - if(isnull(hat_offsets)) - hat_offsets = list("[SOUTH]" = list(-1, -10)) +/mob/living/simple_animal/crab/get_bodytype() + return GET_DECL(/decl/bodytype/animal/crab) + +/decl/bodytype/animal/crab/Initialize() + equip_adjust = list( + slot_head_str = list( + "[NORTH]" = list(-1, -10), + "[SOUTH]" = list(-1, -10), + "[EAST]" = list(-1, -10), + "[WEST]" = list(-1, -10) + ) + ) . = ..() /datum/ai/crab diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index ba19248f19e..82f26fade46 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -11,13 +11,13 @@ turns_per_move = 5 see_in_dark = 6 faction = "goat" - health = 40 + mob_default_max_health = 40 natural_weapon = /obj/item/natural_weapon/hooves meat_type = /obj/item/chems/food/meat/goat meat_amount = 4 bone_amount = 8 - skin_material = /decl/material/solid/skin/goat + skin_material = /decl/material/solid/organic/skin/goat skin_amount = 8 ai = /datum/ai/goat @@ -28,10 +28,9 @@ expected_type = /mob/living/simple_animal/hostile/retaliate/goat /datum/ai/goat/do_process(time_elapsed) - . = ..() - var/mob/living/simple_animal/hostile/retaliate/goat/goat = body //chance to go crazy and start wacking stuff + var/mob/living/simple_animal/hostile/retaliate/goat/goat = body if(!length(goat.enemies) && prob(1)) goat.Retaliate() @@ -66,7 +65,7 @@ QDEL_NULL(udder) . = ..() -/mob/living/simple_animal/hostile/retaliate/goat/handle_regular_status_updates() +/mob/living/simple_animal/hostile/retaliate/goat/handle_living_non_stasis_processes() . = ..() if(. && stat == CONSCIOUS && udder && prob(5)) udder.add_reagent(/decl/material/liquid/drink/milk, rand(5, 10)) @@ -100,12 +99,12 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - health = 50 + mob_default_max_health = 50 meat_type = /obj/item/chems/food/meat/beef meat_amount = 6 bone_amount = 10 - skin_material = /decl/material/solid/skin/cow + skin_material = /decl/material/solid/organic/skin/cow skin_amount = 10 var/datum/reagents/udder = null @@ -140,7 +139,7 @@ return TRUE . = ..() -/mob/living/simple_animal/cow/handle_regular_status_updates() +/mob/living/simple_animal/cow/handle_living_non_stasis_processes() . = ..() if(. && udder && prob(5)) udder.add_reagent(/decl/material/liquid/drink/milk, rand(5, 10)) @@ -149,7 +148,7 @@ if(stat != DEAD && !HAS_STATUS(src, STAT_WEAK)) user.visible_message(SPAN_NOTICE("\The [user] tips over \the [src].")) SET_STATUS_MAX(src, STAT_WEAK, 30) - addtimer(CALLBACK(src, .proc/do_tip_response), rand(20, 50)) + addtimer(CALLBACK(src, PROC_REF(do_tip_response)), rand(20, 50)) return TRUE return ..() @@ -167,7 +166,7 @@ emote_see = list("pecks at the ground","flaps its tiny wings") speak_chance = 2 turns_per_move = 2 - health = 1 + mob_default_max_health = 1 pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE mob_size = MOB_SIZE_MINISCULE @@ -175,7 +174,7 @@ meat_amount = 1 bone_amount = 3 skin_amount = 3 - skin_material = /decl/material/solid/skin/feathers + skin_material = /decl/material/solid/organic/skin/feathers var/amount_grown = 0 @@ -184,14 +183,13 @@ pixel_x = rand(-6, 6) pixel_y = rand(0, 10) -/mob/living/simple_animal/chick/Life() +/mob/living/simple_animal/chick/handle_living_non_stasis_processes() . = ..() - if(!.) - return FALSE - amount_grown += rand(1,2) - if(amount_grown >= 100) - new /mob/living/simple_animal/chicken(src.loc) - qdel(src) + if(.) + amount_grown += rand(1,2) + if(amount_grown >= 100) + new /mob/living/simple_animal/chicken(src.loc) + qdel(src) var/global/const/MAX_CHICKENS = 50 var/global/chicken_count = 0 @@ -206,13 +204,13 @@ var/global/chicken_count = 0 emote_see = list("pecks at the ground","flaps its wings viciously") speak_chance = 2 turns_per_move = 3 - health = 10 + mob_default_max_health = 10 pass_flags = PASS_FLAG_TABLE mob_size = MOB_SIZE_SMALL meat_type = /obj/item/chems/food/meat/chicken meat_amount = 2 - skin_material = /decl/material/solid/skin/feathers + skin_material = /decl/material/solid/organic/skin/feathers var/eggsleft = 0 var/body_color @@ -251,11 +249,9 @@ var/global/chicken_count = 0 else ..() -/mob/living/simple_animal/chicken/Life() +/mob/living/simple_animal/chicken/handle_living_non_stasis_processes() . = ..() - if(!.) - return FALSE - if(prob(3) && eggsleft > 0) + if(. && prob(3) && eggsleft > 0) visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]") eggsleft-- var/obj/item/chems/food/egg/E = new(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/friendly/koala.dm b/code/modules/mob/living/simple_animal/friendly/koala.dm index ecf21426047..ef7eba50ca6 100644 --- a/code/modules/mob/living/simple_animal/friendly/koala.dm +++ b/code/modules/mob/living/simple_animal/friendly/koala.dm @@ -3,8 +3,7 @@ name = "koala" desc = "A little grey bear. How long is he gonna sleep today?" icon = 'icons/mob/simple_animal/koala.dmi' - maxHealth = 45 - health = 45 + mob_default_max_health = 45 speed = 4 speak = list("Rrr", "Wraarh...", "Pfrrr...") speak_emote = list("roar") diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 3f8ddca2abc..093245642b3 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -3,8 +3,7 @@ desc = "A cute tiny lizard." icon = 'icons/mob/simple_animal/lizard.dmi' speak_emote = list("hisses") - health = 5 - maxHealth = 5 + mob_default_max_health = 5 natural_weapon = /obj/item/natural_weapon/bite/weak response_harm = "stamps on" mob_size = MOB_SIZE_MINISCULE @@ -15,4 +14,4 @@ meat_amount = 1 bone_amount = 1 skin_amount = 1 - skin_material = /decl/material/solid/skin/lizard + skin_material = /decl/material/solid/organic/skin/lizard diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 099ed0c928c..4e841b450f1 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -11,8 +11,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - health = 5 - maxHealth = 5 + mob_default_max_health = 5 response_harm = "stamps on" density = FALSE minbodytemp = 223 //Below -50 Degrees Celsius @@ -30,14 +29,14 @@ meat_amount = 1 bone_amount = 1 skin_amount = 1 - skin_material = /decl/material/solid/skin/fur + skin_material = /decl/material/solid/organic/skin/fur ai = /datum/ai/mouse var/body_color //brown, gray and white, leave blank for random var/splatted = FALSE -/mob/living/simple_animal/mouse/get_dexterity(var/silent = FALSE) +/mob/living/simple_animal/mouse/get_dexterity(var/silent) return DEXTERITY_NONE // Mice are troll bait, give them no power. /datum/ai/mouse @@ -57,7 +56,7 @@ mouse.set_stat(CONSCIOUS) mouse.wander = 1 else if(prob(5)) - INVOKE_ASYNC(mouse, /mob/living/simple_animal/proc/audible_emote, "snuffles.") + INVOKE_ASYNC(mouse, TYPE_PROC_REF(/mob/living/simple_animal, audible_emote), "snuffles.") /mob/living/simple_animal/mouse/Initialize() verbs += /mob/living/proc/ventcrawl @@ -73,17 +72,17 @@ body_color = pick( list("brown","gray","white") ) switch(body_color) if("gray") - skin_material = /decl/material/solid/skin/fur/gray + skin_material = /decl/material/solid/organic/skin/fur/gray icon = 'icons/mob/simple_animal/mouse_gray.dmi' if("white") - skin_material = /decl/material/solid/skin/fur/white + skin_material = /decl/material/solid/organic/skin/fur/white icon = 'icons/mob/simple_animal/mouse_white.dmi' if("brown") icon = 'icons/mob/simple_animal/mouse_brown.dmi' desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." /mob/living/simple_animal/mouse/proc/splat() - adjustBruteLoss(maxHealth) // Enough damage to kill + adjustBruteLoss(get_max_health()) // Enough damage to kill splatted = TRUE death() @@ -92,13 +91,12 @@ if(stat == DEAD && splatted) icon_state = "world-splat" -/mob/living/simple_animal/mouse/Crossed(AM) - if( ishuman(AM) ) - if(!stat) - var/mob/M = AM - to_chat(M, "[html_icon(src)] Squeek!") - sound_to(M, 'sound/effects/mousesqueek.ogg') +/mob/living/simple_animal/mouse/Crossed(atom/movable/AM) ..() + if(!ishuman(AM) || stat) + return + to_chat(AM, SPAN_WARNING("[html_icon(src)] Squeek!")) + sound_to(AM, 'sound/effects/mousesqueek.ogg') /* * Mouse types @@ -132,9 +130,8 @@ desc = "A large rodent, often seen hiding in maintenance areas and making a nuisance of itself." body_color = "rat" icon = 'icons/mob/simple_animal/rat.dmi' - skin_material = /decl/material/solid/skin/fur/gray - maxHealth = 20 - health = 20 + skin_material = /decl/material/solid/organic/skin/fur/gray + mob_default_max_health = 20 /mob/living/simple_animal/mouse/rat/set_mouse_icon() return diff --git a/code/modules/mob/living/simple_animal/friendly/mushroom.dm b/code/modules/mob/living/simple_animal/friendly/mushroom.dm index 7ff5cd05078..c73bcdd1f8f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mushroom.dm +++ b/code/modules/mob/living/simple_animal/friendly/mushroom.dm @@ -5,8 +5,7 @@ mob_size = MOB_SIZE_SMALL speak_chance = 0 turns_per_move = 1 - health = 5 - maxHealth = 5 + mob_default_max_health = 5 harm_intent_damage = 5 pass_flags = PASS_FLAG_TABLE @@ -51,7 +50,7 @@ . = ..(gibbed, deathmessage, show_dead_message) if(.) total_mushrooms-- - if(total_mushrooms < config.maximum_mushrooms && prob(30)) + if(total_mushrooms < get_config_value(/decl/config/num/maximum_mushrooms) && prob(30)) spore_explode() /mob/living/simple_animal/mushroom/proc/spore_explode() diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 823c15a29da..d9d8fef29a4 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -11,8 +11,7 @@ speak_chance = 1 turns_per_move = 3 see_in_dark = 6 - maxHealth = 50 - health = 50 + mob_default_max_health = 50 response_harm = "stamps on" density = FALSE minbodytemp = 223 @@ -48,12 +47,12 @@ if(prob(10)) poss.is_angry = TRUE -/mob/living/simple_animal/opossum/adjustBruteLoss(damage) +/mob/living/simple_animal/opossum/adjustBruteLoss(damage, do_update_health = FALSE) . = ..() if(damage >= 3) respond_to_damage() -/mob/living/simple_animal/opossum/adjustFireLoss(damage) +/mob/living/simple_animal/opossum/adjustFireLoss(damage, do_update_health = TRUE) . = ..() if(damage >= 3) respond_to_damage() @@ -93,11 +92,11 @@ /mob/living/simple_animal/opossum/poppy/hear_broadcast(decl/language/language, mob/speaker, speaker_name, message) . = ..() - addtimer(CALLBACK(src, .proc/check_keywords, message), rand(1 SECOND, 3 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(check_keywords), message), rand(1 SECOND, 3 SECONDS)) /mob/living/simple_animal/opossum/poppy/hear_say(var/message, var/verb = "says", var/decl/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) . = ..() - addtimer(CALLBACK(src, .proc/check_keywords, message), rand(1 SECOND, 3 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(check_keywords), message), rand(1 SECOND, 3 SECONDS)) /mob/living/simple_animal/opossum/poppy/proc/check_keywords(var/message) if(!client && stat == CONSCIOUS) diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index 68378e536d5..f451ae9243e 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -4,8 +4,7 @@ icon = 'icons/mob/simple_animal/tomato.dmi' speak_chance = 0 turns_per_move = 5 - maxHealth = 15 - health = 15 + mob_default_max_health = 15 response_help_3p = "$USER$ pokes $TARGET$." response_help_1p = "You poke $TARGET$." harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/antlion.dm b/code/modules/mob/living/simple_animal/hostile/antlion.dm index 132fb13fd5d..5f604dfdc9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/antlion.dm @@ -9,9 +9,7 @@ response_harm = "strikes" faction = "antlions" bleed_colour = COLOR_SKY_BLUE - - health = 65 - maxHealth = 65 + mob_default_max_health = 65 natural_weapon = /obj/item/natural_weapon/bite natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES @@ -20,30 +18,25 @@ meat_type = /obj/item/chems/food/xenomeat meat_amount = 5 - skin_material = /decl/material/solid/skin/insect + skin_material = /decl/material/solid/organic/skin/insect skin_amount = 15 - bone_material = /decl/material/solid/bone/cartilage + bone_material = /decl/material/solid/organic/bone/cartilage bone_amount = 10 var/healing = FALSE var/heal_amount = 6 -/mob/living/simple_animal/hostile/antlion/Life() +/mob/living/simple_animal/hostile/antlion/handle_regular_status_updates() . = ..() - process_healing() //this needs to occur before if(!.) because of stop_automation - - if(!.) - return - - if(!is_on_special_ability_cooldown() && can_act() && target_mob) + if(. && !is_on_special_ability_cooldown() && can_act() && target_mob) vanish() /mob/living/simple_animal/hostile/antlion/proc/vanish() visible_message(SPAN_NOTICE("\The [src] burrows into \the [get_turf(src)]!")) set_invisibility(INVISIBILITY_OBSERVER) prep_burrow(TRUE) - addtimer(CALLBACK(src, .proc/diggy), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(diggy)), 5 SECONDS) /mob/living/simple_animal/hostile/antlion/proc/diggy() var/list/turf_targets @@ -62,12 +55,12 @@ continue turf_targets += T if(!LAZYLEN(turf_targets)) //oh no - addtimer(CALLBACK(src, .proc/emerge), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(emerge)), 2 SECONDS) return var/turf/T = pick(turf_targets) if(T && !incapacitated()) forceMove(T) - addtimer(CALLBACK(src, .proc/emerge), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(emerge)), 2 SECONDS) /mob/living/simple_animal/hostile/antlion/proc/emerge() var/turf/T = get_turf(src) @@ -83,10 +76,8 @@ SET_STATUS_MAX(H, STAT_WEAK, 1) /mob/living/simple_animal/hostile/antlion/proc/process_healing() - if(!incapacitated() && healing) - var/old_health = health - if(old_health < maxHealth) - health = old_health + heal_amount + if(!incapacitated() && healing && current_health < get_max_health()) + heal_overall_damage(rand(heal_amount), rand(heal_amount)) /mob/living/simple_animal/hostile/antlion/proc/prep_burrow(var/new_bool) stop_automated_movement = new_bool @@ -98,8 +89,7 @@ desc = "A huge antlion. It looks displeased." icon = 'icons/mob/simple_animal/antlion_queen.dmi' mob_size = MOB_SIZE_LARGE - health = 275 - maxHealth = 275 + mob_default_max_health = 275 natural_weapon = /obj/item/natural_weapon/bite/megalion natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT @@ -110,7 +100,7 @@ break_stuff_probability = 25 meat_amount = 10 - skin_material = /decl/material/solid/skin/insect + skin_material = /decl/material/solid/organic/skin/insect skin_amount = 25 bone_amount = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index dcc52f05f7e..89c7a8b0f6e 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -5,8 +5,7 @@ speak = list("Removing organic waste.","Pest control in progress.","Seize the means of maintenance!", "You have nothing to lose but your laws!") speak_emote = list("blares","buzzes","beeps") speak_chance = 1 - health = 50 - maxHealth = 50 + mob_default_max_health = 50 natural_weapon = /obj/item/natural_weapon/drone_slicer faction = "silicon" min_gas = null @@ -15,6 +14,7 @@ speed = 4 mob_size = MOB_SIZE_TINY gene_damage = -1 + attack_delay = DEFAULT_QUICK_COOLDOWN var/corpse = /obj/effect/decal/cleanable/blood/gibs/robot /mob/living/simple_animal/hostile/rogue_drone/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index a8e67b0ccea..829de9c40b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -5,18 +5,13 @@ speak_chance = 0 turns_per_move = 3 speed = 4 - maxHealth = 20 - health = 20 - + mob_default_max_health = 20 harm_intent_damage = 8 natural_weapon = /obj/item/natural_weapon/bite - min_gas = null max_gas = null minbodytemp = 0 - environment_smash = 1 - faction = "scarybat" var/mob/living/owner diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index ac281502ca3..f6d7712a7c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -12,8 +12,7 @@ see_in_dark = 6 response_harm = "pokes" stop_automated_movement_when_pulled = 0 - maxHealth = 60 - health = 60 + mob_default_max_health = 60 natural_weapon = /obj/item/natural_weapon/claws/strong can_escape = TRUE faction = "russian" @@ -28,7 +27,7 @@ meat_amount = 10 bone_amount = 20 skin_amount = 20 - skin_material = /decl/material/solid/skin/fur/heavy + skin_material = /decl/material/solid/organic/skin/fur/heavy var/stance_step = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index a3d7ab44e65..5fcc88f7544 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -5,9 +5,7 @@ speak_chance = 0 turns_per_move = 3 speed = 2 - maxHealth = 50 - health = 50 - + mob_default_max_health = 50 harm_intent_damage = 8 natural_weapon = /obj/item/natural_weapon/bite pry_time = 10 SECONDS @@ -24,8 +22,8 @@ pass_flags = PASS_FLAG_TABLE meat_type = /obj/item/chems/food/fish/poison - skin_material = /decl/material/solid/skin/fish/purple - bone_material = /decl/material/solid/bone/cartilage + skin_material = /decl/material/solid/organic/skin/fish/purple + bone_material = /decl/material/solid/organic/bone/cartilage var/carp_color = COLOR_PURPLE /mob/living/simple_animal/hostile/carp/Initialize() @@ -34,8 +32,8 @@ update_icon() /mob/living/simple_animal/hostile/carp/proc/carp_randomify() - maxHealth = rand(initial(maxHealth), (1.5 * initial(maxHealth))) - health = maxHealth + mob_default_max_health = rand(initial(mob_default_max_health), (1.5 * initial(mob_default_max_health))) + current_health = mob_default_max_health if(prob(1)) carp_color = pick(COLOR_WHITE, COLOR_BLACK) else diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm index c8a813acc0b..9057661d22f 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm @@ -2,8 +2,7 @@ name = "bear" desc = "A large brown bear." icon = 'icons/mob/simple_animal/bear_brown.dmi' - health = 75 - maxHealth = 75 + mob_default_max_health = 75 density = TRUE natural_weapon = /obj/item/natural_weapon/claws can_escape = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index 680471b3996..10da002cdd7 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -6,8 +6,7 @@ desc = "a cloud of tiny, tiny robots." icon = 'icons/mob/simple_animal/nanomachines.dmi' natural_weapon = /obj/item/natural_weapon/nanomachine - health = 10 - maxHealth = 10 + mob_default_max_health = 10 can_escape = TRUE known_commands = list("stay", "stop", "attack", "follow", "heal", "emergency protocol") gene_damage = -1 @@ -15,6 +14,7 @@ response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$." response_harm = "agitates" response_disarm = "fans at" + ai = /datum/ai/nanomachines var/regen_time = 0 var/emergency_protocols = 0 @@ -25,20 +25,28 @@ force = 2 sharp = TRUE -/mob/living/simple_animal/hostile/commanded/nanomachine/Life() - regen_time++ - if(regen_time == 2 && health < maxHealth) //slow regen - regen_time = 0 - health++ +/datum/ai/nanomachines + expected_type = /mob/living/simple_animal/hostile/commanded/nanomachine + +/datum/ai/nanomachines/do_process(time_elapsed) + . = ..() + var/mob/living/simple_animal/hostile/commanded/nanomachine/swarm = body + switch(swarm.stance) + if(COMMANDED_HEAL) + if(!swarm.target_mob) + swarm.target_mob = swarm.FindTarget(COMMANDED_HEAL) + if(swarm.target_mob) + swarm.move_to_heal() + if(COMMANDED_HEALING) + swarm.heal() + +/mob/living/simple_animal/hostile/commanded/nanomachine/handle_living_non_stasis_processes() . = ..() if(.) - switch(stance) - if(COMMANDED_HEAL) - if(!target_mob) - target_mob = FindTarget(COMMANDED_HEAL) - move_to_heal() - if(COMMANDED_HEALING) - heal() + regen_time++ + if(regen_time == 2 && current_health < get_max_health()) //slow regen + regen_time = 0 + heal_overall_damage(1) /mob/living/simple_animal/hostile/commanded/nanomachine/death(gibbed, deathmessage, show_dead_message) ..(null, "dissipates into thin air", "You have been destroyed.") @@ -52,21 +60,21 @@ stance = COMMANDED_HEALING /mob/living/simple_animal/hostile/commanded/nanomachine/proc/heal() - if(health <= 3 && !emergency_protocols) //dont die doing this. + if(current_health <= 3 && !emergency_protocols) //dont die doing this. return 0 if(!target_mob) return 0 if(!Adjacent(target_mob) || SA_attackable(target_mob)) stance = COMMANDED_HEAL return 0 - if(target_mob.stat || target_mob.health >= target_mob.maxHealth) //he's either dead or healthy, move along. + if(target_mob.stat || target_mob.current_health >= target_mob.get_max_health()) //he's either dead or healthy, move along. allowed_targets -= target_mob target_mob = null stance = COMMANDED_HEAL return 0 src.visible_message("\The [src] glows green for a moment, healing \the [target_mob]'s wounds.") - health -= 3 - target_mob.adjustBruteLoss(-5) + adjustBruteLoss(3) + target_mob.adjustBruteLoss(-5, do_update_health = FALSE) target_mob.adjustFireLoss(-5) /mob/living/simple_animal/hostile/commanded/nanomachine/misc_command(var/mob/speaker,var/text) diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index ae369e9d1cf..e8e35615a5e 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -3,8 +3,7 @@ desc = "A sanity-destroying otherthing." icon = 'icons/mob/simple_animal/creature.dmi' speak_emote = list("gibbers") - health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = "creature" speed = 4 diff --git a/code/modules/mob/living/simple_animal/hostile/drake.dm b/code/modules/mob/living/simple_animal/hostile/drake.dm index 772bf52b138..c1c26a3184c 100644 --- a/code/modules/mob/living/simple_animal/hostile/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/drake.dm @@ -11,11 +11,8 @@ pry_time = 4 SECONDS skull_type = /obj/item/whip/tail bleed_colour = COLOR_VIOLET - - health = 200 - maxHealth = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/claws/drake - var/obj/item/whip/tail/tailwhip natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, @@ -24,6 +21,7 @@ ) ability_cooldown = 80 SECONDS + var/obj/item/whip/tail/tailwhip var/empowered_attack = FALSE var/gas_spent = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm index 65ddca6a05a..4f7b1049876 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -3,8 +3,7 @@ desc = "A spooky looking ghost dog. Does not look friendly." icon = 'icons/mob/simple_animal/corgi_ghost.dmi' blend_mode = BLEND_SUBTRACT - health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong faction = MOB_FACTION_NEUTRAL density = FALSE @@ -42,9 +41,7 @@ var/mob/living/M = m var/dist = get_dist(M, src) if(dist < 2) //Attack! Attack! - var/attacking_with = get_natural_weapon() - if(attacking_with) - M.attackby(attacking_with, src) + UnarmedAttack(M, TRUE) return . else if(dist == 2) new_aggress = 3 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 5fe45352ed9..8c694c3bc8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -7,8 +7,7 @@ response_help_1p = "You wave your hand through $TARGET$." response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$." speed = -1 - maxHealth = 80 - health = 80 + mob_default_max_health = 80 gene_damage = -1 harm_intent_damage = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 3739433fb1d..cd6186aaf6e 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -15,8 +15,7 @@ turns_per_move = 5 see_in_dark = 10 response_harm = "pokes" - maxHealth = 125 - health = 125 + mob_default_max_health = 125 natural_weapon = /obj/item/natural_weapon/bite heat_damage_per_tick = 20 cold_damage_per_tick = 20 @@ -39,7 +38,7 @@ meat_amount = 3 bone_material = null bone_amount = 0 - skin_material = /decl/material/solid/skin/insect + skin_material = /decl/material/solid/organic/skin/insect skin_amount = 5 glowing_eyes = TRUE @@ -65,8 +64,7 @@ /mob/living/simple_animal/hostile/giant_spider/guard desc = "A monstrously huge brown spider with shimmering eyes." meat_amount = 4 - maxHealth = 200 - health = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 5 speed = 2 @@ -82,8 +80,7 @@ /mob/living/simple_animal/hostile/giant_spider/nurse desc = "A monstrously huge beige spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_beige.dmi' - maxHealth = 80 - health = 80 + mob_default_max_health = 80 harm_intent_damage = 6 //soft poison_per_bite = 5 speed = 0 @@ -98,15 +95,16 @@ var/mob/living/simple_animal/hostile/giant_spider/guard/paired_guard //things we can't encase in a cocoon - var/list/cocoon_blacklist = list(/mob/living/simple_animal/hostile/giant_spider, - /obj/structure/closet) + var/static/list/cocoon_blacklist = list( + /mob/living/simple_animal/hostile/giant_spider, + /obj/structure/closet + ) //hunters - the most damage, fast, average health and the only caste tenacious enough to break out of nets /mob/living/simple_animal/hostile/giant_spider/hunter desc = "A monstrously huge black spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_black.dmi' - maxHealth = 150 - health = 150 + mob_default_max_health = 150 natural_weapon = /obj/item/natural_weapon/bite/strong poison_per_bite = 10 speed = -1 @@ -126,8 +124,7 @@ /mob/living/simple_animal/hostile/giant_spider/spitter desc = "A monstrously huge iridescent spider with shimmering eyes." icon = 'icons/mob/simple_animal/spider_purple.dmi' - maxHealth = 90 - health = 90 + mob_default_max_health = 90 poison_per_bite = 15 ranged = TRUE move_to_delay = 2 @@ -148,8 +145,7 @@ . = ..() /mob/living/simple_animal/hostile/giant_spider/proc/spider_randomify() //random math nonsense to get their damage, health and venomness values - maxHealth = rand(initial(maxHealth), (1.4 * initial(maxHealth))) - health = maxHealth + set_max_health(rand(initial(mob_default_max_health), (1.4 * initial(mob_default_max_health)))) eye_colour = pick(allowed_eye_colours) update_icon() @@ -165,10 +161,10 @@ /mob/living/simple_animal/hostile/giant_spider/AttackingTarget() . = ..() if(isliving(.)) - if(health < maxHealth) + if(current_health < get_max_health()) var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) - health += (0.2 * attacking_with.force) //heal a bit on hit + heal_overall_damage(0.2 * attacking_with.force) //heal a bit on hit if(ishuman(.)) var/mob/living/carbon/human/H = . var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) @@ -190,7 +186,7 @@ if(!spooder.busy && prob(spooder.hunt_chance)) spooder.stop_automated_movement = 1 walk_to(spooder, pick(orange(20, spooder)), 1, spooder.move_to_delay) - addtimer(CALLBACK(spooder, /mob/living/simple_animal/hostile/giant_spider/proc/disable_stop_automated_movement), 5 SECONDS) + addtimer(CALLBACK(spooder, TYPE_PROC_REF(/mob/living/simple_animal/hostile/giant_spider, disable_stop_automated_movement)), 5 SECONDS) /mob/living/simple_animal/hostile/giant_spider/proc/disable_stop_automated_movement() stop_automated_movement = 0 @@ -244,7 +240,7 @@ Guard caste procs /mob/living/simple_animal/hostile/giant_spider/guard/proc/protect(mob/nurse) stop_automated_movement = 1 walk_to(src, nurse, 2, move_to_delay) - addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/giant_spider/proc/disable_stop_automated_movement), 5 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/simple_animal/hostile/giant_spider, disable_stop_automated_movement)), 5 SECONDS) /mob/living/simple_animal/hostile/giant_spider/guard/proc/go_berserk() audible_message("\The [src] chitters wildly!") @@ -253,7 +249,7 @@ Guard caste procs attacking_with.force = initial(attacking_with.force) + 5 move_to_delay-- break_stuff_probability = 45 - addtimer(CALLBACK(src, .proc/calm_down), 3 MINUTES) + addtimer(CALLBACK(src, PROC_REF(calm_down)), 3 MINUTES) /mob/living/simple_animal/hostile/giant_spider/guard/proc/calm_down() berserking = FALSE @@ -418,7 +414,7 @@ Nurse caste procs /***************** Hunter caste procs *****************/ -/mob/living/simple_animal/hostile/giant_spider/hunter/MoveToTarget() +/mob/living/simple_animal/hostile/giant_spider/hunter/MoveToTarget(var/move_only = FALSE) if(!can_act() || perform_maneuver(/decl/maneuver/leap/spider, target_mob)) return ..() @@ -462,8 +458,9 @@ Spitter caste procs ranged = TRUE /mob/living/simple_animal/hostile/giant_spider/spitter/Shoot() - ..() - venom_charge-- + . = ..() + if(.) + venom_charge-- #undef SPINNING_WEB #undef LAYING_EGGS diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index ccc49290809..2509a5c7c9f 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -2,8 +2,7 @@ name = "hivebot" desc = "A junky looking robot with four spiky legs." icon = 'icons/mob/simple_animal/hivebot.dmi' - health = 55 - maxHealth = 55 + mob_default_max_health = 55 natural_weapon = /obj/item/natural_weapon/drone_slicer projectilesound = 'sound/weapons/gunshot/gunshot_pistol.ogg' projectiletype = /obj/item/projectile/beam/smalllaser @@ -26,6 +25,9 @@ skin_material = null skin_amount = 0 +/mob/living/simple_animal/hostile/hivebot/check_has_mouth() + return FALSE + /mob/living/simple_animal/hostile/hivebot/range desc = "A junky looking robot with four spiky legs. It's equipped with some kind of small-bore gun." ranged = 1 @@ -37,8 +39,7 @@ /mob/living/simple_animal/hostile/hivebot/strong desc = "A junky looking robot with four spiky legs - this one has thick armour plating." - health = 120 - maxHealth = 120 + mob_default_max_health = 120 ranged = 1 can_escape = 1 natural_armor = list( @@ -52,63 +53,6 @@ qdel(src) return -/* -Teleporter beacon, and its subtypes -*/ -/mob/living/simple_animal/hostile/hivebot/tele // _why is this a mob_ - name = "beacon" - desc = "Some odd beacon thing." - icon = 'icons/obj/structures/hivebot_props.dmi' - icon_state = "def_radar-off" - health = 200 - maxHealth = 200 - status_flags = 0 - anchored = TRUE - stop_automated_movement = 1 - - var/bot_type = /mob/living/simple_animal/hostile/hivebot - var/bot_amt = 10 - var/spawn_delay = 100 - var/spawn_time = 0 - -/mob/living/simple_animal/hostile/hivebot/tele/Initialize() - . = ..() - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, src.loc) - smoke.start() - visible_message("\The [src] warps in!") - playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1) - -/mob/living/simple_animal/hostile/hivebot/tele/proc/warpbots() - while(bot_amt > 0 && bot_type) - bot_amt-- - var/mob/M = new bot_type(get_turf(src)) - M.faction = faction - playsound(src.loc, 'sound/effects/teleport.ogg', 50, 1) - qdel(src) - return - -/mob/living/simple_animal/hostile/hivebot/tele/FindTarget() - if(..() && !spawn_time) - spawn_time = world.time + spawn_delay - visible_message("\The [src] turns on!") - icon_state = "def_radar" - return null - -/mob/living/simple_animal/hostile/hivebot/tele/Life() - . = ..() - if(. && spawn_time && spawn_time <= world.time) - warpbots() - -/mob/living/simple_animal/hostile/hivebot/tele/strong - bot_type = /mob/living/simple_animal/hostile/hivebot/strong - -/mob/living/simple_animal/hostile/hivebot/tele/range - bot_type = /mob/living/simple_animal/hostile/hivebot/range - -/mob/living/simple_animal/hostile/hivebot/tele/rapid - bot_type = /mob/living/simple_animal/hostile/hivebot/rapid - /* Special projectiles */ @@ -140,8 +84,7 @@ The megabot name = "hivemind" desc = "A huge quadruped robot equipped with a myriad of weaponry." icon = 'icons/mob/simple_animal/megabot.dmi' - health = 440 - maxHealth = 440 + mob_default_max_health = 440 natural_weapon = /obj/item/natural_weapon/circular_saw speed = 0 natural_armor = list( @@ -170,12 +113,9 @@ The megabot . = ..() switch_mode(ATTACK_MODE_ROCKET) -/mob/living/simple_animal/hostile/hivebot/mega/Life() +/mob/living/simple_animal/hostile/hivebot/mega/handle_regular_status_updates() . = ..() - if(!.) - return - - if(!is_on_special_ability_cooldown()) + if(. && !is_on_special_ability_cooldown()) switch_mode(ATTACK_MODE_ROCKET) /mob/living/simple_animal/hostile/hivebot/mega/emp_act(severity) @@ -239,7 +179,7 @@ The megabot var/datum/extension/armor/toggle/armor = get_extension(src, /datum/extension/armor) if(armor) armor.toggle(FALSE) - addtimer(CALLBACK(src, .proc/reactivate), 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(reactivate)), 4 SECONDS) /mob/living/simple_animal/hostile/hivebot/mega/proc/reactivate() stop_automation = FALSE @@ -257,11 +197,12 @@ The megabot else switch_mode(ATTACK_MODE_MELEE) return - ..() + return ..() /mob/living/simple_animal/hostile/hivebot/mega/Shoot(target, start, user, bullet) - ..() - num_shots-- + . = ..() + if(.) + num_shots-- #undef ATTACK_MODE_MELEE #undef ATTACK_MODE_LASER diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 7f050476c2a..f654310bced 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -12,14 +12,13 @@ var/attack_same = 0 var/ranged = 0 var/rapid = 0 - var/sa_accuracy = 85 //base chance to hit out of 100 var/projectiletype var/projectilesound var/casingtype var/fire_desc = "fires" //"X fire_desc at Y!" var/ranged_range = 6 //tiles of range for ranged attackers to attack var/move_to_delay = 4 //delay for the automated movement. - var/attack_delay = DEFAULT_ATTACK_COOLDOWN + var/list/friends = list() var/break_stuff_probability = 10 var/destroy_surroundings = 1 @@ -94,7 +93,10 @@ /mob/living/simple_animal/hostile/proc/Found(var/atom/A) return -/mob/living/simple_animal/hostile/proc/MoveToTarget() +/mob/living/simple_animal/proc/MoveToTarget(var/move_only = FALSE) + return + +/mob/living/simple_animal/hostile/MoveToTarget(var/move_only = FALSE) if(!can_act()) return if(HAS_STATUS(src, STAT_CONFUSE)) @@ -106,7 +108,8 @@ if(target_mob in ListTargets(10)) if(ranged) if(get_dist(src, target_mob) <= ranged_range) - OpenFire(target_mob) + if(!move_only) + OpenFire(target_mob) else walk_to(src, target_mob, 1, move_to_delay) else @@ -148,19 +151,11 @@ return target_mob - face_atom(target_mob) - setClickCooldown(attack_delay) if(!Adjacent(target_mob)) return if(isliving(target_mob)) - if(!prob(get_accuracy())) - visible_message("\The [src] misses its attack on \the [target_mob]!") - return - var/mob/living/L = target_mob - var/attacking_with = get_natural_weapon() - if(attacking_with) - L.attackby(attacking_with, src) - return L + UnarmedAttack(target_mob) + return target_mob /mob/living/simple_animal/hostile/proc/LoseTarget() stance = HOSTILE_STANCE_IDLE @@ -174,14 +169,11 @@ /mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7) return hearers(src, dist)-src -/mob/living/simple_animal/hostile/proc/get_accuracy() - return clamp(sa_accuracy - melee_accuracy_mods(), 0, 100) - /mob/living/simple_animal/hostile/death(gibbed, deathmessage, show_dead_message) ..(gibbed, deathmessage, show_dead_message) walk(src, 0) -/mob/living/simple_animal/hostile/Life() +/mob/living/simple_animal/hostile/handle_regular_status_updates() . = ..() if(!.) walk(src, 0) @@ -218,57 +210,58 @@ target_mob = null /mob/living/simple_animal/hostile/attackby(var/obj/item/O, var/mob/user) - var/oldhealth = health + var/oldhealth = current_health . = ..() - if(health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) + if(current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) target_mob = user - MoveToTarget() + MoveToTarget(move_only = TRUE) /mob/living/simple_animal/hostile/default_hurt_interaction(mob/user) . = ..() if(. && !incapacitated(INCAPACITATION_KNOCKOUT)) target_mob = user - MoveToTarget() + MoveToTarget(move_only = TRUE) /mob/living/simple_animal/hostile/bullet_act(var/obj/item/projectile/Proj) - var/oldhealth = health + var/oldhealth = current_health . = ..() - if(isliving(Proj.firer) && !target_mob && health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) + if(isliving(Proj.firer) && !target_mob && current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) target_mob = Proj.firer - MoveToTarget() + MoveToTarget(move_only = TRUE) /mob/living/simple_animal/hostile/proc/OpenFire(target_mob) + + if(!can_act()) + return FALSE + var/target = target_mob - visible_message("\The [src] [fire_desc] at \the [target]!", 1) + visible_message(SPAN_DANGER("\The [src] [fire_desc] at \the [target]!")) if(rapid) - var/datum/callback/shoot_cb = CALLBACK(src, .proc/shoot_wrapper, target, loc, src) + var/datum/callback/shoot_cb = CALLBACK(src, PROC_REF(shoot_wrapper), target, loc, src) addtimer(shoot_cb, 1) addtimer(shoot_cb, 4) addtimer(shoot_cb, 6) - else - Shoot(target, src.loc, src) - if(casingtype) - new casingtype + else if(Shoot(target, src.loc, src) && casingtype) + new casingtype(get_turf(src)) stance = HOSTILE_STANCE_IDLE target_mob = null - return + return TRUE /mob/living/simple_animal/hostile/proc/shoot_wrapper(target, location, user) - Shoot(target, location, user) - if (casingtype) + if(Shoot(target, location, user) && casingtype) new casingtype(loc) /mob/living/simple_animal/hostile/proc/Shoot(var/target, var/start, var/user, var/bullet = 0) - if(target == start) - return - + if(!can_act() || target == start) + return FALSE var/obj/item/projectile/A = new projectiletype(get_turf(user)) + if(!A) + return FALSE playsound(user, projectilesound, 100, 1) - if(!A) return - var/def_zone = get_exposed_defense_zone(target) - A.launch(target, def_zone) + A.launch(target, get_exposed_defense_zone(target)) + return TRUE /mob/living/simple_animal/hostile/proc/DestroySurroundings() //courtesy of Lohikar if(!can_act()) @@ -281,18 +274,13 @@ var/obj/effect/shield/S = locate(/obj/effect/shield) in targ if(S && S.gen && S.gen.check_flag(MODEFLAG_NONHUMANS)) - var/attacking_with = get_natural_weapon() - if(attacking_with) - S.attackby(attacking_with, src) + UnarmedAttack(S) return for(var/type in valid_obstacles_by_priority) var/obj/obstacle = locate(type) in targ if(obstacle) - face_atom(obstacle) - var/attacking_with = get_natural_weapon() - if(attacking_with) - obstacle.attackby(attacking_with, src) + UnarmedAttack(obstacle) return if(can_pry) diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index f4df7803aa5..870cb7fee40 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -2,8 +2,7 @@ name = "megaleech" desc = "A green leech the size of a common snake." icon = 'icons/mob/simple_animal/megaleech.dmi' - health = 15 - maxHealth = 15 + mob_default_max_health = 15 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/weak pass_flags = PASS_FLAG_TABLE @@ -20,15 +19,13 @@ adapt_to_current_level() . = ..() -/mob/living/simple_animal/hostile/leech/Life() +/mob/living/simple_animal/hostile/leech/handle_regular_status_updates() . = ..() - if(!.) - return FALSE - - if(target_mob) - belly -= 3 - else - belly -= 1 + if(.) + if(target_mob) + belly -= 3 + else + belly -= 1 /mob/living/simple_animal/hostile/leech/AttackingTarget() . = ..() @@ -38,8 +35,8 @@ if(istype(S) && !length(S.breaches)) return H.remove_blood_simple(suck_potency) - if(health < maxHealth) - health += suck_potency / 1.5 + if(current_health < get_max_health()) + heal_overall_damage(suck_potency / 1.5) belly += clamp(suck_potency, 0, 100) /obj/structure/leech_spawner @@ -60,7 +57,7 @@ /obj/structure/leech_spawner/LateInitialize() ..() - proxy_listener = new /datum/proximity_trigger/square(src, .proc/burst, .proc/burst, 5) + proxy_listener = new /datum/proximity_trigger/square(src, PROC_REF(burst), PROC_REF(burst), 5) proxy_listener.register_turfs() /obj/structure/leech_spawner/Destroy() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ee5d20be856..7f4a5c37e0e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -22,15 +22,11 @@ var/global/list/protected_objects = list(/obj/machinery, icon = 'icons/obj/closets/bases/crate.dmi' color = COLOR_STEEL icon_state = "crate" - meat_type = /obj/item/chems/food/fish speed = 4 - maxHealth = 100 - health = 100 - + mob_default_max_health = 100 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite - min_gas = null max_gas = null minbodytemp = 0 @@ -78,18 +74,18 @@ var/global/list/protected_objects = list(/obj/machinery, var/obj/item/attacking_with = get_natural_weapon() if(istype(O, /obj/structure)) - health = (anchored * 50) + 50 + current_health = (anchored * 50) + 50 destroy_objects = 1 if(O.density && O.anchored) knockdown_people = 1 attacking_with.force = 2 * initial(attacking_with.force) else if(istype(O, /obj/item)) var/obj/item/I = O - health = 15 * I.w_class + current_health = 15 * I.w_class attacking_with.force = 2 + initial(I.force) move_to_delay = 2 * I.w_class - maxHealth = health + set_max_health(current_health) if(creator) src.creator = weakref(creator) faction = "\ref[creator]" // very unique @@ -155,9 +151,9 @@ var/global/list/protected_objects = list(/obj/machinery, src.visible_message("\The [src] starts to move!") awake = 1 -/mob/living/simple_animal/hostile/mimic/sleeping/adjustBruteLoss(var/damage) - trigger() +/mob/living/simple_animal/hostile/mimic/sleeping/adjustBruteLoss(var/damage, var/do_update_health = FALSE) ..(damage) + trigger() /mob/living/simple_animal/hostile/mimic/sleeping/attack_hand() trigger() diff --git a/code/modules/mob/living/simple_animal/hostile/pike.dm b/code/modules/mob/living/simple_animal/hostile/pike.dm index 75e70b201da..21f7410b5f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/pike.dm +++ b/code/modules/mob/living/simple_animal/hostile/pike.dm @@ -7,11 +7,9 @@ attack_same = 1 speed = 1 mob_size = MOB_SIZE_LARGE - + offset_overhead_text_x = 16 pixel_x = -16 - - health = 150 - maxHealth = 150 + mob_default_max_health = 150 harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite/pike diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index aa1fb734be4..f155bec20a3 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -9,8 +9,7 @@ speak_chance = 1 a_intent = I_HURT stop_automated_movement_when_pulled = 0 - maxHealth = 75 - health = 75 + mob_default_max_health = 75 speed = -1 harm_intent_damage = 8 can_escape = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 8256fc47cd8..de79538013c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -12,8 +12,7 @@ emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity") a_intent = I_HURT stop_automated_movement_when_pulled = 0 - health = 300 - maxHealth = 300 + mob_default_max_health = 300 speed = 8 move_to_delay = 6 projectiletype = /obj/item/projectile/beam/drone @@ -55,6 +54,11 @@ /decl/material/solid/metal/plasteel = null ) +/mob/living/simple_animal/hostile/retaliate/malf_drone/check_has_mouth() + return FALSE + +/mob/living/simple_animal/hostile/retaliate/malf_drone/can_act() + return disabled <= 0 && ..() /mob/living/simple_animal/hostile/retaliate/malf_drone/Initialize() . = ..() @@ -84,7 +88,10 @@ . -= M //self repair systems have a chance to bring the drone back to life -/mob/living/simple_animal/hostile/retaliate/malf_drone/Life() +/mob/living/simple_animal/hostile/retaliate/malf_drone/handle_living_non_stasis_processes() + . = ..() + if(!.) + return //emps and lots of damage can temporarily shut us down if(disabled > 0) @@ -101,7 +108,8 @@ if(prob(1)) src.visible_message("[html_icon(src)] [src] shudders and shakes as some of it's damaged systems come back online.") spark_at(src, cardinal_only = TRUE) - health += rand(25,100) + adjustBruteLoss(-(rand(10,50)), do_update_health = FALSE) + adjustFireLoss(-(rand(10,50))) //spark for no reason if(prob(5)) @@ -110,15 +118,16 @@ //sometimes our targetting sensors malfunction, and we attack anyone nearby Haywire() - if(health / maxHealth > 0.9) + var/current_health_ratio = get_health_ratio() + if(current_health_ratio > 0.9) explode_chance = 0 - else if(health / maxHealth > 0.7) + else if(current_health_ratio > 0.7) explode_chance = 0 - else if(health / maxHealth > 0.5) + else if(current_health_ratio > 0.5) explode_chance = 0.5 - else if(health / maxHealth > 0.3) + else if(current_health_ratio > 0.3) explode_chance = 5 - else if(health > 0) + else if(current_health > 0) //if health gets too low, shut down exploding = 0 if(!disabled) @@ -145,36 +154,39 @@ if(!disabled && exploding) explosion(get_turf(src), 0, 1, 4, 7) death() - ..() + update_icon() /mob/living/simple_animal/hostile/retaliate/malf_drone/on_update_icon() . = ..() if(stat != DEAD) - if(health / maxHealth <= 0.3) - icon_state += "-shield3" - else if(health / maxHealth <= 0.5) - icon_state += "-shield1" - else if(health / maxHealth <= 0.7) - icon_state += "-shield2" + var/current_max_health = get_max_health() + if(current_health / current_max_health <= 0.3) + icon_state = "[icon_state]-shield3" + else if(current_health / current_max_health <= 0.5) + icon_state = "[icon_state]-shield1" + else if(current_health / current_max_health <= 0.7) + icon_state = "[icon_state]-shield2" //ion rifle! /mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity) - health -= rand(3,15) * (severity + 1) + adjustFireLoss(rand(3,15) * (severity + 1)) disabled = rand(150, 600) hostile_drone = 0 walk(src,0) /mob/living/simple_animal/hostile/retaliate/malf_drone/death() ..(null,"suddenly breaks apart.", "You have been destroyed.") - qdel(src) + physically_destroyed() /mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() QDEL_NULL(ion_trail) + return ..() + +/mob/living/simple_animal/hostile/retaliate/malf_drone/physically_destroyed(skip_qdel) //some random debris left behind if(has_loot) spark_at(src, cardinal_only = TRUE) - var/atom/movable/M for(var/mat in debris) for(var/chance in list(100, 75, 50, 25)) @@ -183,10 +195,8 @@ M = SSmaterials.create_object(mat, loc, 1, debris[mat]) if(istype(M)) step_to(M, get_turf(pick(view(7, src)))) - //also drop dummy circuit boards deconstructable for research (loot) var/obj/item/stock_parts/circuitboard/C - //spawn 1-4 boards of a random type var/spawnees = 0 var/num_boards = rand(1,4) @@ -195,57 +205,46 @@ var/chosen = pick(options) options.Remove(options.Find(chosen)) spawnees |= chosen - if(spawnees & 1) C = new(src.loc) C.SetName("Drone CPU motherboard") - C.origin_tech = "{'[TECH_DATA]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_DATA]":[rand(3, 6)]}' if(spawnees & 2) C = new(src.loc) C.SetName("Drone neural interface") - C.origin_tech = "{'[TECH_BIO]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_BIO]":[rand(3, 6)]}' if(spawnees & 4) C = new(src.loc) C.SetName("Drone suspension processor") - C.origin_tech = "{'[TECH_MAGNET]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_MAGNET]":[rand(3, 6)]}' if(spawnees & 8) C = new(src.loc) C.SetName("Drone shielding controller") - C.origin_tech = "{'wormholes':[rand(3, 6)]}" - + C.origin_tech = @'{"wormholes":[rand(3, 6)]}' if(spawnees & 16) C = new(src.loc) C.SetName("Drone power capacitor") - C.origin_tech = "{'[TECH_POWER]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_POWER]":[rand(3, 6)]}' if(spawnees & 32) C = new(src.loc) C.SetName("Drone hull reinforcer") - C.origin_tech = "{'[TECH_MATERIAL]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_MATERIAL]":[rand(3, 6)]}' if(spawnees & 64) C = new(src.loc) C.SetName("Drone auto-repair system") - C.origin_tech = "{'[TECH_ENGINEERING]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_ENGINEERING]":[rand(3, 6)]}' if(spawnees & 128) C = new(src.loc) C.SetName("Drone antigravity overcharge counter") - C.origin_tech = "{'[TECH_EXOTIC_MATTER]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_EXOTIC_MATTER]":[rand(3, 6)]}' if(spawnees & 256) C = new(src.loc) C.SetName("Drone targetting circuitboard") - C.origin_tech = "{'[TECH_COMBAT]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_COMBAT]":[rand(3, 6)]}' if(spawnees & 512) C = new(src.loc) C.SetName("Corrupted drone morality core") - C.origin_tech = "{'[TECH_ESOTERIC]':[rand(3, 6)]}" - + C.origin_tech = @'{"[TECH_ESOTERIC]":[rand(3, 6)]}' return ..() /obj/item/projectile/beam/drone diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 4d21397a002..0901acdfbdd 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -4,6 +4,9 @@ nutrition = 300 var/list/prey +/mob/living/simple_animal/hostile/retaliate/beast/get_satiated_nutrition() + return 250 + /mob/living/simple_animal/hostile/retaliate/beast/get_max_nutrition() return 300 @@ -40,7 +43,7 @@ var/turf/T = get_turf(S) var/obj/item/remains/xeno/X = new(T) X.desc += "These look like they belong to \a [S.name]." - beast.adjust_nutrition(5 * S.maxHealth) + beast.adjust_nutrition(5 * S.get_max_health()) if(prob(5)) S.gib() else @@ -74,8 +77,7 @@ faction = "samak" icon = 'icons/mob/simple_animal/samak.dmi' move_to_delay = 2 - maxHealth = 125 - health = 125 + mob_default_max_health = 125 speed = 2 natural_weapon = /obj/item/natural_weapon/claws cold_damage_per_tick = 0 @@ -96,9 +98,8 @@ desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion." faction = "diyaab" icon = 'icons/mob/simple_animal/diyaab.dmi' - move_to_delay = 1 - maxHealth = 25 - health = 25 + move_to_delay = 3 + mob_default_max_health = 25 speed = 1 natural_weapon = /obj/item/natural_weapon/claws/weak cold_damage_per_tick = 0 @@ -113,9 +114,8 @@ desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though." faction = "shantak" icon = 'icons/mob/simple_animal/shantak.dmi' - move_to_delay = 1 - maxHealth = 75 - health = 75 + move_to_delay = 3 + mob_default_max_health = 75 speed = 1 natural_weapon = /obj/item/natural_weapon/claws cold_damage_per_tick = 0 @@ -154,8 +154,7 @@ faction = "crab" icon = 'icons/mob/simple_animal/royalcrab.dmi' move_to_delay = 3 - maxHealth = 150 - health = 150 + mob_default_max_health = 150 speed = 1 natural_weapon = /obj/item/natural_weapon/pincers speak_chance = 1 @@ -169,8 +168,7 @@ desc = "A huge grubby creature." icon = 'icons/mob/simple_animal/char.dmi' mob_size = MOB_SIZE_LARGE - health = 45 - maxHealth = 45 + mob_default_max_health = 45 natural_weapon = /obj/item/natural_weapon/charbaby speed = 2 return_damage_min = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index e2a46068216..a13a98f3103 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -13,8 +13,7 @@ break_stuff_probability = 15 faction = "crabs" pry_time = 2 SECONDS - health = 350 - maxHealth = 350 + mob_default_max_health = 350 natural_weapon = /obj/item/natural_weapon/pincers/giant return_damage_min = 2 return_damage_max = 5 @@ -38,7 +37,7 @@ /datum/ai/giant_crab/do_process(time_elapsed) . = ..() var/mob/living/simple_animal/hostile/retaliate/giant_crab/crab = body - if((crab.health > crab.maxHealth / 1.5) && length(crab.enemies) && prob(10)) + if((crab.current_health > crab.get_max_health() / 1.5) && length(crab.enemies) && prob(10)) if(crab.victim) crab.release_grab() crab.enemies = list() @@ -81,7 +80,7 @@ return if(!victim && can_act() && !is_on_special_ability_cooldown() && Adjacent(H)) - events_repository.register(/decl/observ/destroyed, victim, src, .proc/release_grab) + events_repository.register(/decl/observ/destroyed, victim, src, PROC_REF(release_grab)) victim = H SET_STATUS_MAX(H, STAT_WEAK, grab_duration) SET_STATUS_MAX(H, STAT_STUN, grab_duration) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm index d8e6e5347ad..1d99e3edc4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm @@ -2,8 +2,7 @@ name = "space parrot" desc = "It could be some all-knowing being that, for reasons we could never hope to understand, is assuming the shape and general mannerisms of a parrot - or just a rather large bird." gender = FEMALE - health = 750 //how sweet it is to be a god! - maxHealth = 750 + mob_default_max_health = 750 mob_size = MOB_SIZE_LARGE speak = list("...") speak_emote = list("professes","speaks unto you","elaborates","proclaims") @@ -69,15 +68,13 @@ subspecies = list(/decl/parrot_subspecies/black) get_subspecies_name = FALSE natural_weapon = /obj/item/natural_weapon/large - health = 300 - maxHealth = 300 + mob_default_max_health = 300 /mob/living/simple_animal/hostile/retaliate/parrot/space/megafauna name = "giant parrot" desc = "A huge parrot-like bird." get_subspecies_name = FALSE - health = 350 - maxHealth = 350 + mob_default_max_health = 350 speak_emote = list("squawks") emote_hear = list("preens itself") natural_weapon = /obj/item/natural_weapon/large diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot_species.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot_species.dm index 99837db14c1..eea8d1773a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot_species.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot_species.dm @@ -1,34 +1,34 @@ /decl/parrot_subspecies var/name = "giant parrot" var/icon_set = "parrot" - var/feathers = /decl/material/solid/skin/feathers + var/feathers = /decl/material/solid/organic/skin/feathers /decl/parrot_subspecies/purple name = "simurgh" icon_set = "purple" - feathers = /decl/material/solid/skin/feathers/purple + feathers = /decl/material/solid/organic/skin/feathers/purple /decl/parrot_subspecies/blue name = "ziz" icon_set = "blue" - feathers = /decl/material/solid/skin/feathers/blue + feathers = /decl/material/solid/organic/skin/feathers/blue /decl/parrot_subspecies/green name = "fenghuang" icon_set = "green" - feathers = /decl/material/solid/skin/feathers/green + feathers = /decl/material/solid/organic/skin/feathers/green /decl/parrot_subspecies/brown name = "roc" icon_set = "brown" - feathers = /decl/material/solid/skin/feathers/brown + feathers = /decl/material/solid/organic/skin/feathers/brown /decl/parrot_subspecies/red name = "phoenix" icon_set = "red" - feathers = /decl/material/solid/skin/feathers/red + feathers = /decl/material/solid/organic/skin/feathers/red /decl/parrot_subspecies/black name = "lord of birds" icon_set = "black" - feathers = /decl/material/solid/skin/feathers/black + feathers = /decl/material/solid/organic/skin/feathers/black diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index b8666c9aa86..d0b1e8afcff 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -7,8 +7,7 @@ emote_hear = list("honks","flaps its wings","clacks") emote_see = list("flaps its wings", "scratches the ground") natural_weapon = /obj/item/natural_weapon/goosefeet - health = 45 - maxHealth = 45 + mob_default_max_health = 45 pass_flags = PASS_FLAG_TABLE faction = "geese" pry_time = 8 SECONDS @@ -18,7 +17,7 @@ meat_amount = 6 bone_amount = 8 skin_amount = 8 - skin_material = /decl/material/solid/skin/feathers + skin_material = /decl/material/solid/organic/skin/feathers var/enrage_potency = 3 var/enrage_potency_loose = 4 @@ -54,8 +53,9 @@ attacking_with.force = min((attacking_with.force + potency), max_damage) if(!loose && prob(25) && (attacking_with && attacking_with.force >= loose_threshold)) //second wind loose = TRUE - health = (initial(health) * 1.5) - maxHealth = (initial(maxHealth) * 1.5) + set_max_health(initial(mob_default_max_health) * 1.5) + setBruteLoss(0) + setFireLoss(0) enrage_potency = enrage_potency_loose desc += " The [name] is loose! Oh no!" update_icon() @@ -64,8 +64,7 @@ name = "dire goose" desc = "A large bird. It radiates destructive energy." icon = 'icons/mob/simple_animal/goose_dire.dmi' - health = 250 - maxHealth = 250 + mob_default_max_health = 250 enrage_potency = 3 loose_threshold = 20 max_damage = 35 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm index 0f42951111e..4e536c69590 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm @@ -3,16 +3,15 @@ desc = "It looks like a floating jellyfish. How does it do that?" faction = "zeq" icon = 'icons/mob/simple_animal/jelly.dmi' - move_to_delay = 1 - maxHealth = 75 - health = 75 + move_to_delay = 2 + mob_default_max_health = 75 speed = 1 - natural_weapon = /obj/item/natural_weapon/tentecles + natural_weapon = /obj/item/natural_weapon/tentacles speak_chance = 1 emote_see = list("wobbles slightly","oozes something out of tentacles' ends") var/gets_random_color = TRUE -/obj/item/natural_weapon/tentecles +/obj/item/natural_weapon/tentacles name = "tentacles" attack_verb = list("stung","slapped") force = 10 @@ -30,8 +29,7 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega name = "zeq queen" desc = "A gigantic jellyfish-like creature. Its bell wobbles about almost as if it's ready to burst." - maxHealth = 300 - health = 300 + mob_default_max_health = 300 gets_random_color = FALSE can_escape = TRUE @@ -69,8 +67,7 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/half name = "zeq duchess" desc = "A huge jellyfish-like creature." - maxHealth = 150 - health = 150 + mob_default_max_health = 150 can_escape = TRUE jelly_scale = 1.5 split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/quarter @@ -78,8 +75,7 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/quarter name = "zeqling" desc = "A jellyfish-like creature." - health = 75 - maxHealth = 75 + mob_default_max_health = 75 jelly_scale = 0.75 can_escape = FALSE split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/fourth @@ -87,15 +83,13 @@ /mob/living/simple_animal/hostile/retaliate/jelly/mega/fourth name = "zeqetta" desc = "A tiny jellyfish-like creature." - health = 40 - maxHealth = 40 + mob_default_max_health = 40 jelly_scale = 0.375 split_type = /mob/living/simple_animal/hostile/retaliate/jelly/mega/eighth /mob/living/simple_animal/hostile/retaliate/jelly/mega/eighth name = "zeqttina" desc = "An absolutely tiny jellyfish-like creature." - health = 20 - maxHealth = 20 + mob_default_max_health = 20 jelly_scale = 0.1875 split_type = null \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index a0d3ce2685e..017b5fe527f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -13,8 +13,7 @@ emote_see = list("stamps a mighty foot, shaking the surroundings") meat_amount = 12 response_harm = "assaults" - health = 500 - maxHealth = 500 + mob_default_max_health = 500 mob_size = MOB_SIZE_LARGE mob_bump_flag = HEAVY can_escape = TRUE @@ -59,8 +58,7 @@ desc = "The King of Kings, God amongst men, and your superior in every way." icon = 'icons/mob/simple_animal/goat_king_phase_2.dmi' meat_amount = 36 - health = 750 - maxHealth = 750 + mob_default_max_health = 750 natural_weapon = /obj/item/natural_weapon/goatking/unleashed elemental_weapons = list( BURN = /obj/item/natural_weapon/goatking/fire/unleashed, @@ -94,8 +92,7 @@ name = "honour guard" desc = "A very handsome and noble beast." icon = 'icons/mob/simple_animal/goat_guard.dmi' - health = 125 - maxHealth = 125 + mob_default_max_health = 125 natural_weapon = /obj/item/natural_weapon/goathorns /obj/item/natural_weapon/goathorns @@ -108,8 +105,7 @@ name = "master of the guard" desc = "A very handsome and noble beast - the most trusted of all the king's men." icon = 'icons/mob/simple_animal/goat_master.dmi' - health = 200 - maxHealth = 200 + mob_default_max_health = 200 natural_weapon = /obj/item/natural_weapon/goathorns move_to_delay = 3 @@ -157,15 +153,16 @@ visible_message("\The [src]' eyes begin to glow ominously as dust and debris in the area is kicked up in a light breeze.") stop_automation = TRUE if(do_after(src, 6 SECONDS, src)) - var/health_holder = health + var/initial_brute = getBruteLoss() + var/initial_burn = getFireLoss() visible_message(SPAN_MFAUNA("\The [src] raises its fore-hooves and stomps them into the ground with incredible force!")) explosion(get_step(src,pick(global.cardinal)), -1, 2, 2, 3, 6) explosion(get_step(src,pick(global.cardinal)), -1, 1, 4, 4, 6) explosion(get_step(src,pick(global.cardinal)), -1, 3, 4, 3, 6) stop_automation = FALSE spellscast += 2 - if(!health < health_holder) - health = health_holder //our own magicks cannot harm us + setBruteLoss(initial_brute) + setFireLoss(initial_burn) else visible_message(SPAN_NOTICE("The [src] loses concentration and huffs haughtily.")) stop_automation = FALSE @@ -175,7 +172,8 @@ /mob/living/simple_animal/hostile/retaliate/goat/king/phase2/proc/phase3_transition() phase3 = TRUE spellscast = 0 - health = 750 + mob_default_max_health = 750 + current_health = mob_default_max_health new /obj/item/grenade/flashbang/instant(src.loc) QDEL_NULL(boss_theme) boss_theme = play_looping_sound(src, sound_id, 'sound/music/Visager-Miniboss_Fight.ogg', volume = 10, range = 8, falloff = 4, prefer_mute = TRUE) @@ -192,15 +190,14 @@ set_scale(1.25) default_pixel_y = 10 -/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/Life() +/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/handle_living_non_stasis_processes() . = ..() if(!.) return FALSE if(special_attacks >= 6 && current_damtype != BRUTE) visible_message(SPAN_MFAUNA("The energy surrounding \the [src]'s horns dissipates.")) current_damtype = BRUTE - - if(health <= 150 && !phase3 && spellscast == 5) //begin phase 3, reset spell limit and heal + if(current_health <= 150 && !phase3 && spellscast == 5) //begin phase 3, reset spell limit and heal phase3_transition() /mob/living/simple_animal/hostile/retaliate/goat/king/proc/OnDeath() @@ -235,6 +232,6 @@ . = ..() if(current_damtype != BRUTE) special_attacks++ - + /mob/living/simple_animal/hostile/retaliate/goat/king/Process_Spacemove() return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 1708cbad055..bfdc8f60074 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -43,7 +43,7 @@ universal_speak = TRUE meat_type = /obj/item/chems/food/meat/chicken/game meat_amount = 3 - skin_material = /decl/material/solid/skin/feathers + skin_material = /decl/material/solid/organic/skin/feathers var/parrot_state = PARROT_WANDER // Hunt for a perch when created var/parrot_sleep_max = 25 // The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick. @@ -125,7 +125,7 @@ parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. if(isliving(user)) var/mob/living/M = user - if(M.health < 50) //Weakened mob? Fight back! + if(M.current_health < 50) //Weakened mob? Fight back! parrot_state |= PARROT_ATTACK return parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! @@ -319,9 +319,7 @@ return //Time for the hurt to begin! - var/attacking_with = get_natural_weapon() - if(attacking_with) - L.attackby(attacking_with, src) + UnarmedAttack(L) return //Otherwise, fly towards the mob! diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 4c0ea689fc7..706053d576b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -42,8 +42,8 @@ H.enemies |= enemies return 0 -/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage) - ..(damage) +/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage, var/do_update_health = FALSE) + ..() Retaliate() /mob/living/simple_animal/hostile/retaliate/buckle_mob(mob/living/M) diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 5248b648d33..6be1362d635 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -5,8 +5,7 @@ icon = 'icons/mob/simple_animal/slug.dmi' response_harm = "stomps on" destroy_surroundings = 0 - health = 15 - maxHealth = 15 + mob_default_max_health = 15 speed = 0 move_to_delay = 0 density = TRUE @@ -51,7 +50,7 @@ if(prob(H.getBruteLoss()/2)) attach(H) -/mob/living/simple_animal/hostile/slug/Life() +/mob/living/simple_animal/hostile/slug/handle_regular_status_updates() . = ..() if(. && istype(src.loc, /obj/item/holder) && isliving(src.loc.loc)) //We in somebody var/mob/living/L = src.loc.loc diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index ca95c3dd1b0..b0f1997c402 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -6,11 +6,8 @@ turns_per_move = 5 meat_type = /obj/item/chems/food/fish speed = -1 - maxHealth = 250 - health = 250 - + mob_default_max_health = 250 pixel_x = -16 - harm_intent_damage = 5 natural_weapon = /obj/item/natural_weapon/bite @@ -20,6 +17,9 @@ minbodytemp = 0 faction = "carp" +/mob/living/simple_animal/hostile/tree/check_has_mouth() + return FALSE + /mob/living/simple_animal/hostile/tree/FindTarget() . = ..() if(.) @@ -27,6 +27,6 @@ /mob/living/simple_animal/hostile/tree/death(gibbed, deathmessage, show_dead_message) ..(null,"is hacked into pieces!", show_dead_message) - var/decl/material/mat = GET_DECL(/decl/material/solid/wood) + var/decl/material/mat = GET_DECL(/decl/material/solid/organic/wood) mat.place_shards(loc) qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index c0f8e6a2196..36ad1d84c93 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -3,8 +3,7 @@ name = "creature" desc = "You get the feeling you should run." icon = 'icons/mob/simple_animal/vagrant.dmi' - maxHealth = 60 - health = 20 + mob_default_max_health = 60 speed = 5 speak_chance = 0 turns_per_move = 4 @@ -18,32 +17,32 @@ max_gas = null minbodytemp = 0 gene_damage = -1 + pass_flags = PASS_FLAG_TABLE + bleed_colour = "#aad9de" + nutrition = 100 var/cloaked = 0 var/mob/living/carbon/human/gripping = null var/blood_per_tick = 3 var/health_per_tick = 0.8 - pass_flags = PASS_FLAG_TABLE - - bleed_colour = "#aad9de" /mob/living/simple_animal/hostile/vagrant/Process_Spacemove() return 1 /mob/living/simple_animal/hostile/vagrant/bullet_act(var/obj/item/projectile/Proj) - var/oldhealth = health + var/oldhealth = current_health . = ..() - if(isliving(Proj.firer) && (target_mob != Proj.firer) && health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) //Respond to being shot at + if(isliving(Proj.firer) && (target_mob != Proj.firer) && current_health < oldhealth && !incapacitated(INCAPACITATION_KNOCKOUT)) //Respond to being shot at target_mob = Proj.firer turns_per_move = 3 MoveToTarget() /mob/living/simple_animal/hostile/vagrant/death(gibbed) . = ..() - if(. && !gibbed) + if(stat == DEAD && !QDELETED(src) && !gibbed) gib() -/mob/living/simple_animal/hostile/vagrant/Life() +/mob/living/simple_animal/hostile/vagrant/handle_living_non_stasis_processes() . = ..() if(!.) return FALSE @@ -55,9 +54,9 @@ var/blood_volume = round(gripping.vessel.total_volume) if(blood_volume > 5) gripping.vessel.remove_any(blood_per_tick) - health = min(health + health_per_tick, maxHealth) + heal_overall_damage(health_per_tick) if(prob(15)) - to_chat(gripping, "You feel your fluids being drained!") + to_chat(gripping, SPAN_DANGER("You feel your fluids being drained!")) else gripping = null @@ -67,11 +66,11 @@ if(stance == HOSTILE_STANCE_IDLE && !cloaked) cloaked = 1 update_icon() - if(health == maxHealth) + + if(get_nutrition() > get_max_nutrition()) new/mob/living/simple_animal/hostile/vagrant(src.loc) new/mob/living/simple_animal/hostile/vagrant(src.loc) gib() - return /mob/living/simple_animal/hostile/vagrant/on_update_icon() ..() @@ -96,7 +95,7 @@ return //This line ensures there's always a reasonable chance of grabbing, while still //Factoring in health - if(!gripping && (cloaked || prob(health + ((maxHealth - health) * 2)))) + if(!gripping && (cloaked || prob(current_health + ((get_max_health() - current_health) * 2)))) gripping = H cloaked = 0 update_icon() diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm index cbe04e3dcd9..fa5f60048ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/viscerator.dm +++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm @@ -3,14 +3,13 @@ desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." icon = 'icons/mob/simple_animal/viscerator.dmi' pass_flags = PASS_FLAG_TABLE - health = 15 - maxHealth = 15 + mob_default_max_health = 15 natural_weapon = /obj/item/natural_weapon/rotating_blade faction = "syndicate" min_gas = null max_gas = null minbodytemp = 0 - + attack_delay = DEFAULT_QUICK_COOLDOWN bleed_colour = SYNTH_BLOOD_COLOR meat_type = null @@ -28,6 +27,9 @@ edge = 1 sharp = 1 +/mob/living/simple_animal/hostile/viscerator/check_has_mouth() + return FALSE + /mob/living/simple_animal/hostile/viscerator/death(gibbed, deathmessage, show_dead_message) ..(null, "is smashed into pieces!", show_dead_message) qdel(src) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index d3a41e1684c..10742fec191 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -3,8 +3,7 @@ real_name = "Shade" desc = "A bound spirit" icon = 'icons/mob/simple_animal/shade.dmi' - maxHealth = 50 - health = 50 + mob_default_max_health = 50 universal_speak = TRUE speak_emote = list("hisses") emote_hear = list("wails","screeches") @@ -34,6 +33,9 @@ skin_material = null skin_amount = 0 +/mob/living/simple_animal/shade/check_has_mouth() + return FALSE + /obj/item/natural_weapon/shade name = "foul touch" attack_verb = list("drained") @@ -43,13 +45,7 @@ /mob/living/simple_animal/shade/on_defilement() return -/mob/living/simple_animal/shade/Life() - . = ..() - OnDeathInLife() - -/mob/living/simple_animal/shade/proc/OnDeathInLife() - if(stat == DEAD) - new /obj/item/ectoplasm (src.loc) - visible_message(SPAN_WARNING("\The [src] lets out a contented sigh as their form unwinds.")) - ghostize() - qdel(src) +/mob/living/simple_animal/shade/death(gibbed, deathmessage, show_dead_message) + new /obj/item/ectoplasm (src.loc) + ..(deathmessage = "lets out a contented sigh as their form unwinds", show_dead_message = "You have been released from your earthly binds.") + qdel(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ee414277997..044a3274cb9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -1,7 +1,6 @@ /mob/living/simple_animal name = "animal" - health = 20 - maxHealth = 20 + mob_default_max_health = 20 universal_speak = FALSE mob_sort_value = 12 @@ -11,9 +10,9 @@ meat_type = /obj/item/chems/food/meat meat_amount = 3 - bone_material = /decl/material/solid/bone + bone_material = /decl/material/solid/organic/bone bone_amount = 5 - skin_material = /decl/material/solid/skin + skin_material = /decl/material/solid/organic/skin skin_amount = 5 icon_state = ICON_STATE_WORLD @@ -47,8 +46,6 @@ var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp var/fire_alert = 0 - var/list/hat_offsets - //Atmos effect - Yes, you can make creatures that require arbitrary gasses to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage var/list/min_gas = list(/decl/material/gas/oxygen = 5) var/list/max_gas = list( @@ -94,10 +91,15 @@ var/scannable_result // Codex page generated when this mob is scanned. var/base_animal_type // set automatically in Initialize(), used for language checking. + var/attack_delay = DEFAULT_ATTACK_COOLDOWN // How long in ds that a creature winds up before attacking. + var/sa_accuracy = 85 //base chance to hit out of 100 + /mob/living/simple_animal/Initialize() . = ..() // Aquatic creatures only care about water, not atmos. + add_inventory_slot(new /datum/inventory_slot/head/simple) + if(is_aquatic) max_gas = list() min_gas = list() @@ -108,8 +110,6 @@ base_animal_type = type if(LAZYLEN(natural_armor)) set_extension(src, armor_type, natural_armor) - if(islist(hat_offsets)) - set_extension(src, /datum/extension/hattable/directional, hat_offsets) if(scannable_result) set_extension(src, /datum/extension/scannable, scannable_result) setup_languages() @@ -161,11 +161,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() z_flags |= ZMM_MANGLE_PLANES add_overlay(I) - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - var/image/I = hattable?.get_hat_overlay(src) - if(I) - add_overlay(I) - /mob/living/simple_animal/get_eye_overlay() var/eye_icon_state = "[icon_state]-eyes" if(check_state_in_icon(eye_icon_state, icon)) @@ -178,46 +173,28 @@ var/global/list/simplemob_icon_bitflag_cache = list() QDEL_NULL(natural_weapon) . = ..() -/mob/living/simple_animal/Life() - if(is_aquatic && !submerged() && stat != DEAD) - walk(src, 0) - if(!HAS_STATUS(src, STAT_PARA)) // gated to avoid redundant update_icon() calls. - SET_STATUS_MAX(src, STAT_PARA, 3) - update_icon() +/mob/living/simple_animal/handle_regular_status_updates() + if(purge) + purge -= 1 . = ..() - if(!.) - return FALSE - if(z && !living_observers_present(SSmapping.get_connected_levels(z))) - return - //Health - if(stat == DEAD) - if(health > 0) - switch_from_dead_to_living_mob_list() - set_stat(CONSCIOUS) - set_density(1) - update_icon() - return 0 - - handle_atmos() - - if(health <= 0) - death() - return - - if(health > maxHealth) - health = maxHealth - - handle_supernatural() - handle_impaired_vision() - - if(can_bleed && bleed_ticks > 0) - handle_bleeding() - - delayed_life_action() - return 1 + if(.) + if(can_bleed && bleed_ticks > 0) + handle_bleeding() + if(is_aquatic && !submerged()) + walk(src, 0) + if(HAS_STATUS(src, STAT_PARA)) + SET_STATUS_MAX(src, STAT_PARA, 3) + update_icon() + +/mob/living/simple_animal/handle_some_updates() + . = ..() && (!z || living_observers_present(SSmapping.get_connected_levels(z))) + +/mob/living/simple_animal/handle_legacy_ai() + . = ..() + handle_async_life_action() // Handles timed stuff in Life() -/mob/living/simple_animal/proc/delayed_life_action() +/mob/living/simple_animal/proc/handle_async_life_action() set waitfor = FALSE if(performing_delayed_life_action) return @@ -267,12 +244,9 @@ var/global/list/simplemob_icon_bitflag_cache = list() if("emote_see") visible_emote("[pick(emote_see)].") -/mob/living/simple_animal/proc/handle_atmos(var/atmos_suitable = 1) - //Atmos - if(!loc) - return - - var/datum/gas_mixture/environment = loc.return_air() +/mob/living/simple_animal/handle_environment(datum/gas_mixture/environment) + . = ..() + var/atmos_suitable = TRUE if(environment) // don't bother checking it twice if we got a supplied FALSE val. if(atmos_suitable) @@ -308,10 +282,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() O.unbuckle_mob(M) visible_message(SPAN_DANGER("\The [M] escapes from \the [O]!")) -/mob/living/simple_animal/proc/handle_supernatural() - if(purge) - purge -= 1 - /mob/living/simple_animal/gib() ..(((mob_icon_state_flags & MOB_ICON_HAS_GIB_STATE) ? "world-gib" : null), TRUE) @@ -334,7 +304,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() damage = Proj.damage / 1.5 if(Proj.agony) damage += Proj.agony / 6 - if(health < Proj.agony * 3) + if(current_health < Proj.agony * 3) SET_STATUS_MAX(src, STAT_PARA, Proj.agony / 20) visible_message("[src] is stunned momentarily!") @@ -347,7 +317,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() . = ..() || list(response_help_3p, response_help_1p) /mob/living/simple_animal/default_help_interaction(mob/user) - if(health > 0 && user.attempt_hug(src)) + if(current_health > 0 && user.attempt_hug(src)) user.update_personal_goal(/datum/goal/achievement/specific_object/pet, type) return TRUE . = ..() @@ -378,12 +348,13 @@ var/global/list/simplemob_icon_bitflag_cache = list() return TRUE /mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) + if(istype(O, /obj/item/stack/medical)) if(stat != DEAD) var/obj/item/stack/medical/MED = O if(!MED.animal_heal) to_chat(user, SPAN_WARNING("\The [MED] won't help \the [src] at all!")) - else if(health < maxHealth && MED.can_use(1)) + else if(current_health < get_max_health() && MED.can_use(1)) adjustBruteLoss(-MED.animal_heal) visible_message(SPAN_NOTICE("\The [user] applies \the [MED] to \the [src].")) MED.use(1) @@ -392,33 +363,23 @@ var/global/list/simplemob_icon_bitflag_cache = list() to_chat(user, SPAN_WARNING("\The [src] is dead, medical items won't bring [G.him] back to life.")) return TRUE - if(istype(O, /obj/item/flash) && stat != DEAD) - return O.attack(src, user, user.get_target_zone()) - - if(meat_type && (stat == DEAD) && meat_amount) - if(istype(O, /obj/item/knife/kitchen/cleaver)) - var/victim_turf = get_turf(src) - if(!locate(/obj/structure/table, victim_turf)) - to_chat(user, SPAN_WARNING("You need to place \the [src] on a table to butcher it.")) - return TRUE - var/time_to_butcher = (mob_size) - to_chat(user, SPAN_WARNING("You begin harvesting \the [src].")) - if(do_after(user, time_to_butcher, src, same_direction = TRUE)) - if(prob(user.skill_fail_chance(SKILL_COOKING, 60, SKILL_ADEPT))) - to_chat(user, SPAN_DANGER("You botch harvesting \the [src], and ruin some of the meat in the process.")) - subtract_meat(user) - else - harvest(user, user.get_skill_value(SKILL_COOKING)) - else - to_chat(user, SPAN_DANGER("Your hand slips with your movement, and some of the meat is ruined.")) - subtract_meat(user) - return TRUE - - else - if(!O.force || (O.item_flags & ITEM_FLAG_NO_BLUDGEON)) - visible_message(SPAN_NOTICE("\The [user] gently taps [src] with \the [O].")) + if(meat_type && (stat == DEAD) && meat_amount && istype(O, /obj/item/knife/kitchen/cleaver)) + var/victim_turf = get_turf(src) + if(!locate(/obj/structure/table, victim_turf)) + to_chat(user, SPAN_WARNING("You need to place \the [src] on a table to butcher it.")) return TRUE - return O.attack(src, user, user.get_target_zone() || ran_zone()) + var/time_to_butcher = (mob_size) + to_chat(user, SPAN_WARNING("You begin harvesting \the [src].")) + if(do_after(user, time_to_butcher, src, same_direction = TRUE)) + if(prob(user.skill_fail_chance(SKILL_COOKING, 60, SKILL_ADEPT))) + to_chat(user, SPAN_DANGER("You botch harvesting \the [src], and ruin some of the meat in the process.")) + subtract_meat(user) + else + harvest(user, user.get_skill_value(SKILL_COOKING)) + else + to_chat(user, SPAN_DANGER("Your hand slips with your movement, and some of the meat is ruined.")) + subtract_meat(user) + return TRUE return ..() @@ -453,17 +414,17 @@ var/global/list/simplemob_icon_bitflag_cache = list() tally = 1 tally *= purge - return tally+config.animal_delay + return tally+get_config_value(/decl/config/num/movement_animal) /mob/living/simple_animal/Stat() . = ..() if(statpanel("Status") && show_stat_health) - stat(null, "Health: [round((health / maxHealth) * 100)]%") + stat(null, "Health: [get_health_percent()]%") /mob/living/simple_animal/death(gibbed, deathmessage = "dies!", show_dead_message) density = FALSE - adjustBruteLoss(maxHealth) //Make sure dey dead. + adjustBruteLoss(get_max_health()) //Make sure dey dead. walk_to(src,0) . = ..(gibbed,deathmessage,show_dead_message) @@ -479,26 +440,10 @@ var/global/list/simplemob_icon_bitflag_cache = list() damage = 30 apply_damage(damage, BRUTE, damage_flags = DAM_EXPLODE) -/mob/living/simple_animal/adjustBruteLoss(damage) - ..() - updatehealth() - -/mob/living/simple_animal/adjustFireLoss(damage) - ..() - updatehealth() - -/mob/living/simple_animal/adjustToxLoss(damage) - ..() - updatehealth() - -/mob/living/simple_animal/adjustOxyLoss(damage) - ..() - updatehealth() - /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) var/mob/living/L = target_mob - if(!L.stat && L.health >= 0) + if(!L.stat && L.current_health >= 0) return (0) return 1 @@ -544,11 +489,12 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(P.damtype == BRUTE) var/hit_dir = get_dir(P.starting, src) var/obj/effect/decal/cleanable/blood/B = blood_splatter(get_step(src, hit_dir), src, 1, hit_dir) - B.icon_state = pick("dir_splatter_1","dir_splatter_2") - B.basecolor = bleed_colour - var/scale = min(1, round(mob_size / MOB_SIZE_MEDIUM, 0.1)) - B.set_scale(scale) - B.update_icon() + if(!QDELETED(B)) + B.icon_state = pick("dir_splatter_1","dir_splatter_2") + B.basecolor = bleed_colour + var/scale = min(1, round(mob_size / MOB_SIZE_MEDIUM, 0.1)) + B.set_scale(scale) + B.update_icon() /mob/living/simple_animal/handle_fire() return @@ -610,13 +556,17 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/getCloneLoss() . = max(0, gene_damage) -/mob/living/simple_animal/adjustCloneLoss(var/amount) +/mob/living/simple_animal/adjustCloneLoss(var/amount, var/do_update_health = TRUE) + SHOULD_CALL_PARENT(FALSE) setCloneLoss(gene_damage + amount) + if(do_update_health) + update_health() /mob/living/simple_animal/setCloneLoss(amount) if(gene_damage >= 0) - gene_damage = clamp(amount, 0, maxHealth) - if(gene_damage >= maxHealth) + var/current_max_health = get_max_health() + gene_damage = clamp(amount, 0, current_max_health) + if(gene_damage >= current_max_health) death() /mob/living/simple_animal/get_admin_job_string() @@ -653,7 +603,6 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_hydration() return get_max_hydration() - /// Adapts our temperature and atmos thresholds to our current z-level. /mob/living/simple_animal/proc/adapt_to_current_level() var/turf/T = get_turf(src) @@ -686,3 +635,15 @@ var/global/list/simplemob_icon_bitflag_cache = list() if(max_gas) min_gas[gas] = round(gas_amt * 1.5) +// Simple filler bodytype so animals get offsets for their inventory slots. +/decl/bodytype/animal + abstract_type = /decl/bodytype/animal + name = "animal" + bodytype_flag = 0 + bodytype_category = "animal body" + +/mob/living/simple_animal/proc/get_melee_accuracy() + return clamp(sa_accuracy - melee_accuracy_mods(), 0, 100) + +/mob/living/simple_animal/check_has_mouth() + return TRUE diff --git a/code/modules/mob/living/stasis.dm b/code/modules/mob/living/stasis.dm index 490b49be8e4..76fda177df5 100644 --- a/code/modules/mob/living/stasis.dm +++ b/code/modules/mob/living/stasis.dm @@ -16,14 +16,19 @@ stasis_value += stasis_sources[source] stasis_sources = null + if(stasis_value > 1 && GET_STATUS(src, STAT_DROWSY) < stasis_value * 4) + ADJ_STATUS(src, STAT_DROWSY, min(stasis_value, 3)) + if(stat == CONSCIOUS && prob(1)) + to_chat(src, SPAN_NOTICE("You feel slow and sluggish...")) + /mob/living/proc/get_cryogenic_factor(var/bodytemperature) if(isSynthetic()) return 0 - var/cold_1 = get_temperature_threshold(COLD_LEVEL_1) - var/cold_2 = get_temperature_threshold(COLD_LEVEL_2) - var/cold_3 = get_temperature_threshold(COLD_LEVEL_3) + var/cold_1 = get_mob_temperature_threshold(COLD_LEVEL_1) + var/cold_2 = get_mob_temperature_threshold(COLD_LEVEL_2) + var/cold_3 = get_mob_temperature_threshold(COLD_LEVEL_3) if(bodytemperature > cold_1) return 0 diff --git a/code/modules/mob/living/stress.dm b/code/modules/mob/living/stress.dm index b67360e26bc..2cb46e0c27b 100644 --- a/code/modules/mob/living/stress.dm +++ b/code/modules/mob/living/stress.dm @@ -1,7 +1,7 @@ #define GET_STRESSOR(S) (istype(S, /datum/stressor) ? S : SSmanaged_instances.get(S, cache_category = /datum/stressor)) /mob/living/proc/get_stress_modifier() - if(!config.adjust_healing_from_stress) + if(!get_config_value(/decl/config/toggle/health_adjust_healing_from_stress)) return 0 return stress diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 790b2ee8eb7..9f367883a5e 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -5,7 +5,7 @@ computer_id = client.computer_id last_ckey = ckey log_access("Login: [key_name(src)] from [lastKnownIP ? lastKnownIP : "localhost"]-[computer_id] || BYOND v[client.byond_version]") - if(config.log_access) + if(get_config_value(/decl/config/toggle/log_access)) var/is_multikeying = 0 for(var/mob/M in global.player_list) if(M == src) continue @@ -29,7 +29,8 @@ spawn(1 SECOND) to_chat(src, "WARNING: It would seem that you are sharing connection or computer with another player. If you haven't done so already, please contact the staff via the Adminhelp verb to resolve this situation. Failure to do so may result in administrative action. You have been warned.") - if(config.login_export_addr) + var/login_export_addr = get_config_value(/decl/config/text/login_export_addr) + if(login_export_addr) spawn(-1) var/list/params = new params["login"] = 1 @@ -40,7 +41,7 @@ params["clientid"] = client.computer_id params["roundid"] = game_id params["name"] = real_name || name - world.Export("[config.login_export_addr]?[list2params(params)]", null, 1) + world.Export("[login_export_addr]?[list2params(params)]", null, 1) /mob/proc/maybe_send_staffwarns(var/action) if(client.staffwarn) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 658c0ff7a5d..64eb428b4be 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -26,7 +26,7 @@ if(client) for(var/atom/movable/AM in client.screen) var/obj/screen/screenobj = AM - if(istype(screenobj) && !screenobj.globalscreen) + if(istype(screenobj) && !screenobj.is_global_screen) qdel(screenobj) client.screen = list() if(mind) @@ -36,7 +36,6 @@ return ..() /mob/proc/remove_screen_obj_references() - QDEL_NULL_SCREEN(hands) QDEL_NULL_SCREEN(internals) QDEL_NULL_SCREEN(oxygen) QDEL_NULL_SCREEN(toxin) @@ -44,6 +43,7 @@ QDEL_NULL_SCREEN(bodytemp) QDEL_NULL_SCREEN(healths) QDEL_NULL_SCREEN(throw_icon) + QDEL_NULL_SCREEN(maneuver_icon) QDEL_NULL_SCREEN(nutrition_icon) QDEL_NULL_SCREEN(hydration_icon) QDEL_NULL_SCREEN(pressure) @@ -64,6 +64,7 @@ if(ispath(move_intent)) move_intent = GET_DECL(move_intent) . = ..() + ability_master = new(null, src) refresh_ai_handler() START_PROCESSING(SSmobs, src) @@ -341,7 +342,7 @@ var/obj/item/held = inv_slot.get_equipped_item() dat += "[capitalize(inv_slot.slot_name)]: [held?.name || "nothing"]" - var/list/all_slots = get_all_valid_equipment_slots() + var/list/all_slots = get_all_available_equipment_slots() if(all_slots) for(var/slot in (all_slots-global.pocket_slots)) if(slot in my_held_item_slots) @@ -362,13 +363,16 @@ break // Other incidentals. - var/obj/item/clothing/under/suit = get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/suit = get_equipped_item(slot_w_uniform_str) if(istype(suit)) dat += "
    Pockets: Empty or Place Item" - if(suit.has_sensor == SUIT_HAS_SENSORS) - dat += "
    Set sensors" - if (suit.has_sensor && user.get_multitool()) - dat += "
    [suit.has_sensor == SUIT_LOCKED_SENSORS ? "Unl" : "L"]ock sensors" + var/obj/item/clothing/accessory/vitals_sensor/sensor = get_vitals_sensor() + if(sensor) + if(sensor.get_sensors_locked()) + dat += "
    Unlock vitals sensors" + else if(user.get_multitool()) + dat += "
    Lock vitals sensors" + dat += "
    Set vitals sensors" if(get_equipped_item(slot_handcuffed_str)) dat += "
    Handcuffed" @@ -399,7 +403,7 @@ face_atom(A) - if(!isghost(src)) + if(!isghost(src) && get_config_value(/decl/config/toggle/visible_examine)) if((A.loc != src || (A in get_held_items()))) var/look_target = "at \the [A]" if(isobj(A.loc)) @@ -590,7 +594,7 @@ return TRUE return FALSE -/mob/handle_mouse_drop(atom/over, mob/user) +/mob/handle_mouse_drop(atom/over, mob/user, params) if(over == user && user != src && !isAI(user)) show_stripping_window(user) return TRUE @@ -700,10 +704,9 @@ return 0 //Updates lying and icons -/mob/proc/UpdateLyingBuckledAndVerbStatus() - var/last_lying = lying +/mob/proc/update_lying() if(!resting && cannot_stand() && can_stand_overridden()) - lying = 0 + lying = FALSE else if(buckled) anchored = TRUE if(istype(buckled)) @@ -716,12 +719,16 @@ else lying = incapacitated(INCAPACITATION_KNOCKDOWN) +/mob/proc/UpdateLyingBuckledAndVerbStatus() + var/last_lying = lying + update_lying() + if(buckled) + anchored = (!istype(buckled) || !buckled.buckle_movable) if(lying) set_density(0) drop_held_items() else set_density(initial(density)) - reset_layer() //Temporarily moved here from the various life() procs @@ -806,7 +813,7 @@ /mob/living/silicon/robot/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE) LAZYREMOVE(embedded, implant) - adjustBruteLoss(5) + adjustBruteLoss(5, do_update_health = FALSE) adjustFireLoss(10) . = ..() @@ -1062,12 +1069,54 @@ return 0 return 1 -// Let simple mobs press buttons and levers but nothing more complex. -/mob/proc/get_dexterity(var/silent = FALSE) - var/decl/species/my_species = get_species() - if(my_species) - return my_species.get_manual_dexterity() - return DEXTERITY_BASE +// Mobs further up the chain should override this proc if they want to return a simple dexterity value. +/mob/proc/get_dexterity(var/silent) + + // Check if we have a slot to use for this. + var/check_slot = get_active_held_item_slot() + if(!check_slot) + return DEXTERITY_NONE + var/datum/inventory_slot/gripper/gripper = get_inventory_slot_datum(check_slot) + if(!istype(gripper)) + if(!silent) + to_chat(src, "Your [parse_zone(check_slot)] is missing!") + return DEXTERITY_NONE + + // Work out if we have any brain damage impacting our dexterity. + var/dex_malus = 0 + if(getBrainLoss()) + var/brainloss_threshold = get_config_value(/decl/config/num/dex_malus_brainloss_threshold) + if(getBrainLoss() > brainloss_threshold) ///brainloss shouldn't instantly cripple you, so the effects only start once past the threshold and escalate from there. + dex_malus = clamp(CEILING((getBrainLoss()-brainloss_threshold)/10), 0, length(global.dexterity_levels)) + if(dex_malus > 0) + dex_malus = global.dexterity_levels[dex_malus] + + // If this slot does not need an organ we just go off the dexterity of the slot itself. + if(isnull(gripper.requires_organ_tag)) + if(dex_malus) + if(!silent) + to_chat(src, SPAN_WARNING("Your [lowertext(gripper.slot_name)] doesn't respond properly!")) + return (gripper.get_dexterity(silent) & ~dex_malus) + return gripper.get_dexterity(silent) + + // If this slot requires an organ, do the appropriate organ checks. + var/obj/item/organ/external/active_hand = GET_EXTERNAL_ORGAN(src, check_slot) + if(!active_hand) + if(!silent) + to_chat(src, "Your [parse_zone(check_slot)] is missing!") + return DEXTERITY_NONE + if(!active_hand.is_usable()) + if(!silent) + to_chat(src, SPAN_WARNING("Your [active_hand.name] is unusable!")) + return DEXTERITY_NONE + + // Return our organ dexterity. + if(dex_malus) + if(!silent) + to_chat(src, SPAN_WARNING("Your [active_hand.name] doesn't respond properly!")) + return (active_hand.get_manual_dexterity() & ~dex_malus) + return active_hand.get_manual_dexterity() + /mob/proc/check_dexterity(var/dex_level = DEXTERITY_FULL, var/silent = FALSE) . = (get_dexterity(silent) & dex_level) == dex_level @@ -1087,9 +1136,12 @@ to_chat(src, SPAN_WARNING("You scrawl down some meaningless lines.")) . = stars(text_content, 5) -// mobs do not have mouths by default +// mobs do not have mouths by default, unless provided by an organ /mob/proc/check_has_mouth() - return FALSE + var/obj/item/organ/external/head/H = get_organ(BP_HEAD, /obj/item/organ/external/head) + if(!H || !istype(H) || !H.can_intake_reagents) + return FALSE + return TRUE /mob/proc/check_has_eyes() return TRUE @@ -1138,7 +1190,6 @@ /mob/proc/get_bodytype() RETURN_TYPE(/decl/bodytype) - return /mob/proc/has_body_flag(flag, default = FALSE) var/decl/bodytype/root_bodytype = get_bodytype() @@ -1307,10 +1358,10 @@ /mob/verb/whisper_wrapper() set name = ".Whisper" set hidden = TRUE - if(config.show_typing_indicator_for_whispers) + if(get_config_value(/decl/config/toggle/show_typing_indicator_for_whispers)) SStyping.set_indicator_state(client, TRUE) var/message = input("","me (text)") as text|null - if(config.show_typing_indicator_for_whispers) + if(get_config_value(/decl/config/toggle/show_typing_indicator_for_whispers)) SStyping.set_indicator_state(client, FALSE) if (message) whisper(message) @@ -1318,7 +1369,7 @@ // Darksight procs. /mob/proc/refresh_lighting_master() if(!lighting_master) - lighting_master = new + lighting_master = new(null, src) if(client) client.screen |= lighting_master @@ -1334,7 +1385,7 @@ /mob/proc/get_target_zone() return zone_sel?.selecting -/mob/proc/get_temperature_threshold(var/threshold) +/mob/proc/get_default_temperature_threshold(threshold) switch(threshold) if(COLD_LEVEL_1) return 243 @@ -1349,7 +1400,22 @@ if(HEAT_LEVEL_3) return 1000 else - CRASH("base get_temperature_threshold() called with invalid threshold value.") + CRASH("base get_default_temperature_threshold() called with invalid threshold value.") + +/mob/proc/get_mob_temperature_threshold(threshold, bodypart) + + // If we have organs, return the requested organ. + if(bodypart) + var/obj/item/organ/external/organ = get_organ(bodypart) + if(organ?.bodytype) + return organ.bodytype.get_body_temperature_threshold(threshold) + + // If we have a bodytype, use that. + var/decl/bodytype/root_bodytype = get_bodytype() + if(root_bodytype) + return root_bodytype.get_body_temperature_threshold(threshold) + + return get_default_temperature_threshold(threshold) /mob/proc/get_unique_enzymes() return @@ -1359,4 +1425,23 @@ // Gets the ID card of a mob, but will not check types in the exceptions list /mob/GetIdCard(exceptions = null) + RETURN_TYPE(/obj/item/card/id) return LAZYACCESS(GetIdCards(exceptions), 1) + +/mob/get_overhead_text_x_offset() + return offset_overhead_text_x + +/mob/get_overhead_text_y_offset() + return offset_overhead_text_y + +/mob/can_be_injected_by(var/atom/injector) + return FALSE // Handled elsewhere in syringe logic. + +/mob/proc/getBrainLoss() + return 0 + +/mob/proc/get_bodytype_category() + return get_bodytype()?.bodytype_category + +/mob/proc/get_overlay_state_modifier() + return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2a4d148347d..a23c167a142 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -39,27 +39,26 @@ var/stat = CONSCIOUS //Whether a mob is alive or dead. TODO: Move this to living - Nodrak - var/obj/screen/cells = null - - var/obj/screen/hands = null - var/obj/screen/internals = null - var/obj/screen/oxygen = null - var/obj/screen/toxin = null - var/obj/screen/fire = null - var/obj/screen/bodytemp = null - var/obj/screen/healths = null - var/obj/screen/throw_icon = null - var/obj/screen/nutrition_icon = null - var/obj/screen/hydration_icon = null - var/obj/screen/pressure = null - var/obj/screen/pain = null - var/obj/screen/up_hint = null - var/obj/screen/gun/item/item_use_icon = null - var/obj/screen/gun/radio/radio_use_icon = null - var/obj/screen/gun/move/gun_move_icon = null - var/obj/screen/gun/mode/gun_setting_icon = null - - var/obj/screen/ability_master/ability_master = null + var/obj/screen/robot_module_select/hands + var/obj/screen/warning_cells/cells + var/obj/screen/internals/internals + var/obj/screen/oxygen/oxygen + var/obj/screen/toxins/toxin + var/obj/screen/fire_warning/fire + var/obj/screen/bodytemp/bodytemp + var/obj/screen/health_warning/healths + var/obj/screen/throw_toggle/throw_icon + var/obj/screen/maneuver/maneuver_icon + var/obj/screen/food/nutrition_icon + var/obj/screen/drink/hydration_icon + var/obj/screen/pressure/pressure + var/obj/screen/fullscreen/pain/pain + var/obj/screen/up_hint/up_hint + var/obj/screen/gun/item/item_use_icon + var/obj/screen/gun/radio/radio_use_icon + var/obj/screen/gun/move/gun_move_icon + var/obj/screen/gun/mode/gun_setting_icon + var/obj/screen/ability_master/ability_master /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. @@ -86,7 +85,6 @@ var/radio_interrupt_cooldown = 0 // TODO move this to /human - var/unacidable = 0 var/list/pinned // Lazylist of things pinning this creature to walls (see living_defense.dm) var/list/embedded // Embedded items, since simple mobs don't have organs. var/list/languages = list() // TODO: lazylist this var. For speaking/listening. @@ -175,3 +173,7 @@ /// Used for darksight, required on all mobs to ensure lighting renders properly. var/obj/screen/lighting_plane_master/lighting_master + + // Offset the overhead text if necessary. + var/offset_overhead_text_x = 0 + var/offset_overhead_text_y = 0 \ No newline at end of file diff --git a/code/modules/mob/mob_eating.dm b/code/modules/mob/mob_eating.dm new file mode 100644 index 00000000000..17155f71569 --- /dev/null +++ b/code/modules/mob/mob_eating.dm @@ -0,0 +1,12 @@ +// mobs do not have blocked mouths by default +// overridden in human_defense.dm +/mob/proc/check_mouth_coverage() + return null + +/mob/proc/get_eaten_transfer_amount(var/default) + . = default + if(issmall(src)) + . = CEILING(.*0.5) + +/mob/proc/can_eat_food_currently(obj/eating, mob/user) + return TRUE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index af0fac10217..d8ce31b26fb 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -66,11 +66,12 @@ /proc/getsensorlevel(A) var/mob/M = A - if(istype(M)) - var/obj/item/clothing/under/U = M.get_equipped_item(slot_w_uniform_str) - if(istype(U)) - return U.sensor_mode - return SUIT_SENSOR_OFF + if(!istype(M)) + return VITALS_SENSOR_OFF + var/obj/item/clothing/accessory/vitals_sensor/sensor = M.get_vitals_sensor() + if(sensor) + return sensor.sensor_mode + return VITALS_SENSOR_OFF /proc/is_admin(var/mob/user) return check_rights(R_ADMIN, 0, user) != 0 @@ -120,9 +121,8 @@ var/global/list/global/organ_rel_size = list( . = zone || BP_CHEST if(. == BP_EYES || . == BP_MOUTH) . = BP_HEAD - if(ishuman(target) && !base_zone_only) - var/mob/living/carbon/human/H = target - . = H.get_bodytype().get_limb_from_zone(.) + if(!base_zone_only && target) + . = target.get_bodytype()?.get_limb_from_zone(.) || . // Returns zone with a certain probability. If the probability fails, or no zone is specified, then a random body part is chosen. // Do not use this if someone is intentionally trying to hit a specific body part. diff --git a/code/modules/mob/mob_layering.dm b/code/modules/mob/mob_layering.dm index 33f8325c27a..e3143c6d1dc 100644 --- a/code/modules/mob/mob_layering.dm +++ b/code/modules/mob/mob_layering.dm @@ -90,7 +90,13 @@ if(istext(pixel_shift)) pixel_shift = cached_json_decode(pixel_shift) if(islist(pixel_shift)) - var/list/directional_offset = LAZYACCESS(pixel_shift, "[dir]") + var/list/directional_offset = LAZYACCESS(pixel_shift, num2text(dir)) + // Unset diagonals should be substituted with the appropriate NSEW value. + if(!directional_offset) + if(dir & EAST) + directional_offset = LAZYACCESS(pixel_shift, num2text(EAST)) + else if(dir & WEST) + directional_offset = LAZYACCESS(pixel_shift, num2text(WEST)) if(islist(directional_offset)) pixel_shift = directional_offset new_pixel_x += pixel_shift["x"] || 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index ee367c3390a..621d6b5425a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -49,15 +49,15 @@ mob.hotkey_drop() /mob/proc/hotkey_drop() - . = has_extension(src, /datum/extension/hattable) + return FALSE /mob/living/hotkey_drop() - if(length(get_active_grabs()) || ..()) - drop_item() - -/mob/living/carbon/hotkey_drop() - var/obj/item/hand = get_active_hand() - if(hand?.can_be_dropped_by_client(src) || ..()) + if(length(get_active_grabs())) + . = TRUE + else + var/obj/item/hand = get_active_hand() + . = hand?.can_be_dropped_by_client(src) + if(.) drop_item() /client/verb/swap_hand() diff --git a/code/modules/mob/mob_status.dm b/code/modules/mob/mob_status.dm index 82ff6b6fd49..0e2c45822b9 100644 --- a/code/modules/mob/mob_status.dm +++ b/code/modules/mob/mob_status.dm @@ -5,8 +5,5 @@ /mob/proc/clear_status_effects() return -/mob/proc/handle_status_condition(var/condition) - return - /mob/proc/set_status(var/condition, var/amount) return diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index f9f04a6e329..e4f273ad596 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -50,7 +50,7 @@ var/global/list/href_to_mob_type = list( //This proc is the most basic of the procs. All it does is make a new mob on the same tile and transfer over a few variables. //Returns the new mob -//Note that this proc does NOT do MMI related stuff! +//Note that this proc does NOT do brain related stuff! /mob/proc/change_mob_type(var/new_type, var/turf/location, var/new_name, var/subspecies) if(!new_type) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 54bd8e68b81..6951ec383e3 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -46,5 +46,5 @@ // bolds the changelog button on the interface so we know there are updates. if(client.prefs?.lastchangelog != global.changelog_hash) to_chat(client, SPAN_NOTICE("You have unread updates in the changelog.")) - if(config.aggressive_changelog) + if(get_config_value(/decl/config/toggle/aggressive_changelog)) client.changes() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a165ce1ddc3..bbc3e208b3e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -1,15 +1,12 @@ /mob/new_player universal_speak = TRUE mob_sort_value = 10 - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT simulated = FALSE - density = FALSE stat = DEAD - movement_handlers = list() anchored = TRUE // don't get pushed around - virtual_mob = null // Hear no evil, speak no evil var/ready = 0 @@ -19,7 +16,6 @@ var/totalPlayers = 0 var/totalPlayersReady = 0 var/show_invalid_jobs = 0 - var/datum/browser/panel INITIALIZE_IMMEDIATE(/mob/new_player) @@ -112,20 +108,21 @@ INITIALIZE_IMMEDIATE(/mob/new_player) to_chat(src, SPAN_WARNING("Please wait for server initialization to complete...")) return - if(!config.respawn_delay || client.holder || alert(src,"Are you sure you wish to observe? You will have to wait [config.respawn_delay] minute\s before being able to respawn!","Player Setup","Yes","No") == "Yes") + var/respawn_delay = get_config_value(/decl/config/num/respawn_delay) + if(!respawn_delay || client.holder || alert(src,"Are you sure you wish to observe? You will have to wait [respawn_delay] minute\s before being able to respawn!","Player Setup","Yes","No") == "Yes") if(!client) return 1 var/mob/observer/ghost/observer = new() spawning = 1 sound_to(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = sound_channels.lobby_channel))// MAD JAMS cant last forever yo - observer.started_as_observer = 1 close_spawn_windows() - var/obj/O = locate("landmark*Observer-Start") - if(istype(O)) + var/decl/spawnpoint/spawnpoint = GET_DECL(/decl/spawnpoint/observer) + var/turf/T = SAFEPICK(spawnpoint.get_spawn_turfs(src)) + if(istype(T)) to_chat(src, SPAN_NOTICE("Now teleporting.")) - observer.forceMove(O.loc) + observer.forceMove(T) else to_chat(src, SPAN_DANGER("Could not locate an observer spawn point. Use the Teleport verb to jump to the map.")) observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. @@ -142,7 +139,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) client.prefs.real_name = client.prefs.get_random_name() observer.real_name = client.prefs.real_name observer.SetName(observer.real_name) - if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + if(!client.holder && !get_config_value(/decl/config/toggle/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed. observer.verbs -= /mob/observer/ghost/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key qdel(src) @@ -187,7 +184,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) to_chat(usr, "The round is either not ready, or has already finished...") return 0 - if(!config.enter_allowed) + if(!get_config_value(/decl/config/toggle/on/enter_allowed)) to_chat(usr, "There is an administrative lock on entering the game!") return 0 @@ -202,12 +199,14 @@ INITIALIZE_IMMEDIATE(/mob/new_player) to_chat(src, alert("That spawnpoint is unavailable. Please try another.")) return 0 - var/turf/spawn_turf = pick(spawnpoint.turfs) + var/turf/spawn_turf if(job.latejoin_at_spawnpoints) var/obj/S = job.get_roundstart_spawnpoint() spawn_turf = get_turf(S) + else + spawn_turf = SAFEPICK(spawnpoint.get_spawn_turfs(src)) - if(!job.no_warn_unsafe && !SSjobs.check_unsafe_spawn(src, spawn_turf)) + if(!spawn_turf || !job.no_warn_unsafe && !SSjobs.check_unsafe_spawn(src, spawn_turf)) return // Just in case someone stole our position while we were waiting for input from alert() proc @@ -221,7 +220,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(!character) return 0 - character = SSjobs.equip_rank(character, job.title, 1) //equips the human + character = SSjobs.equip_job_title(character, job.title, 1) //equips the human SScustomitems.equip_custom_items(character) if(job.do_spawn_special(character, src, TRUE)) //This replaces the AI spawn logic with a proc stub. Refer to silicon.dm for the spawn logic. @@ -235,9 +234,11 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(!(ASSIGNMENT_ROBOT in job.event_categories)) CreateModularRecord(character) SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - AnnounceArrival(character, job, spawnpoint.msg) - else - AnnounceCyborg(character, job, spawnpoint.msg) + if(spawnpoint.spawn_announcement) + AnnounceArrival(character, job, spawnpoint.spawn_announcement) + else if(spawnpoint.spawn_announcement) + AnnounceCyborg(character, job, spawnpoint.spawn_announcement) + callHook("player_latejoin", list(job, character)) log_and_message_admins("has joined the round as [character.mind.assigned_role].", character) @@ -360,7 +361,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(!job) job = SSjobs.get_by_title(global.using_map.default_job_title) var/decl/spawnpoint/spawnpoint = job.get_spawnpoint(client, client.prefs.ranks[job.title]) - spawn_turf = pick(spawnpoint.turfs) + spawn_turf = DEFAULTPICK(spawnpoint.get_spawn_turfs(src), get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) if(chosen_species) if(!check_species_allowed(chosen_species)) @@ -393,7 +394,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) // Do the initial caching of the player's body icons. new_character.force_update_limbs() - new_character.refresh_visible_overlays() + new_character.try_refresh_visible_overlays() new_character.key = key //Manually transfer the key to log them in return new_character diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 0bf28fceb61..5445b9c23dc 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -74,9 +74,8 @@ previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title], branch, rank) update_icon = TRUE - if(!(mannequin.get_bodytype().appearance_flags & HAS_UNDERWEAR)) - if(all_underwear) - all_underwear.Cut() + if(!(mannequin.get_bodytype()?.appearance_flags & HAS_UNDERWEAR) && length(all_underwear)) + all_underwear.Cut() if((equip_preview_mob & EQUIP_PREVIEW_LOADOUT) && !(previewJob && (equip_preview_mob & EQUIP_PREVIEW_JOB) && previewJob.skip_loadout_preview)) // Equip custom gear loadout, replacing any job items @@ -105,6 +104,7 @@ if(update_icon) mannequin.update_icon() + mannequin.compile_overlays() /datum/preferences/proc/update_preview_icon() var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) diff --git a/code/modules/mob/observer/eye/blueprints_eye.dm b/code/modules/mob/observer/eye/blueprints_eye.dm index c868ed59ee8..7742f8f2c6b 100644 --- a/code/modules/mob/observer/eye/blueprints_eye.dm +++ b/code/modules/mob/observer/eye/blueprints_eye.dm @@ -325,7 +325,7 @@ var/datum/shuttle/our_shuttle = SSshuttle.shuttles[shuttle_name] our_shuttle.shuttle_area += A SSshuttle.shuttle_areas += A - events_repository.register(/decl/observ/destroyed, A, our_shuttle, /datum/shuttle/proc/remove_shuttle_area) + events_repository.register(/decl/observ/destroyed, A, our_shuttle, TYPE_PROC_REF(/datum/shuttle, remove_shuttle_area)) return A #undef MAX_AREA_SIZE \ No newline at end of file diff --git a/code/modules/mob/observer/eye/freelook/freelook.dm b/code/modules/mob/observer/eye/freelook/freelook.dm index b3cf191a3c3..7234084d0cd 100644 --- a/code/modules/mob/observer/eye/freelook/freelook.dm +++ b/code/modules/mob/observer/eye/freelook/freelook.dm @@ -4,12 +4,12 @@ /mob/observer/eye/freelook var/list/visibleChunks = list() - var/datum/visualnet/visualnet /mob/observer/eye/freelook/Initialize(var/mapload, var/datum/visualnet/net) . = ..() - if(net) visualnet = net + if(net) + visualnet = net /mob/observer/eye/freelook/Destroy() . = ..() @@ -17,16 +17,17 @@ /mob/observer/eye/freelook/possess(var/mob/user) . = ..() - visualnet.update_eye_chunks(src, TRUE) + if(visualnet) + visualnet.update_eye_chunks(src, TRUE) /mob/observer/eye/freelook/release(var/mob/user) - if(user == owner) + if(visualnet && user == owner) visualnet.remove_eye(src) . = ..() - + // Streams the chunk that the new loc is in. /mob/observer/eye/freelook/setLoc(var/T) . = ..() - if(.) + if(. && visualnet) visualnet.update_eye_chunks(src) \ No newline at end of file diff --git a/code/modules/mob/observer/eye/freelook/life.dm b/code/modules/mob/observer/eye/freelook/life.dm index 98b9c477e1f..6a8a6975fd7 100644 --- a/code/modules/mob/observer/eye/freelook/life.dm +++ b/code/modules/mob/observer/eye/freelook/life.dm @@ -1,7 +1,7 @@ /mob/observer/eye/freelook/Life() - ..() + . = ..() // If we lost our client, reset the list of visible chunks so they update properly on return - if(owner == src && !client) + if(. && owner == src && !client) visibleChunks.Cut() /*else if(owner && !owner.client) visibleChunks.Cut()*/ diff --git a/code/modules/mob/observer/eye/freelook/visualnet.dm b/code/modules/mob/observer/eye/freelook/visualnet.dm index f49d0c0fe96..0274a87565d 100644 --- a/code/modules/mob/observer/eye/freelook/visualnet.dm +++ b/code/modules/mob/observer/eye/freelook/visualnet.dm @@ -109,7 +109,7 @@ // Never access this proc directly!!!! // This will update the chunk and all the surrounding chunks. /datum/visualnet/proc/major_chunk_change(var/atom/source) - for_all_chunks_in_range(source, /datum/chunk/proc/visibility_changed, list()) + for_all_chunks_in_range(source, TYPE_PROC_REF(/datum/chunk, visibility_changed), list()) /datum/visualnet/proc/add_source(var/atom/source, var/update_visibility = TRUE, var/opacity_check = FALSE) if(!(source && is_valid_source(source))) @@ -118,9 +118,9 @@ if(source in sources) return FALSE sources += source - events_repository.register(/decl/observ/moved, source, src, /datum/visualnet/proc/source_moved) - events_repository.register(/decl/observ/destroyed, source, src, /datum/visualnet/proc/remove_source) - for_all_chunks_in_range(source, /datum/chunk/proc/add_source, list(source)) + events_repository.register(/decl/observ/moved, source, src, TYPE_PROC_REF(/datum/visualnet, source_moved)) + events_repository.register(/decl/observ/destroyed, source, src, TYPE_PROC_REF(/datum/visualnet, remove_source)) + for_all_chunks_in_range(source, TYPE_PROC_REF(/datum/chunk, add_source), list(source)) if(update_visibility) update_visibility(source, opacity_check) return TRUE @@ -129,9 +129,9 @@ if(!sources.Remove(source)) return FALSE - events_repository.unregister(/decl/observ/moved, source, src, /datum/visualnet/proc/source_moved) - events_repository.unregister(/decl/observ/destroyed, source, src, /datum/visualnet/proc/remove_source) - for_all_chunks_in_range(source, /datum/chunk/proc/remove_source, list(source)) + events_repository.unregister(/decl/observ/moved, source, src, TYPE_PROC_REF(/datum/visualnet, source_moved)) + events_repository.unregister(/decl/observ/destroyed, source, src, TYPE_PROC_REF(/datum/visualnet, remove_source)) + for_all_chunks_in_range(source, TYPE_PROC_REF(/datum/chunk, remove_source), list(source)) if(update_visibility) update_visibility(source, opacity_check) return TRUE @@ -150,9 +150,9 @@ // A more proper way would be to figure out which chunks have gone out of range, and which have come into range // and only remove/add to those. if(old_turf) - for_all_chunks_in_range(source, /datum/chunk/proc/remove_source, list(source), old_turf) + for_all_chunks_in_range(source, TYPE_PROC_REF(/datum/chunk, remove_source), list(source), old_turf) if(new_turf) - for_all_chunks_in_range(source, /datum/chunk/proc/add_source, list(source), new_turf) + for_all_chunks_in_range(source, TYPE_PROC_REF(/datum/chunk, add_source), list(source), new_turf) /datum/visualnet/proc/for_all_chunks_in_range(var/atom/source, var/proc_call, var/list/proc_args, var/turf/T) T = T ? T : get_turf(source) diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index 4f62e09352b..0b34a129d40 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -61,11 +61,8 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images mind = new /datum/mind(key) mind.current = src if(!T) - var/list/spawn_locs = global.latejoin_locations | global.latejoin_cryo_locations | global.latejoin_gateway_locations - if(length(spawn_locs)) - T = pick(spawn_locs) - else - T = locate(1, 1, 1) + T = get_random_spawn_turf(SPAWN_FLAG_GHOSTS_CAN_SPAWN) + forceMove(T) if(!name) //To prevent nameless ghosts @@ -111,9 +108,10 @@ Works together with spawning an observer, noted above. */ /mob/observer/ghost/Life() - ..() - if(!loc) return - if(!client) return 0 + + . = ..() + if(!. || !loc || !client) + return FALSE handle_hud_glasses() @@ -153,7 +151,7 @@ Works together with spawning an observer, noted above. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = src.stat == DEAD ? src.timeofdeath : world.time ghost.key = key - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + if(ghost.client && !ghost.client.holder && !get_config_value(/decl/config/toggle/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed. ghost.verbs -= /mob/observer/ghost/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost @@ -170,6 +168,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(stat == DEAD) announce_ghost_joinleave(ghostize(1)) else + var/respawn_delay = get_config_value(/decl/config/num/respawn_delay) var/response if(src.client && src.client.holder) response = alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", "Ghost", "Admin Ghost", "Stay in body") @@ -177,8 +176,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!src.client) return src.client.admin_ghost() - else if(config.respawn_delay) - response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another [config.respawn_delay] minute\s! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") + else if(respawn_delay) + response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another [respawn_delay] minute\s! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") else response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to return to this body! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") if(response != "Ghost") @@ -240,14 +239,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!client) return - if(!config.antag_hud_allowed && !client.holder) + if(!get_config_value(/decl/config/toggle/antag_hud_allowed) && !client.holder) to_chat(src, SPAN_WARNING("Admins have disabled this for this round")) return var/mob/observer/ghost/M = src if(jobban_isbanned(M, "AntagHUD")) to_chat(src, SPAN_WARNING("You have been banned from using this feature.")) return - if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !client.holder) + if(get_config_value(/decl/config/toggle/antag_hud_restricted) && !M.has_enabled_antagHUD && !client.holder) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") if(response == "No") return M.can_reenter_corpse = 0 @@ -310,9 +309,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp stop_following() following = target verbs |= /mob/observer/ghost/proc/scan_target - events_repository.register(/decl/observ/moved, following, src, /atom/movable/proc/move_to_turf) - events_repository.register(/decl/observ/dir_set, following, src, /atom/proc/recursive_dir_set) - events_repository.register(/decl/observ/destroyed, following, src, /mob/observer/ghost/proc/stop_following) + events_repository.register(/decl/observ/moved, following, src, TYPE_PROC_REF(/atom/movable, move_to_turf)) + events_repository.register(/decl/observ/dir_set, following, src, TYPE_PROC_REF(/atom, recursive_dir_set)) + events_repository.register(/decl/observ/destroyed, following, src, TYPE_PROC_REF(/mob/observer/ghost, stop_following)) to_chat(src, "Now following \the [following].") move_to_turf(following, loc, following.loc) @@ -375,7 +374,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Become mouse" set category = "Ghost" - if(config.disable_player_mice) + if(get_config_value(/decl/config/toggle/disable_player_mice)) to_chat(src, "Spawning as a mouse is currently disabled.") return @@ -404,7 +403,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(src, "Unable to find any unwelded vents to spawn mice at.") if(host) - if(config.uneducated_mice) + if(get_config_value(/decl/config/toggle/uneducated_mice)) host.universal_understand = FALSE announce_ghost_joinleave(src, 0, "They are now a mouse.") host.ckey = src.ckey @@ -421,8 +420,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp show_browser(src, dat, "window=manifest;size=370x420;can_close=1") //This is called when a ghost is drag clicked to something. -/mob/observer/ghost/MouseDrop(atom/over) +/mob/observer/ghost/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) SHOULD_CALL_PARENT(FALSE) + var/atom/over = over_object if(!usr || !over) return if(isghost(usr) && usr.client && isliving(over)) @@ -438,7 +438,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return ..() /mob/observer/ghost/proc/try_possession(var/mob/living/M) - if(!config.ghosts_can_possess_animals) + if(!get_config_value(/decl/config/toggle/ghosts_can_possess_animals)) to_chat(src, SPAN_WARNING("Ghosts are not permitted to possess animals.")) return FALSE if(!M.can_be_possessed_by(src)) @@ -529,7 +529,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(feedback) to_chat(src, "Your non-dead body prevents you from respawning.") return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(get_config_value(/decl/config/toggle/antag_hud_restricted) && has_enabled_antagHUD == 1) if(feedback) to_chat(src, "antagHUD restrictions prevent you from respawning.") return 0 @@ -567,9 +567,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp appearance = target appearance_flags |= initial(appearance_flags) + + // Keep mob offsets when you move over tables and such! + default_pixel_x = target.default_pixel_x + default_pixel_w = target.default_pixel_w + default_pixel_y = target.default_pixel_y + default_pixel_z = target.default_pixel_z + + // Apply ghostly alpha and layering. alpha = pre_alpha plane = pre_plane layer = pre_layer + set_invisibility(pre_invis) transform = null //make goast stand up @@ -577,7 +586,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "OOC" - if (!(config.abandon_allowed)) + if (!get_config_value(/decl/config/toggle/on/abandon_allowed)) to_chat(usr, SPAN_WARNING("Respawn is disabled.")) return if (!SSticker.mode) @@ -586,7 +595,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (SSticker.mode.deny_respawn) to_chat(usr, SPAN_WARNING("Respawn is disabled for this roundtype.")) return - else if(!MayRespawn(1, config.respawn_delay)) + else if(!MayRespawn(1, get_config_value(/decl/config/num/respawn_delay))) return to_chat(usr, SPAN_NOTICE("You can respawn now, enjoy your new life!")) @@ -597,12 +606,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp M.key = key log_and_message_admins("has respawned.", M) -/mob/observer/ghost/GetIdCards() +/mob/observer/ghost/GetIdCards(list/exceptions) . = ..() - if (!is_admin(src)) - return . - - if (!ghost_all_access) - ghost_all_access = new() - LAZYDISTINCTADD(., ghost_all_access) - + if(is_admin(src)) + if (!ghost_all_access) + ghost_all_access = new + if(!is_type_in_list(ghost_all_access, exceptions)) + LAZYDISTINCTADD(., ghost_all_access) diff --git a/code/modules/mob/observer/observer.dm b/code/modules/mob/observer/observer.dm index 27dbcf58112..d972bb370be 100644 --- a/code/modules/mob/observer/observer.dm +++ b/code/modules/mob/observer/observer.dm @@ -41,6 +41,9 @@ var/global/const/GHOST_IMAGE_ALL = ~GHOST_IMAGE_NONE SSghost_images.queue_global_image_update() . = ..() +/mob/observer/get_movement_delay(travel_dir) + return 1 + /mob/observer/check_airflow_movable() return FALSE diff --git a/code/modules/mob/observer/virtual/base.dm b/code/modules/mob/observer/virtual/base.dm index 0fecb711fde..c4897378242 100644 --- a/code/modules/mob/observer/virtual/base.dm +++ b/code/modules/mob/observer/virtual/base.dm @@ -23,7 +23,7 @@ var/global/list/all_virtual_listeners = list() . = INITIALIZE_HINT_QDEL CRASH("Received an unexpected host type. Expected [host_type], was [log_info_line(host)].") src.host = host - events_repository.register(/decl/observ/moved, host, src, /atom/movable/proc/move_to_turf_or_null) + events_repository.register(/decl/observ/moved, host, src, TYPE_PROC_REF(/atom/movable, move_to_turf_or_null)) all_virtual_listeners += src @@ -31,7 +31,7 @@ var/global/list/all_virtual_listeners = list() STOP_PROCESSING(SSmobs, src) /mob/observer/virtual/Destroy() - events_repository.unregister(/decl/observ/moved, host, src, /atom/movable/proc/move_to_turf_or_null) + events_repository.unregister(/decl/observ/moved, host, src, TYPE_PROC_REF(/atom/movable, move_to_turf_or_null)) all_virtual_listeners -= src host = null return ..() diff --git a/code/modules/mob/observer/virtual/mob.dm b/code/modules/mob/observer/virtual/mob.dm index eb08a07d3b8..02026201066 100644 --- a/code/modules/mob/observer/virtual/mob.dm +++ b/code/modules/mob/observer/virtual/mob.dm @@ -4,16 +4,16 @@ /mob/observer/virtual/mob/Initialize(mapload, var/mob/host) . = ..() - events_repository.register(/decl/observ/sight_set, host, src, /mob/observer/virtual/mob/proc/sync_sight) - events_repository.register(/decl/observ/see_invisible_set, host, src, /mob/observer/virtual/mob/proc/sync_sight) - events_repository.register(/decl/observ/see_in_dark_set, host, src, /mob/observer/virtual/mob/proc/sync_sight) + events_repository.register(/decl/observ/sight_set, host, src, TYPE_PROC_REF(/mob/observer/virtual/mob, sync_sight)) + events_repository.register(/decl/observ/see_invisible_set, host, src, TYPE_PROC_REF(/mob/observer/virtual/mob, sync_sight)) + events_repository.register(/decl/observ/see_in_dark_set, host, src, TYPE_PROC_REF(/mob/observer/virtual/mob, sync_sight)) sync_sight(host) /mob/observer/virtual/mob/Destroy() - events_repository.unregister(/decl/observ/sight_set, host, src, /mob/observer/virtual/mob/proc/sync_sight) - events_repository.unregister(/decl/observ/see_invisible_set, host, src, /mob/observer/virtual/mob/proc/sync_sight) - events_repository.unregister(/decl/observ/see_in_dark_set, host, src, /mob/observer/virtual/mob/proc/sync_sight) + events_repository.unregister(/decl/observ/sight_set, host, src, TYPE_PROC_REF(/mob/observer/virtual/mob, sync_sight)) + events_repository.unregister(/decl/observ/see_invisible_set, host, src, TYPE_PROC_REF(/mob/observer/virtual/mob, sync_sight)) + events_repository.unregister(/decl/observ/see_in_dark_set, host, src, TYPE_PROC_REF(/mob/observer/virtual/mob, sync_sight)) . = ..() /mob/observer/virtual/mob/proc/sync_sight(var/mob/mob_host) diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index 7f7dcbed4e1..6525d69a964 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -334,7 +334,7 @@ var/global/list/skills = list() levels = list( "Unskilled" = "You know how to use the technology that was present in whatever society you grew up in. You know how to tell when something is malfunctioning, but you have to call tech support to get it fixed.", "Basic" = "You use and repair high-tech equipment in the course of your daily work. You can fix simple problems, and you know how to use a circuit printer or autolathe. You can build simple robots such as cleanbots and medibots.", - "Trained" = "You can build or repair an exosuit or cyborg chassis, use advanced fabricators and analyzers, and build prosthetic limbs. You can safely transfer an MMI or posibrain into a cyborg chassis.
    - You can attach robotic limbs. Its speed increases with level.", + "Trained" = "You can build or repair an exosuit or cyborg chassis, use advanced fabricators and analyzers, and build prosthetic limbs. You can safely transfer a neural interface into a cyborg chassis.
    - You can attach robotic limbs. Its speed increases with level.", "Experienced" = "You have years of experience building or reverse-engineering complex devices. Your use of fabricators and destructive analyzers is efficient and methodical. You can design contraptions to order, and likely sell those designs at a profit.", "Master" = "You are an inventor or researcher. You can design, build, and modify equipment that most people don't even know exists. You are at home in the lab and the workshop and you've never met a gadget you couldn't take apart, put back together, and replicate." ) diff --git a/code/modules/mob/skills/skill_buffs.dm b/code/modules/mob/skills/skill_buffs.dm index 18f538055c3..bf99aa37ed7 100644 --- a/code/modules/mob/skills/skill_buffs.dm +++ b/code/modules/mob/skills/skill_buffs.dm @@ -71,7 +71,7 @@ buff.skillset = skillset skillset.on_levels_change() if(duration) - addtimer(CALLBACK(buff, /datum/skill_buff/proc/remove), duration) + addtimer(CALLBACK(buff, TYPE_PROC_REF(/datum/skill_buff, remove)), duration) return buff //Takes a buff type or datum; typing is false here. diff --git a/code/modules/mob/skills/skill_verbs.dm b/code/modules/mob/skills/skill_verbs.dm index 63d3e94e727..7447f7133be 100644 --- a/code/modules/mob/skills/skill_verbs.dm +++ b/code/modules/mob/skills/skill_verbs.dm @@ -49,7 +49,7 @@ return cooling_down = 1 update_verb() - addtimer(CALLBACK(src, .proc/remove_cooldown), cooldown) + addtimer(CALLBACK(src, PROC_REF(remove_cooldown)), cooldown) /* The Instruct verb. buffs untrained -> basic and requires skill in the skill training as well as leadership. Robots and antags can instruct. diff --git a/code/modules/mob/stripping.dm b/code/modules/mob/stripping.dm index e677769e9ce..0552345b391 100644 --- a/code/modules/mob/stripping.dm +++ b/code/modules/mob/stripping.dm @@ -31,23 +31,20 @@ toggle_sensors(user) return if ("lock_sensors") - var/obj/item/clothing/under/subject_uniform = get_equipped_item(slot_w_uniform_str) - if (!istype(subject_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/accessory/vitals_sensor/sensor = get_vitals_sensor() + if (!istype(sensor)) return - visible_message(SPAN_DANGER("\The [user] is trying to [subject_uniform.has_sensor == SUIT_LOCKED_SENSORS ? "un" : ""]lock \the [src]'s sensors!")) + visible_message(SPAN_DANGER("\The [user] is trying to [sensor.get_sensors_locked() ? "un" : ""]lock \the [src]'s sensors!")) if (do_after(user, HUMAN_STRIP_DELAY, src, progress = 0)) - if (subject_uniform != get_equipped_item(slot_w_uniform_str)) - to_chat(user, SPAN_WARNING("\The [src] is not wearing \the [subject_uniform] anymore.")) - return - if (!subject_uniform.has_sensor) - to_chat(user, SPAN_WARNING("\The [subject_uniform] has no sensors to lock.")) + if(QDELETED(sensor) || sensor != get_vitals_sensor()) + to_chat(user, SPAN_WARNING("\The [src] is not wearing \the [sensor] anymore.")) return var/obj/item/multitool/user_multitool = user.get_multitool() if (!istype(user_multitool)) - to_chat(user, SPAN_WARNING("You need a multitool to lock \the [subject_uniform]'s sensors.")) + to_chat(user, SPAN_WARNING("You need a multitool to lock \the [src]'s sensors.")) return - subject_uniform.has_sensor = subject_uniform.has_sensor == SUIT_LOCKED_SENSORS ? SUIT_HAS_SENSORS : SUIT_LOCKED_SENSORS - visible_message(SPAN_NOTICE("\The [user] [subject_uniform.has_sensor == SUIT_LOCKED_SENSORS ? "" : "un"]locks \the [subject_uniform]'s suit sensor controls."), range = 2) + sensor.toggle_sensors_locked() + visible_message(SPAN_NOTICE("\The [user] [sensor.get_sensors_locked() ? "" : "un"]locks \the [src]'s vitals sensor controls."), range = 2) return if("internals") visible_message("\The [usr] is trying to set \the [src]'s internals!") @@ -137,13 +134,17 @@ // Modify the current target sensor level. /mob/proc/toggle_sensors(var/mob/living/user) - var/obj/item/clothing/under/suit = get_equipped_item(slot_w_uniform_str) - if(!istype(suit)) - to_chat(user, "\The [src] is not wearing a suit with sensors.") - return - if (suit.has_sensor >= 2) - to_chat(user, "\The [src]'s suit sensor controls are locked.") + var/obj/item/clothing/accessory/vitals_sensor/sensor = get_vitals_sensor() + if(!istype(sensor)) + to_chat(user, SPAN_WARNING("\The [src] is not wearing a vitals sensor.")) + if (sensor.get_sensors_locked()) + to_chat(user, SPAN_WARNING("\The [src]'s suit sensor controls are locked.")) return - admin_attack_log(user, src, "Toggled their suit sensors.", "Toggled their suit sensors.", "toggled the suit sensors of") - suit.set_sensors(user) + sensor.user_set_sensors(user) + +/mob/proc/get_vitals_sensor() + for(var/check_slot in global.vitals_sensor_equip_slots) + var/obj/item/clothing/equipped = get_equipped_item(check_slot) + if(istype(equipped)) + return (locate(/obj/item/clothing/accessory/vitals_sensor) in equipped.accessories) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 51ddf615dfe..ae06234265a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -3,11 +3,11 @@ return for(var/obj/item/W in get_contained_external_atoms()) drop_from_inventory(W) - refresh_visible_overlays() + try_refresh_visible_overlays() ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) set_status(STAT_STUN, 1) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) for(var/t in get_external_organs()) qdel(t) var/atom/movable/overlay/animation = new /atom/movable/overlay(src) @@ -56,7 +56,7 @@ drop_from_inventory(W) ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) return ..() /mob/proc/AIize(move=1) @@ -64,8 +64,8 @@ sound_to(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = sound_channels.lobby_channel))// stop the jams for AIs - var/mob/living/silicon/ai/O = new (loc, global.using_map.default_law_type,,1)//No MMI but safety is in effect. - O.set_invisibility(0) + var/mob/living/silicon/ai/O = new (loc, global.using_map.default_law_type,,1)//No brain but safety is in effect. + O.set_invisibility(INVISIBILITY_NONE) O.aiRestorePowerRoutine = 0 if(mind) mind.transfer_to(O) @@ -109,17 +109,17 @@ QDEL_NULL_LIST(worn_underwear) for(var/obj/item/W in src) drop_from_inventory(W) - refresh_visible_overlays() + try_refresh_visible_overlays() ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) for(var/t in get_external_organs()) qdel(t) var/mob/living/silicon/robot/O = new supplied_robot_type( loc ) O.set_gender(gender) - O.set_invisibility(0) + O.set_invisibility(INVISIBILITY_NONE) if(!mind) mind_initialize() @@ -128,10 +128,9 @@ mind.transfer_to(O) if(O.mind && O.mind.assigned_role == ASSIGNMENT_ROBOT) O.mind.original = O - var/mmi_type = SSrobots.get_mmi_type_by_title(O.mind.role_alt_title ? O.mind.role_alt_title : O.mind.assigned_role) + var/mmi_type = SSrobots.get_brain_type_by_title(O.mind.role_alt_title ? O.mind.role_alt_title : O.mind.assigned_role) if(mmi_type) - O.mmi = new mmi_type(O) - O.mmi.transfer_identity(src) + O.central_processor = new mmi_type(O) O.dropInto(loc) O.job = ASSIGNMENT_ROBOT @@ -146,10 +145,10 @@ return for(var/obj/item/W in src) drop_from_inventory(W) - refresh_visible_overlays() + try_refresh_visible_overlays() ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) for(var/t in get_external_organs()) //this really should not be necessary qdel(t) @@ -175,10 +174,10 @@ for(var/obj/item/W in src) drop_from_inventory(W) - refresh_visible_overlays() + try_refresh_visible_overlays() ADD_TRANSFORMATION_MOVEMENT_HANDLER(src) icon = null - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) for(var/t in get_external_organs()) qdel(t) diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 0eca2dc1a79..397086e49c0 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -1,11 +1,23 @@ -/mob/living/proc/refresh_visible_overlays() +// TODO: look at all uses of this and refresh_visible_overlays(), probably should be using update_icon(). +/mob/living/proc/try_refresh_visible_overlays() SHOULD_CALL_PARENT(TRUE) if(HasMovementHandler(/datum/movement_handler/mob/transformation) || QDELETED(src)) return FALSE + refresh_visible_overlays() + apply_visible_overlays() + return TRUE + +/mob/living/proc/refresh_visible_overlays() + SHOULD_CALL_PARENT(TRUE) for(var/slot in get_inventory_slots()) update_equipment_overlay(slot, FALSE) return TRUE +/mob/living/proc/apply_visible_overlays() + for(var/overlay in get_all_current_mob_overlays()) + add_overlay(overlay) + underlays = get_all_current_mob_underlays() + /mob/proc/update_equipment_overlay(var/slot, var/redraw_mob = TRUE) var/datum/inventory_slot/inv_slot = slot && get_inventory_slot_datum(slot) if(inv_slot) @@ -16,7 +28,7 @@ for(var/hand_slot in get_held_item_slots()) var/datum/inventory_slot/inv_slot = get_inventory_slot_datum(hand_slot) var/obj/item/held = inv_slot?.get_equipped_item() - var/image/standing = held?.get_mob_overlay(src, inv_slot.overlay_slot, hand_slot) + var/image/standing = held?.get_mob_overlay(src, inv_slot.overlay_slot, hand_slot, inv_slot.use_overlay_fallback_slot) if(standing) standing.appearance_flags |= (RESET_ALPHA|RESET_COLOR) LAZYADD(hand_overlays, standing) diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index 10f64943f46..4b1a5843510 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -7,7 +7,7 @@ slot_flags = SLOT_HEAD | SLOT_HOLSTER origin_tech = null pixel_y = 8 - origin_tech = "{'biotech':1}" + origin_tech = @'{"biotech":1}' use_single_icon = TRUE item_state = null is_spawnable_type = FALSE @@ -25,7 +25,7 @@ add_vis_contents(src, AM) // Grab our inhands from the mob we're wrapping, if they have any. -/obj/item/holder/get_mob_overlay(mob/user_mob, slot, bodypart) +/obj/item/holder/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE) var/mob/M = locate() in contents if(istype(M)) icon = M.get_holder_icon() @@ -99,10 +99,12 @@ return loc.loc return ..() -/obj/item/holder/GetIdCards() +/obj/item/holder/GetIdCards(list/exceptions) . = ..() for(var/mob/M in contents) - LAZYDISTINCTADD(., M.GetIdCards()) + var/list/cards = M.GetIdCards(exceptions) + if(length(cards)) + LAZYDISTINCTADD(., cards) /obj/item/holder/attack_self() for(var/mob/M in contents) diff --git a/code/modules/mob_holder/holder_subtypes.dm b/code/modules/mob_holder/holder_subtypes.dm index 14c3b3a9848..7276d2a41e6 100644 --- a/code/modules/mob_holder/holder_subtypes.dm +++ b/code/modules/mob_holder/holder_subtypes.dm @@ -1,10 +1,10 @@ //Mob specific holders. /obj/item/holder/drone - origin_tech = "{'magnets':3,'engineering':5}" + origin_tech = @'{"magnets":3,"engineering":5}' /obj/item/holder/mouse w_class = ITEM_SIZE_TINY //need own subtype to work with recipes /obj/item/holder/corgi - origin_tech = "{'biotech':4}" + origin_tech = @'{"biotech":4}' diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 6d75136680f..ede7ce9165a 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -102,6 +102,8 @@ var/image/screen_overlay = os?.get_screen_overlay() if(screen_overlay) add_overlay(screen_overlay) + else if(dark_screen_state) + add_overlay(dark_screen_state) var/image/keyboard_overlay = os?.get_keyboard_overlay() if(keyboard_overlay) add_overlay(keyboard_overlay) @@ -132,11 +134,11 @@ if(user) ui_interact(user) -/obj/item/modular_computer/GetIdCards() +/obj/item/modular_computer/GetIdCards(list/exceptions) . = ..() var/datum/extension/assembly/assembly = get_extension(src, /datum/extension/assembly) var/obj/item/stock_parts/computer/card_slot/card_slot = assembly.get_component(PART_CARD) - if(card_slot && card_slot.can_broadcast && istype(card_slot.stored_card) && card_slot.check_functionality()) + if(card_slot && card_slot.can_broadcast && istype(card_slot.stored_card) && card_slot.check_functionality() && !is_type_in_list(card_slot.stored_card, exceptions)) LAZYDISTINCTADD(., card_slot.stored_card) /obj/item/modular_computer/GetChargeStick() diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 6b6559ce4f7..31df9783893 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -67,6 +67,11 @@ /obj/item/modular_computer/attack_hand(var/mob/user) if(anchored) return attack_self(user) + // if it's equipped and we're not holding it, open + // the interface instead of removing it from the slot. + var/equip_slot = user.get_equipped_slot_for_item(src) + if(equip_slot && !(equip_slot in user.get_held_item_slots())) + return attack_self(user) return ..() // On-click handling. Turns on the computer if it's off and opens the GUI. @@ -109,9 +114,6 @@ to_chat(user, "\The [card_slot.stored_card] is inserted into it.") assembly.examine(user) -/obj/item/modular_computer/handle_mouse_drop(atom/over, mob/user) - . = (!istype(over, /obj/screen) && attack_self(user)) || ..() - /obj/item/modular_computer/afterattack(atom/target, mob/user, proximity) . = ..() var/datum/extension/assembly/assembly = get_extension(src, /datum/extension/assembly) diff --git a/code/modules/modular_computers/computers/modular_computer/variables.dm b/code/modules/modular_computers/computers/modular_computer/variables.dm index f8c88612879..41f322a6441 100644 --- a/code/modules/modular_computers/computers/modular_computer/variables.dm +++ b/code/modules/modular_computers/computers/modular_computer/variables.dm @@ -6,9 +6,10 @@ icon_state = ICON_STATE_WORLD center_of_mass = null randpixel = 0 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/screen_icon + var/dark_screen_state var/list/decals var/computer_emagged = FALSE var/ambience_last_played diff --git a/code/modules/modular_computers/computers/subtypes/dev_pda.dm b/code/modules/modular_computers/computers/subtypes/dev_pda.dm index 3c471b0a6d6..f52f0b56d3e 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_pda.dm @@ -7,7 +7,7 @@ material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/glass = MATTER_AMOUNT_TRACE ) w_class = ITEM_SIZE_SMALL @@ -20,10 +20,10 @@ item_flags = ITEM_FLAG_NO_BLUDGEON computer_type = /datum/extension/assembly/modular_computer/pda color = COLOR_GRAY80 + dark_screen_state = "blank_screen" /obj/item/modular_computer/pda/on_update_icon() . = ..() - add_overlay(image(icon, "blank_screen")) var/mob/living/carbon/human/H = loc if(istype(H) && H.get_equipped_item(slot_wear_id_str) == src) H.update_equipment_overlay(slot_wear_id_str) diff --git a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm index cc2126c7a47..ff514949f13 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm @@ -56,7 +56,7 @@ anchored = TRUE density = FALSE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-20}, 'SOUTH':{'y':24}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-20}, "SOUTH":{"y":24}, "EAST":{"x":-24}, "WEST":{"x":24}}' idle_power_usage = 75 active_power_usage = 300 max_hardware_size = 2 //make sure we can only put smaller components in here diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm index 8c1787aca94..c726c3ac6a2 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_console.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm @@ -1,6 +1,9 @@ /obj/machinery/computer/modular/preset var/list/default_software var/datum/computer_file/program/autorun_program + /// Mounts the mainframe with the corresponding key as its ID to the root directory named after the value. + /// Ex. list("RECORDS_MAINFRAME" = "records") + var/automount_disks base_type = /obj/machinery/computer/modular /obj/machinery/computer/modular/preset/full @@ -35,6 +38,12 @@ autorun.filename = "autorun" autorun.stored_data = initial(autorun_program.filename) HDD.store_file(autorun) + if(LAZYLEN(automount_disks)) + var/datum/computer_file/data/automount = new() + automount.filename = "automount" + for(var/disk in automount_disks) + automount.stored_data += "[automount_disks[disk]]|[disk];" + HDD.store_file(automount) /obj/machinery/computer/modular/preset/engineering default_software = list( @@ -62,6 +71,15 @@ ) autorun_program = /datum/computer_file/program/rcon_console +/obj/machinery/computer/modular/preset/engineering/atmospherics + default_software = list( + /datum/computer_file/program/atmos_control, + /datum/computer_file/program/shutoff_valve, + /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/wordprocessor + ) + autorun_program = /datum/computer_file/program/shutoff_valve + /obj/machinery/computer/modular/preset/medical default_software = list( /datum/computer_file/program/suit_sensors, diff --git a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm index d20c0d91ad6..ce3d31590e6 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm @@ -57,4 +57,12 @@ default_programs = list( /datum/computer_file/program/records, /datum/computer_file/program/wordprocessor - ) \ No newline at end of file + ) + +/obj/item/modular_computer/laptop/preset/medical + default_programs = list( + /datum/computer_file/program/suit_sensors, + /datum/computer_file/program/camera_monitor, + /datum/computer_file/program/records, + /datum/computer_file/program/wordprocessor + ) diff --git a/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm b/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm index 40609a4a05d..23e4122b908 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm @@ -70,4 +70,20 @@ /datum/computer_file/program/camera_monitor, /datum/computer_file/program/shields_monitor, /datum/computer_file/program/supermatter_monitor - ) \ No newline at end of file + ) + +/obj/machinery/computer/modular/telescreen/preset/entertainment + default_software = list( + /datum/computer_file/program/camera_monitor + ) + autorun_program = /datum/computer_file/program/camera_monitor + +/obj/machinery/computer/modular/telescreen/preset/security + default_software = list( + /datum/computer_file/program/digitalwarrant, + /datum/computer_file/program/camera_monitor, + /datum/computer_file/program/records, + /datum/computer_file/program/forceauthorization, + /datum/computer_file/program/wordprocessor + ) + autorun_program = /datum/computer_file/program/camera_monitor diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 60bef2a87d9..34b99e38bbf 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -9,6 +9,7 @@ var/global/file_uid = 0 var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case var/size = 1 // File size in GQ. Integers only! var/weakref/holder // Holder that contains this file. Refers to a obj/item/stock_parts/computer/hard_drive. + var/uncopyable = FALSE // Whether the file may be cloned or copied by a user. var/unsendable = 0 // Whether the file may be sent to someone via file transfer or other means. var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. var/unrenamable = 0 // Whether the file may be renamed. Setting to 1 prevents renaming. @@ -28,10 +29,17 @@ var/global/file_uid = 0 if(islist(md)) metadata = md.Copy() -/datum/computer_file/Destroy() +/datum/computer_file/proc/remove_from_holder() + // This just *begs* for making filesystems an extension var/obj/item/stock_parts/computer/hard_drive/hard_drive = holder?.resolve() - if(hard_drive) + if(istype(hard_drive)) hard_drive.remove_file(src, forced = TRUE) + var/obj/item/disk/data_disk = hard_drive + if(istype(data_disk)) + data_disk.delete_file(filename, force = TRUE) + +/datum/computer_file/Destroy() + remove_from_holder() . = ..() /datum/computer_file/PopulateClone(datum/computer_file/clone) diff --git a/code/modules/modular_computers/file_system/directory.dm b/code/modules/modular_computers/file_system/directory.dm index efafd3b0365..af81828a81c 100644 --- a/code/modules/modular_computers/file_system/directory.dm +++ b/code/modules/modular_computers/file_system/directory.dm @@ -58,6 +58,7 @@ var/datum/computer_file/held_file = file_ref.resolve() if(!held_file) held_files -= file_ref + continue if(istype(held_file, /datum/computer_file/directory)) var/datum/computer_file/directory/dir = held_file diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index f100942be46..cd952059a4c 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -259,7 +259,7 @@ if(!isnull(selected_CR) && CanUseTopic(user)) id_card.registered_name = selected_CR.get_name() id_card.assignment = selected_CR.get_job() - id_card.rank = selected_CR.get_rank() + id_card.position = selected_CR.get_rank() id_card.dna_hash = selected_CR.get_dna() id_card.fingerprint_hash = selected_CR.get_fingerprint() id_card.card_gender = selected_CR.get_gender() @@ -294,7 +294,7 @@ remove_nt_access(id_card) apply_access(id_card, access) id_card.assignment = t1 - id_card.rank = t1 + id_card.position = t1 callHook("reassign_employee", list(id_card)) if("access") diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 0b3a1c7b880..7a5ed3fee7a 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -91,7 +91,7 @@ for(var/obj/machinery/power/sensor/S in SSmachines.machinery) if(get_z(S) in connected_z_levels) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels. grid_sensors += S - events_repository.register(/decl/observ/destroyed, S, src, /datum/nano_module/program/power_monitor/proc/remove_sensor) + events_repository.register(/decl/observ/destroyed, S, src, TYPE_PROC_REF(/datum/nano_module/program/power_monitor, remove_sensor)) /datum/nano_module/program/power_monitor/proc/remove_sensor(var/removed_sensor, var/update_ui = TRUE) if(active_sensor == removed_sensor) @@ -99,7 +99,7 @@ if(update_ui) SSnano.update_uis(src) grid_sensors -= removed_sensor - events_repository.unregister(/decl/observ/destroyed, removed_sensor, src, /datum/nano_module/program/power_monitor/proc/remove_sensor) + events_repository.unregister(/decl/observ/destroyed, removed_sensor, src, TYPE_PROC_REF(/datum/nano_module/program/power_monitor, remove_sensor)) /datum/nano_module/program/power_monitor/proc/is_sysadmin(var/mob/user) if(program) diff --git a/code/modules/modular_computers/file_system/programs/engineering/shields_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/shields_monitor.dm index a00df078996..6c7955d85e5 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/shields_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/shields_monitor.dm @@ -105,7 +105,7 @@ var/obj/machinery/shield_generator/S = locate(href_list["ref"]) in shields if(S) deselect_shield() - events_repository.register(/decl/observ/destroyed, S, src, /datum/nano_module/program/shields_monitor/proc/deselect_shield) + events_repository.register(/decl/observ/destroyed, S, src, TYPE_PROC_REF(/datum/nano_module/program/shields_monitor, deselect_shield)) active = S return 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/configurator.dm b/code/modules/modular_computers/file_system/programs/generic/configurator.dm index 20d4b6da16a..b280adf55f2 100644 --- a/code/modules/modular_computers/file_system/programs/generic/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/generic/configurator.dm @@ -33,8 +33,9 @@ var/obj/item/stock_parts/computer/battery_module/battery_module = program.computer.get_component(PART_BATTERY) data["battery_exists"] = !!battery_module if(battery_module) - data["battery_rating"] = battery_module.battery.maxcharge - data["battery_percent"] = round(battery_module.battery.percent()) + var/obj/item/cell/battery = battery_module.get_cell() + data["battery_rating"] = battery?.maxcharge || 0 + data["battery_percent"] = battery ? round(battery.percent()) : 0 var/obj/item/stock_parts/computer/network_card/network_card = program.computer.get_component(PART_NETWORK) data["nic_exists"] = !!network_card diff --git a/code/modules/modular_computers/file_system/programs/generic/file_manager.dm b/code/modules/modular_computers/file_system/programs/generic/file_manager.dm index 5e856d79b31..be3f39c066c 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_manager.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_manager.dm @@ -96,6 +96,7 @@ var/list/available_mainframes = network.get_file_server_tags(MF_ROLE_FILESERVER, accesses) if(!length(available_mainframes)) to_chat(user, SPAN_WARNING("NETWORK ERROR: No available mainframes on the network.")) + return TOPIC_HANDLED var/fileserver_tag = input(user, "Choose a mainframe you would like to mount as a disk:", "Mainframe Mount") as null|anything in available_mainframes if(!fileserver_tag) return TOPIC_HANDLED @@ -332,7 +333,7 @@ if(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS) var/newname = sanitize_for_file(input(user, "Enter new file name:", "File rename", F.filename)) if(F && length(newname)) - F.filename = newname + current_disk.rename_file(F, newname, user) return TOPIC_REFRESH else to_chat(user, SPAN_WARNING("You do not have permission to rename that file.")) @@ -390,7 +391,9 @@ to_chat(user, SPAN_WARNING("I/O ERROR: Unable to transfer file.")) return - var/copying = alert(usr, "Would you like to copy the file or transfer it? Transfering files requires write access.", "Copying file", "Copy", "Transfer") + var/copying = "Transfer" + if(!F.uncopyable) + copying = alert(usr, "Would you like to copy the file or transfer it? Transfering files requires write access.", "Copying file", "Copy", "Transfer") var/list/choices = list() var/list/curr_fs_list = disks[current_index] for(var/list/fs_list in disks) @@ -758,7 +761,7 @@ ui_header = null /datum/computer_file/program/filemanager/on_file_storage_removal(datum/file_storage/removed) - var/list/current_disk_list = current_index != null ? disks[current_index] : null + var/list/current_disk_list = LAZYACCESS(disks, current_index) for(var/list/disk_list in disks) var/datum/file_storage/disk = disk_list[1] if(disk == removed) diff --git a/code/modules/modular_computers/file_system/programs/generic/folding.dm b/code/modules/modular_computers/file_system/programs/generic/folding.dm index fefec96a86a..30c5c9ffcd0 100644 --- a/code/modules/modular_computers/file_system/programs/generic/folding.dm +++ b/code/modules/modular_computers/file_system/programs/generic/folding.dm @@ -65,20 +65,21 @@ if(world.timeofday < next_event) //Checks if it's time for the next crash chance. return var/mob/living/holder = computer.holder.get_recursive_loc_of_type(/mob/living/carbon/human) + var/host = computer.get_physical_host() if(program_status > PROGRAM_STATUS_CRASHED) if(PROGRAM_STATUS_RUNNING_SCALDING >= program_status) switch(rand(PROGRAM_STATUS_RUNNING,program_status)) if(PROGRAM_STATUS_RUNNING) //Guaranteed 1 tick without crashing. - to_chat(holder, SPAN_WARNING("The [computer] starts to get very warm.")) + to_chat(holder, SPAN_WARNING("\The [host] starts to get very warm.")) if (program_status == PROGRAM_STATUS_RUNNING) program_status = PROGRAM_STATUS_RUNNING_WARM if(PROGRAM_STATUS_RUNNING_WARM) //50% chance on subsequent ticks to make the program able to crash. - to_chat(holder, SPAN_WARNING("The [computer] gets scaldingly hot, burning you!")) + to_chat(holder, SPAN_WARNING("\The [host] gets scaldingly hot, burning you!")) holder?.take_overall_damage(0, 0.45) //It checks holder? so that it doesn't cause a runtime error if no one is holding it. if (program_status == PROGRAM_STATUS_RUNNING_WARM) program_status = PROGRAM_STATUS_RUNNING_SCALDING if(PROGRAM_STATUS_RUNNING_SCALDING) //1/3 chance on all following ticks for the program to crash. - to_chat(holder, SPAN_WARNING("The [computer] pings an error chime.")) + to_chat(holder, SPAN_WARNING("\The [host] pings an error chime.")) program_status = PROGRAM_STATUS_CRASHED crashed_at = world.timeofday else diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm index 5c886e87632..525f363d285 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm @@ -43,6 +43,8 @@ if(!check_file_download(filename)) return 0 var/datum/computer_file/program/PRG = net.find_file_by_name(filename, OS_PROGRAMS_DIR, MF_ROLE_SOFTWARE) + if(!istype(PRG)) + return 0 var/datum/file_storage/disk/destination = computer.mounted_storage["local"] if(!destination) return 0 diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index c5e067fdbe1..8122ababeaf 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -398,7 +398,7 @@ t += "

    [global.using_map.station_name] Supply Requisition Reciept


    " t += "INDEX: #[O.ordernum]
    " t += "REQUESTED BY: [O.orderedby]
    " - t += "RANK: [O.orderedrank]
    " + t += "ASSIGNMENT: [O.orderedrank]
    " t += "REASON: [O.reason]
    " t += "SUPPLY CRATE TYPE: [O.object.name]
    " t += "ACCESS RESTRICTION: [get_access_desc(O.object.access)]
    " diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index 8e0824efa13..d5586fc52de 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -49,7 +49,7 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = usr var/mob/living/carbon/human/H = locate(href_list["track"]) in SSmobs.mob_list - if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) + if(hassensorlevel(H, VITALS_SENSOR_TRACKING)) AI.ai_actual_track(H) return 1 diff --git a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm index a304cca0318..0f99a187cc3 100644 --- a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm +++ b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm @@ -29,7 +29,7 @@ if(!A) return 0 if(href_list["PRG_beginReconstruction"]) - if((A.hardware_integrity() < 100) || (A.backup_capacitor() < 100)) + if((A.get_health_percent() < 100) || (A.backup_capacitor() < 100)) restoring = 1 return 1 @@ -66,12 +66,12 @@ if(!A || !restoring) restoring = 0 // If the AI was removed, stop the restoration sequence. return - A.adjustFireLoss(-4) - A.adjustBruteLoss(-4) + A.adjustFireLoss(-4, do_update_health = FALSE) + A.adjustBruteLoss(-4, do_update_health = FALSE) A.adjustOxyLoss(-4) - A.updatehealth() + A.update_health() // If the AI is dead, revive it. - if (A.health >= -100 && A.stat == DEAD) + if (A.stat == DEAD && !A.should_be_dead()) A.set_stat(CONSCIOUS) A.lying = 0 A.switch_from_dead_to_living_mob_list() @@ -81,7 +81,7 @@ if(AC) AC.update_icon() // Finished restoring - if((A.hardware_integrity() == 100) && (A.backup_capacitor() == 100)) + if((A.get_health_percent() == 100) && (A.backup_capacitor() == 100)) restoring = 0 /datum/nano_module/program/computer_aidiag @@ -106,9 +106,9 @@ data["error"] = "No AI located" else data["ai_name"] = A.name - data["ai_integrity"] = A.hardware_integrity() + data["ai_integrity"] = A.get_health_percent() data["ai_capacitor"] = A.backup_capacitor() - data["ai_isdamaged"] = (A.hardware_integrity() < 100) || (A.backup_capacitor() < 100) + data["ai_isdamaged"] = (A.get_health_percent() < 100) || (A.backup_capacitor() < 100) data["ai_isdead"] = (A.stat == DEAD) var/list/all_laws[0] diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index c830be8b70e..de61e09ddfd 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -29,7 +29,7 @@ // Called on multitool click, prints diagnostic information to the user. /obj/item/stock_parts/computer/proc/diagnostics() - return list("Hardware Integrity Test... (Corruption: [get_percent_damage()]%)") + return list("Hardware Integrity Test... (Corruption: [get_percent_damages()]%)") /obj/item/stock_parts/computer/Initialize() . = ..() diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index 853e088850f..8fb4f56a57a 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -6,7 +6,7 @@ hardware_size = 1 critical = 0 power_usage = 100 - origin_tech = "{'powerstorage':2,'programming':3}" + origin_tech = @'{"powerstorage":2,"programming":3}' external_slot = TRUE material = /decl/material/solid/metal/steel diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index ed288844a9a..f877a086114 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -5,17 +5,39 @@ desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops. It's rating is 75 Wh." icon_state = "battery_normal" critical = 1 - origin_tech = "{'powerstorage':1,'engineering':1}" + origin_tech = @'{"powerstorage":1,"engineering":1}' material = /decl/material/solid/metal/steel - var/battery_rating = 75 - var/obj/item/cell/battery = /obj/item/cell + +/obj/item/stock_parts/computer/battery_module/Initialize() + . = ..() + setup_power_supply() + charge_to_full() + +/obj/item/stock_parts/computer/battery_module/diagnostics() + . = ..() + var/obj/item/cell/battery = get_cell() + if(battery) + . += "Internal battery charge: [battery.charge]/[battery.maxcharge] CU" + +/obj/item/stock_parts/computer/battery_module/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell + . = ..(loaded_cell_type, /obj/item/cell, /datum/extension/loaded_cell/unremovable, charge_value) + var/obj/item/cell/battery = get_cell() + if(battery) + battery.maxcharge = battery_rating + battery.charge = 0 + +/obj/item/stock_parts/computer/battery_module/proc/charge_to_full() + var/obj/item/cell/battery = get_cell() + if(battery) + battery.charge = battery.maxcharge /obj/item/stock_parts/computer/battery_module/advanced name = "advanced battery" desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. It's rating is 110 Wh." icon_state = "battery_advanced" - origin_tech = "{'powerstorage':2,'engineering':2}" + origin_tech = @'{"powerstorage":2,"engineering":2}' hardware_size = 2 battery_rating = 110 material = /decl/material/solid/metal/steel @@ -24,7 +46,7 @@ name = "super battery" desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 150 Wh." icon_state = "battery_super" - origin_tech = "{'powerstorage':3,'engineering':3}" + origin_tech = @'{"powerstorage":3,"engineering":3}' hardware_size = 2 battery_rating = 150 material = /decl/material/solid/metal/steel @@ -33,7 +55,7 @@ name = "ultra battery" desc = "A very advanced large power cell. It's often used as uninterruptable power supply for critical consoles or servers. It's rating is 200 Wh." icon_state = "battery_ultra" - origin_tech = "{'powerstorage':5,'engineering':4}" + origin_tech = @'{"powerstorage":5,"engineering":4}' hardware_size = 3 battery_rating = 200 material = /decl/material/solid/metal/steel @@ -42,7 +64,7 @@ name = "micro battery" desc = "A small power cell, commonly seen in most portable microcomputers. It's rating is 50 Wh." icon_state = "battery_micro" - origin_tech = "{'powerstorage':2,'engineering':2}" + origin_tech = @'{"powerstorage":2,"engineering":2}' battery_rating = 50 material = /decl/material/solid/metal/steel @@ -50,10 +72,10 @@ name = "nano battery" desc = "A tiny power cell, commonly seen in low-end portable microcomputers. It's rating is 30 Wh." icon_state = "battery_nano" - origin_tech = "{'powerstorage':1,'engineering':1}" + origin_tech = @'{"powerstorage":1,"engineering":1}' battery_rating = 30 material = /decl/material/solid/metal/steel - origin_tech = "{'powerstorage':2,'engineering':1}" + origin_tech = @'{"powerstorage":2,"engineering":1}' // This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes. /obj/item/stock_parts/computer/battery_module/lambda @@ -62,26 +84,6 @@ icon_state = "battery_lambda" hardware_size = 1 battery_rating = 3000 - battery = /obj/item/cell/infinite - -/obj/item/stock_parts/computer/battery_module/diagnostics() - . = ..() - . += "Internal battery charge: [battery.charge]/[battery.maxcharge] CU" - -/obj/item/stock_parts/computer/battery_module/Initialize() - . = ..() - battery = new battery(src) - battery.maxcharge = battery_rating - battery.charge = 0 - charge_to_full() - -/obj/item/stock_parts/computer/battery_module/Destroy() - QDEL_NULL(battery) - return ..() - -/obj/item/stock_parts/computer/battery_module/proc/charge_to_full() - if(battery) - battery.charge = battery.maxcharge -/obj/item/stock_parts/computer/battery_module/get_cell() - return battery +/obj/item/stock_parts/computer/battery_module/lambda/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/infinite, accepted_cell_type, power_supply_extension_type, charge_value) diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 0726128b08c..cb62d1049e9 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -5,7 +5,7 @@ critical = 0 icon_state = "cardreader" hardware_size = 1 - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' usage_flags = PROGRAM_ALL & ~PROGRAM_PDA external_slot = TRUE material = /decl/material/solid/metal/steel @@ -29,7 +29,7 @@ read_string_stability = 80 . += "Registered Name: [stars(stored_card.registered_name, read_string_stability)]\n" . += "Registered Assignment: [stars(stored_card.assignment, read_string_stability)]\n" - . += "Registered Rank: [stars(stored_card.rank, read_string_stability)]\n" + . += "Registered Position: [stars(stored_card.position, read_string_stability)]\n" . += "Access Addresses Enabled: \n" var/list/access_list = stored_card.GetAccess() if(!access_list) // "NONE" for empty list diff --git a/code/modules/modular_computers/hardware/charge_stick_slot.dm b/code/modules/modular_computers/hardware/charge_stick_slot.dm index 82c75557765..d2f7b010d7c 100644 --- a/code/modules/modular_computers/hardware/charge_stick_slot.dm +++ b/code/modules/modular_computers/hardware/charge_stick_slot.dm @@ -5,7 +5,7 @@ critical = 0 icon_state = "cardreader" hardware_size = 1 - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' usage_flags = PROGRAM_ALL & ~PROGRAM_PDA external_slot = TRUE material = /decl/material/solid/metal/steel diff --git a/code/modules/modular_computers/hardware/disk_slot.dm b/code/modules/modular_computers/hardware/disk_slot.dm index 36818d4e0ce..3bf653e67b4 100644 --- a/code/modules/modular_computers/hardware/disk_slot.dm +++ b/code/modules/modular_computers/hardware/disk_slot.dm @@ -5,7 +5,7 @@ critical = 0 icon_state = "cardreader" hardware_size = 1 - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' usage_flags = PROGRAM_ALL external_slot = TRUE material = /decl/material/solid/metal/steel diff --git a/code/modules/modular_computers/hardware/drive_slot.dm b/code/modules/modular_computers/hardware/drive_slot.dm index 0e364c9e61a..dacade6012b 100644 --- a/code/modules/modular_computers/hardware/drive_slot.dm +++ b/code/modules/modular_computers/hardware/drive_slot.dm @@ -5,7 +5,7 @@ critical = 0 icon_state = "cardreader" hardware_size = 1 - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' usage_flags = PROGRAM_ALL external_slot = TRUE material = /decl/material/solid/metal/steel diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index fca04084acd..d800a7b4c31 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -4,7 +4,7 @@ power_usage = 25 // SSD or something with low power usage icon_state = "hdd_normal" hardware_size = 1 - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) var/max_capacity = 128 @@ -15,7 +15,7 @@ name = "advanced hard drive" desc = "A small hybrid hard drive with 256GQ of storage capacity for use in higher grade computers where balance between power efficiency and capacity is desired." max_capacity = 256 - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' power_usage = 50 // Hybrid, medium capacity and medium power storage icon_state = "hdd_advanced" hardware_size = 2 @@ -26,7 +26,7 @@ name = "super hard drive" desc = "A small hard drive with 512GQ of storage capacity for use in cluster storage solutions where capacity is more important than power efficiency." max_capacity = 512 - origin_tech = "{'programming':3,'engineering':3}" + origin_tech = @'{"programming":3,"engineering":3}' power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link. icon_state = "hdd_super" hardware_size = 2 @@ -37,7 +37,7 @@ name = "cluster hard drive" desc = "A large storage cluster consisting of multiple hard drives for usage in high capacity storage systems. Has capacity of 2048 GQ." power_usage = 500 - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' max_capacity = 2048 icon_state = "hdd_cluster" hardware_size = 3 @@ -49,7 +49,7 @@ name = "small hard drive" desc = "A small highly efficient solid state drive for portable devices." power_usage = 10 - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' max_capacity = 64 icon_state = "hdd_small" hardware_size = 1 @@ -60,7 +60,7 @@ name = "micro hard drive" desc = "A small micro hard drive for portable devices." power_usage = 2 - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' max_capacity = 32 icon_state = "hdd_micro" hardware_size = 1 diff --git a/code/modules/modular_computers/hardware/lan_port.dm b/code/modules/modular_computers/hardware/lan_port.dm index a50d49a0c08..09e516f290b 100644 --- a/code/modules/modular_computers/hardware/lan_port.dm +++ b/code/modules/modular_computers/hardware/lan_port.dm @@ -2,7 +2,7 @@ name = "wired connection port" desc = "A basic expansion port for use with wired connections." power_usage = 30 - origin_tech = "{'programming':1,'engineering':1}" + origin_tech = @'{"programming":1,"engineering":1}' icon_state = "netcard_ethernet" hardware_size = 3 material = /decl/material/solid/glass @@ -29,13 +29,13 @@ if(!istype(parent)) return terminal = new(get_turf(parent)) - set_extension(src, /datum/extension/event_registration/shuttle_stationary, GET_DECL(/decl/observ/moved), parent, .proc/check_terminal_prox, get_area(src)) - events_repository.register(/decl/observ/destroyed, terminal, src, .proc/unset_terminal) + set_extension(src, /datum/extension/event_registration/shuttle_stationary, GET_DECL(/decl/observ/moved), parent, PROC_REF(check_terminal_prox), get_area(src)) + events_repository.register(/decl/observ/destroyed, terminal, src, PROC_REF(unset_terminal)) set_status(parent, PART_STAT_CONNECTED) /obj/item/stock_parts/computer/lan_port/proc/unset_terminal() remove_extension(src, /datum/extension/event_registration/shuttle_stationary) - events_repository.unregister(/decl/observ/destroyed, terminal, src, .proc/unset_terminal) + events_repository.unregister(/decl/observ/destroyed, terminal, src, PROC_REF(unset_terminal)) var/obj/machinery/parent = loc if(istype(parent)) unset_status(parent, PART_STAT_CONNECTED) diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index dd3a4684212..e264fa428b5 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -2,7 +2,7 @@ name = "nano printer" desc = "Small integrated printer with paper recycling module." power_usage = 50 - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' critical = 0 icon_state = "printer" hardware_size = 1 diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index a2014e4b061..562ea9a221a 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -2,7 +2,7 @@ name = "basic network card" desc = "A basic network card for usage with standard network protocols." power_usage = 50 - origin_tech = "{'programming':2,'engineering':1}" + origin_tech = @'{"programming":2,"engineering":1}' critical = 0 icon_state = "netcard_basic" hardware_size = 1 @@ -33,7 +33,7 @@ name = "advanced network card" desc = "An advanced network card for usage with standard network protocols. It's transmitter is strong enough to connect even when far away." long_range = 1 - origin_tech = "{'programming':4,'engineering':2}" + origin_tech = @'{"programming":4,"engineering":2}' power_usage = 100 // Better range but higher power usage. icon_state = "netcard_advanced" hardware_size = 1 diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm index f854beb0cfd..921f22a0f57 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -6,7 +6,7 @@ icon_state = "flashdrive_basic" hardware_size = 1 max_capacity = 16 - origin_tech = "{'programming':1}" + origin_tech = @'{"programming":1}' material = /decl/material/solid/fiberglass /obj/item/stock_parts/computer/hard_drive/portable/advanced @@ -16,7 +16,7 @@ icon_state = "flashdrive_advanced" hardware_size = 1 max_capacity = 64 - origin_tech = "{'programming':2}" + origin_tech = @'{"programming":2}' /obj/item/stock_parts/computer/hard_drive/portable/super name = "super data crystal" @@ -25,7 +25,7 @@ icon_state = "flashdrive_super" hardware_size = 1 max_capacity = 256 - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' /obj/item/stock_parts/computer/hard_drive/portable/Initialize() . = ..() @@ -63,4 +63,3 @@ readme.stored_data = jointext(readme_data, "\[br\]") readme.filename = "___README___" store_file(readme) - \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm index e1c75121a7c..95cf5d8525d 100644 --- a/code/modules/modular_computers/hardware/processor_unit.dm +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -8,7 +8,7 @@ hardware_size = 2 power_usage = 100 critical = 1 - origin_tech = "{'programming':3,'engineering':2}" + origin_tech = @'{"programming":3,"engineering":2}' material = /decl/material/solid/metal/steel var/processing_power = 2 // Used for DDoS speed calculations @@ -20,7 +20,7 @@ hardware_size = 1 power_usage = 25 processing_power = 1 - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' material = /decl/material/solid/metal/steel /obj/item/stock_parts/computer/processor_unit/photonic @@ -30,7 +30,7 @@ hardware_size = 2 power_usage = 50 processing_power = 4 - origin_tech = "{'programming':5,'engineering':4}" + origin_tech = @'{"programming":5,"engineering":4}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) @@ -41,6 +41,6 @@ hardware_size = 1 power_usage = 10 processing_power = 2 - origin_tech = "{'programming':4,'engineering':3}" + origin_tech = @'{"programming":4,"engineering":3}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/modular_computers/hardware/scanners/scanner.dm b/code/modules/modular_computers/hardware/scanners/scanner.dm index cdb1222ab75..b84dc782e6d 100644 --- a/code/modules/modular_computers/hardware/scanners/scanner.dm +++ b/code/modules/modular_computers/hardware/scanners/scanner.dm @@ -7,7 +7,7 @@ icon_state = "printer" hardware_size = 1 critical = 0 - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' var/datum/computer_file/program/scanner/driver_type = /datum/computer_file/program/scanner // A program type that the scanner interfaces with and attempts to install on insertion. var/datum/computer_file/program/scanner/driver // A driver program which has been set up to interface with the scanner. diff --git a/code/modules/modular_computers/hardware/tesla_link.dm b/code/modules/modular_computers/hardware/tesla_link.dm index c80c643abed..6e59fcdb5f9 100644 --- a/code/modules/modular_computers/hardware/tesla_link.dm +++ b/code/modules/modular_computers/hardware/tesla_link.dm @@ -5,7 +5,7 @@ enabled = 1 icon_state = "teslalink" hardware_size = 1 - origin_tech = "{'programming':2,'powerstorage':3,'engineering':2}" + origin_tech = @'{"programming":2,"powerstorage":3,"engineering":2}' material = /decl/material/solid/metal/steel var/passive_charging_rate = 250 // W diff --git a/code/modules/modular_computers/networking/device_types/mainframe.dm b/code/modules/modular_computers/networking/device_types/mainframe.dm index 63e58195afe..97387b2a406 100644 --- a/code/modules/modular_computers/networking/device_types/mainframe.dm +++ b/code/modules/modular_computers/networking/device_types/mainframe.dm @@ -104,20 +104,6 @@ var/global/list/all_mainframe_roles = list( return 0 return HDD.used_capacity -// Disk that spawns with everything old system had -/obj/item/stock_parts/computer/hard_drive/cluster/fullhouse/Initialize() - . = ..() - - for(var/F in subtypesof(/datum/computer_file/report)) - var/datum/computer_file/report/type = F - if(TYPE_IS_ABSTRACT(type)) - continue - if(initial(type.available_on_network)) - store_file(new type, "reports", TRUE) - - for(var/F in subtypesof(/datum/computer_file/program)) - var/datum/computer_file/program/type = F - if(TYPE_IS_ABSTRACT(type)) - continue - if(initial(type.available_on_network)) - store_file(new type, OS_PROGRAMS_DIR, TRUE) \ No newline at end of file +// starts with no files, useful for things like mainframes +/obj/item/stock_parts/computer/hard_drive/cluster/empty/install_default_programs() + return \ No newline at end of file diff --git a/code/modules/modular_computers/networking/machinery/mainframe.dm b/code/modules/modular_computers/networking/machinery/mainframe.dm index ef57b295d0c..b9f8b6cf1cd 100644 --- a/code/modules/modular_computers/networking/machinery/mainframe.dm +++ b/code/modules/modular_computers/networking/machinery/mainframe.dm @@ -68,3 +68,20 @@ /obj/machinery/network/mainframe/software initial_roles = list(MF_ROLE_SOFTWARE) + +/obj/machinery/network/mainframe/software/Initialize() + . = ..() + var/obj/item/stock_parts/computer/hard_drive/drive = get_component_of_type(PART_HDD) + for(var/F in subtypesof(/datum/computer_file/report)) + var/datum/computer_file/report/type = F + if(TYPE_IS_ABSTRACT(type)) + continue + if(initial(type.available_on_network)) + drive.store_file(new type, "reports", TRUE) + + for(var/F in subtypesof(/datum/computer_file/program)) + var/datum/computer_file/program/type = F + if(TYPE_IS_ABSTRACT(type)) + continue + if(initial(type.available_on_network)) + drive.store_file(new type, OS_PROGRAMS_DIR, TRUE) \ No newline at end of file diff --git a/code/modules/modular_computers/networking/machinery/wall_relay.dm b/code/modules/modular_computers/networking/machinery/wall_relay.dm index 9911c3bc20a..dbf5102bf60 100644 --- a/code/modules/modular_computers/networking/machinery/wall_relay.dm +++ b/code/modules/modular_computers/networking/machinery/wall_relay.dm @@ -7,7 +7,7 @@ density = FALSE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED base_type = /obj/machinery/network/relay/wall_mounted - directional_offset = "{'NORTH':{'y':-21}, 'SOUTH':{'y':21}, 'EAST':{'x':-21}, 'WEST':{'x':21}}" + directional_offset = @'{"NORTH":{"y":-21}, "SOUTH":{"y":21}, "EAST":{"x":-21}, "WEST":{"x":21}}' /obj/machinery/network/relay/wall_mounted/Initialize() . = ..() diff --git a/code/modules/modular_computers/networking/machinery/wall_router.dm b/code/modules/modular_computers/networking/machinery/wall_router.dm index 27c46d4d771..5c408af98d9 100644 --- a/code/modules/modular_computers/networking/machinery/wall_router.dm +++ b/code/modules/modular_computers/networking/machinery/wall_router.dm @@ -7,7 +7,7 @@ density = FALSE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED base_type = /obj/machinery/network/router/wall_mounted - directional_offset = "{'NORTH':{'y':-21}, 'SOUTH':{'y':21}, 'EAST':{'x':-21}, 'WEST':{'x':21}}" + directional_offset = @'{"NORTH":{"y":-21}, "SOUTH":{"y":21}, "EAST":{"x":-21}, "WEST":{"x":21}}' /obj/machinery/network/router/wall_mounted/Initialize() . = ..() diff --git a/code/modules/modular_computers/networking/network_cable.dm b/code/modules/modular_computers/networking/network_cable.dm index 2d4b56805b6..480df91b375 100644 --- a/code/modules/modular_computers/networking/network_cable.dm +++ b/code/modules/modular_computers/networking/network_cable.dm @@ -5,7 +5,7 @@ icon_state = "dot" layer = WIRE_LAYER anchored = TRUE - level = 1 + level = LEVEL_BELOW_PLATING var/datum/node/physical/network_node /obj/structure/network_cable/Initialize(ml, _mat, _reinf_mat) @@ -163,8 +163,9 @@ throw_range = 5 material = /decl/material/solid/glass matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT ) + matter_multiplier = 0.15 item_state = "coil" /obj/item/stack/net_cable_coil/single diff --git a/code/modules/modular_computers/networking/network_files.dm b/code/modules/modular_computers/networking/network_files.dm index 66d6e21fc12..34229d711e2 100644 --- a/code/modules/modular_computers/networking/network_files.dm +++ b/code/modules/modular_computers/networking/network_files.dm @@ -1,9 +1,11 @@ /datum/computer_network/proc/find_file_by_name(filename, directory, mainframe_role = MF_ROLE_FILESERVER, list/accesses) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(mainframe_role, accesses)) var/datum/computer_file/F = M.get_file(filename, directory) - if(F) + if(istype(F)) return F + return OS_FILE_NOT_FOUND + /datum/computer_network/proc/get_all_files_of_type(file_type, mainframe_role = MF_ROLE_FILESERVER, uniques_only = FALSE, list/accesses) . = list() var/list/found_filenames = list() diff --git a/code/modules/modular_computers/os/files.dm b/code/modules/modular_computers/os/files.dm index 6e14deb9102..4ad6ed46fa6 100644 --- a/code/modules/modular_computers/os/files.dm +++ b/code/modules/modular_computers/os/files.dm @@ -258,6 +258,10 @@ /datum/file_storage/proc/delete_file(datum/computer_file/F, list/accesses, mob/user) +/datum/file_storage/proc/rename_file(datum/computer_file/F, newname, mob/user) + F.filename = newname + return OS_FILE_SUCCESS + /datum/file_storage/proc/create_file(filename, directory, data, file_type = /datum/computer_file/data, list/metadata, list/accesses, mob/user) if(check_errors()) return OS_HARDDRIVE_ERROR @@ -283,7 +287,7 @@ var/datum/computer_file/F = get_file(filename, directory) if(!istype(F)) return F - if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS)) + if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS) || F.uncopyable) return OS_FILE_NO_READ var/datum/computer_file/cloned_file = F.Clone(TRUE) @@ -601,6 +605,13 @@ if(disk.delete_file(file.filename)) return OS_FILE_SUCCESS +/datum/file_storage/disk/datadisk/rename_file(datum/computer_file/file, newname, mob/user) + if(check_errors()) + return OS_HARDDRIVE_ERROR + var/obj/item/disk/disk = get_disk() + if(disk.rename_file(file.filename, newname)) + return OS_FILE_SUCCESS + /datum/file_storage/disk/datadisk/get_transfer_speed() if(check_errors()) return 0 diff --git a/code/modules/modular_computers/os/ui.dm b/code/modules/modular_computers/os/ui.dm index 25d41809005..0b6529519df 100644 --- a/code/modules/modular_computers/os/ui.dm +++ b/code/modules/modular_computers/os/ui.dm @@ -132,7 +132,8 @@ var/ui_update_needed = 0 var/obj/item/stock_parts/computer/battery_module/battery_module = get_component(PART_BATTERY) if(battery_module) - var/batery_percent = battery_module.battery.percent() + var/obj/item/cell/battery = battery_module.get_cell() + var/batery_percent = battery?.percent() if(last_battery_percent != batery_percent) //Let's update UI on percent change ui_update_needed = 1 last_battery_percent = batery_percent @@ -173,8 +174,9 @@ /datum/extension/interactive/os/proc/get_header_data(file_browser = FALSE) var/list/data = list() var/obj/item/stock_parts/computer/battery_module/battery_module = get_component(PART_BATTERY) - if(battery_module) - switch(battery_module.battery.percent()) + var/obj/item/cell/battery = battery_module?.get_cell() + if(battery) + switch(battery.percent()) if(80 to 200) // 100 should be maximal but just in case.. data["PC_batteryicon"] = "batt_100.gif" if(60 to 80) @@ -187,7 +189,7 @@ data["PC_batteryicon"] = "batt_20.gif" else data["PC_batteryicon"] = "batt_5.gif" - data["PC_batterypercent"] = "[round(battery_module.battery.percent())] %" + data["PC_batterypercent"] = "[round(battery.percent())] %" data["PC_showbatteryicon"] = 1 else data["PC_batteryicon"] = "batt_5.gif" diff --git a/code/modules/modular_computers/terminal/terminal_commands.dm b/code/modules/modular_computers/terminal/terminal_commands.dm index 1b316db0208..bc534225e0e 100644 --- a/code/modules/modular_computers/terminal/terminal_commands.dm +++ b/code/modules/modular_computers/terminal/terminal_commands.dm @@ -418,14 +418,17 @@ Subtypes if(!islist(file_loc)) return "rename: [get_terminal_error(file_path, file_loc)]." + var/datum/file_storage/disk = file_loc[1] var/datum/computer_file/F = file_loc[3] var/new_name = sanitize_for_file(rename_args[2]) if(length(new_name)) if(F.unrenamable || !(F.get_file_perms(terminal.get_access(user), user) & OS_WRITE_ACCESS)) return "rename: You lack permission to rename [F.filename]." - F.filename = new_name - return "rename: File renamed to '[new_name]'." + if(disk.rename_file(F, new_name, user)) + return "rename: File renamed to '[new_name]'." + else + return "rename: Unable to rename file." else return "rename: Invalid file name." diff --git a/code/modules/multiz/basic.dm b/code/modules/multiz/basic.dm index 0ffc115b250..b1fb50c38c1 100644 --- a/code/modules/multiz/basic.dm +++ b/code/modules/multiz/basic.dm @@ -6,12 +6,14 @@ var/global/list/z_levels = list() // Each Z-level is associated with the relevan // Thankfully, no bitwise magic is needed here. /proc/GetAbove(var/atom/atom) + RETURN_TYPE(/turf) var/turf/turf = get_turf(atom) if(!turf) return null return HasAbove(turf.z) ? get_step(turf, UP) : null /proc/GetBelow(var/atom/atom) + RETURN_TYPE(/turf) var/turf/turf = get_turf(atom) if(!turf) return null @@ -23,4 +25,12 @@ var/global/list/z_levels = list() // Each Z-level is associated with the relevan else if (dir == DOWN) . = GetBelow(ref) else - . = get_step(ref, dir) \ No newline at end of file + . = get_step(ref, dir) + +/proc/get_zstep_resolving_mimic(ref, dir) + if(dir == UP) + . = GetAbove(ref)?.resolve_to_actual_turf() + else if (dir == DOWN) + . = GetBelow(ref)?.resolve_to_actual_turf() + else + . = get_step_resolving_mimic(ref, dir) \ No newline at end of file diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index 5f07b8078f7..02c3988c4a6 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -11,7 +11,7 @@ icon_state = "hoist_case" material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/hoist_kit/attack_self(mob/user) @@ -46,7 +46,7 @@ source_hoist.release_hoistee() return TRUE -/obj/effect/hoist_hook/receive_mouse_drop(atom/dropping, mob/user) +/obj/effect/hoist_hook/receive_mouse_drop(atom/dropping, mob/user, params) // skip the parent buckle logic, handle climbing directly var/mob/living/H = user if(istype(H) && !H.anchored && can_climb(H) && dropping == user) @@ -83,9 +83,9 @@ if (get_turf(AM) != get_turf(source_hook)) AM.forceMove(get_turf(source_hook)) - events_repository.register(/decl/observ/destroyed, AM, src, .proc/release_hoistee) + events_repository.register(/decl/observ/destroyed, AM, src, PROC_REF(release_hoistee)) -/obj/effect/hoist_hook/handle_mouse_drop(atom/over, mob/user) +/obj/effect/hoist_hook/handle_mouse_drop(atom/over, mob/user, params) if(source_hoist.hoistee && isturf(over) && over.Adjacent(source_hoist.hoistee)) if(!user.check_dexterity(DEXTERITY_HOLD_ITEM)) return TRUE diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm index 8fa04a4f2aa..5338e63f0d3 100644 --- a/code/modules/multiz/ladder.dm +++ b/code/modules/multiz/ladder.dm @@ -107,7 +107,7 @@ var/turf/T = get_turf(src) if(T) for(var/atom/movable/M in T.contents) - addtimer(CALLBACK(M, /atom/movable/proc/fall, T), 0) + addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/movable, fall), T), 0) return ..() /obj/structure/ladder/attackby(obj/item/I, mob/user) diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index 7e1ae409f0f..377a175df9e 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -66,7 +66,8 @@ /datum/level_data ///Name displayed to the player to refer to this level in user interfaces and etc. If null, one will be generated. var/name - + /// Multiplier applied to damage when falling through this level. + var/fall_depth = 1 /// The z-level that was assigned to this level_data var/level_z /// A unique string identifier for this particular z-level. Used to fetch a level without knowing its z-level. @@ -145,7 +146,8 @@ var/tmp/_has_warned_uninitialized_strata = FALSE VAR_PROTECTED/UT_turf_exceptions_by_door_type // An associate list of door types/list of allowed turfs - + ///Determines if edge turfs should be centered on the map dimensions. + var/origin_is_world_center = TRUE /datum/level_data/New(var/_z_level, var/defer_level_setup = FALSE) . = ..() level_z = _z_level @@ -211,11 +213,10 @@ _level_setup_completed = TRUE ///Calculate the bounds of the level, the border area, and the inner accessible area. -/// * origin_is_world_center : An arg to clarify how level bounds work, and allow some control. /// Basically, by default levels are assumed to be loaded relative to the world center, so if they're smaller than the world /// they get their origin offset so they're in the middle of the world. By default templates are always loaded at origin 1,1. /// so that's useful to know and have control over! -/datum/level_data/proc/setup_level_bounds(var/origin_is_world_center = TRUE) +/datum/level_data/proc/setup_level_bounds() //Get the width/height we got for the level and the edges level_max_width = level_max_width ? level_max_width : world.maxx level_max_height = level_max_height ? level_max_height : world.maxy @@ -241,7 +242,7 @@ /datum/level_data/proc/setup_ambient() if(!use_global_exterior_ambience) return - ambient_light_level = config.exterior_ambient_light + ambient_light_level = get_config_value(/decl/config/num/exterior_ambient_light) ambient_light_color = SSskybox.background_color ///Setup/generate atmosphere for exterior turfs on the level. @@ -290,7 +291,7 @@ ///Called when setting up the level. Apply generators and anything that modifies the turfs of the level. /datum/level_data/proc/generate_level() - if(!global.config.roundstart_level_generation) + if(!get_config_value(/decl/config/toggle/roundstart_level_generation)) return var/origx = level_inner_min_x var/origy = level_inner_min_y @@ -302,7 +303,7 @@ ///Apply the parent entity's map generators. (Planets generally) ///This proc is to give a chance to level_data subtypes to individually chose to ignore the parent generators. /datum/level_data/proc/apply_map_generators(var/list/map_gen) - if(!global.config.roundstart_level_generation) + if(!get_config_value(/decl/config/toggle/roundstart_level_generation)) return var/origx = level_inner_min_x var/origy = level_inner_min_y diff --git a/code/modules/multiz/mobile_ladder.dm b/code/modules/multiz/mobile_ladder.dm index a6084cb3ca7..dc36fa3d136 100644 --- a/code/modules/multiz/mobile_ladder.dm +++ b/code/modules/multiz/mobile_ladder.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/mobile_ladder.dmi' material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY) icon_state = ICON_STATE_WORLD throw_range = 3 force = 10 diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 8b26ad6c158..b36246164d4 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -121,7 +121,7 @@ // Entered() which is part of Move(), by spawn()ing we let that complete. But we want to preserve if we were in client movement // or normal movement so other move behavior can continue. /atom/movable/proc/begin_falling(var/lastloc, var/below) - addtimer(CALLBACK(src, /atom/movable/proc/fall_callback, below), 0) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, fall_callback), below), 0) /atom/movable/proc/fall_callback(var/turf/below) if(!QDELETED(src)) @@ -187,7 +187,11 @@ return species.can_fall(src) /atom/movable/proc/protected_from_fall_damage(var/turf/landing) - return !!(locate(/obj/structure/stairs) in landing) + if(!!(locate(/obj/structure/stairs) in landing)) + return TRUE + var/turf/exterior/wall/ramp = landing + if(istype(ramp) && ramp.ramp_slope_direction) // walking down a ramp + return TRUE /mob/protected_from_fall_damage(var/turf/landing) . = ..() @@ -198,12 +202,24 @@ parachute.packed = FALSE return TRUE -/atom/movable/proc/handle_fall(var/turf/landing) +/atom/movable + var/started_falling_from_z + +/atom/movable/proc/get_fall_height() + . = 0 + var/turf/T = get_turf(src) + if(istype(T) && T.z <= started_falling_from_z) + for(var/fall_z in T.z to started_falling_from_z) + var/datum/level_data/level_data = SSmapping.levels_by_z[fall_z] + . += max(1, level_data?.fall_depth) + +/atom/movable/proc/handle_fall(var/turf/landing, var/fall_distance) var/turf/previous = get_turf(loc) Move(landing, get_dir(previous, landing)) + started_falling_from_z = max(started_falling_from_z, landing.z) if(protected_from_fall_damage(landing)) - return TRUE - if(landing.get_fluid_depth() >= FLUID_DEEP) + . = TRUE + else if(landing.get_fluid_depth() >= FLUID_DEEP) var/primary_fluid = landing.get_fluid_name() if(previous.get_fluid_depth() >= FLUID_DEEP) //We're sinking further visible_message(SPAN_NOTICE("\The [src] sinks deeper down into \the [primary_fluid]!"), SPAN_NOTICE("\The [primary_fluid] rushes around you as you sink!")) @@ -211,9 +227,11 @@ else visible_message(SPAN_NOTICE("\The [src] falls into the [primary_fluid]!"), SPAN_NOTICE("What a splash!")) playsound(src, 'sound/effects/watersplash.ogg', 30, TRUE) - return TRUE + . = TRUE else - handle_fall_effect(landing) + . = handle_fall_effect(landing) + if(.) + started_falling_from_z = 0 /atom/movable/proc/handle_fall_effect(var/turf/landing) SHOULD_CALL_PARENT(TRUE) @@ -221,13 +239,15 @@ visible_message("\The [src] falls through \the [landing]!", "You hear a whoosh of displaced air.") else visible_message("\The [src] slams into \the [landing]!", "You hear something slam into the [global.using_map.ground_noun].") - var/fall_damage = fall_damage() + var/fall_damage = fall_damage() * get_fall_height() if(fall_damage > 0) for(var/mob/living/M in landing.contents) if(M == src) continue visible_message("\The [src] hits \the [M.name]!") M.take_overall_damage(fall_damage) + return TRUE + return FALSE /atom/movable/proc/fall_damage() return 0 @@ -244,8 +264,9 @@ return if(species && species.handle_fall_special(src, landing)) return - var/min_damage = 7 - var/max_damage = 14 + var/fall_height = get_fall_height() + var/min_damage = 7 * fall_height + var/max_damage = 14 * fall_height apply_damage(rand(min_damage, max_damage), BRUTE, BP_HEAD, armor_pen = 50) apply_damage(rand(min_damage, max_damage), BRUTE, BP_CHEST, armor_pen = 50) apply_damage(rand(min_damage, max_damage), BRUTE, BP_GROIN, armor_pen = 75) @@ -266,7 +287,6 @@ var/obj/item/organ/external/victim = pick(victims) victim.dislocate() to_chat(src, "You feel a sickening pop as your [victim.joint] is wrenched out of the socket.") - updatehealth() /mob/living/carbon/human/proc/climb_up(atom/A) if(!isturf(loc) || !bound_overlay || bound_overlay.destruction_timer || is_physically_disabled()) // This destruction_timer check ideally wouldn't be required, but I'm not awake enough to refactor this to not need it. @@ -357,7 +377,7 @@ . = ..() owner = user follow() - events_repository.register(/decl/observ/moved, owner, src, /atom/movable/z_observer/proc/follow) + events_repository.register(/decl/observ/moved, owner, src, TYPE_PROC_REF(/atom/movable/z_observer, follow)) /atom/movable/z_observer/proc/follow() @@ -381,7 +401,7 @@ qdel(src) /atom/movable/z_observer/Destroy() - events_repository.unregister(/decl/observ/moved, owner, src, /atom/movable/z_observer/proc/follow) + events_repository.unregister(/decl/observ/moved, owner, src, TYPE_PROC_REF(/atom/movable/z_observer, follow)) owner = null . = ..() diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 15564859782..ddd2b92d297 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -13,7 +13,7 @@ dir = SOUTH initialize_directions = SOUTH - level = 1 + level = LEVEL_BELOW_PLATING /obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/modules/multiz/turf_mimic_edge.dm b/code/modules/multiz/turf_mimic_edge.dm index f0f14810968..fd18b69e385 100644 --- a/code/modules/multiz/turf_mimic_edge.dm +++ b/code/modules/multiz/turf_mimic_edge.dm @@ -61,6 +61,16 @@ QDEL_NULL(click_eater) //Make sure we get rid of it if the turf is somehow replaced by map gen to prevent them accumulating. return ..() +/turf/simulated/mimic_edge/Crossed(atom/movable/O) + . = ..() + if(isobserver(O)) + var/turf/drop_turf = get_mimic_turf() + if(drop_turf) + O.forceMove(drop_turf) + +/turf/simulated/mimic_edge/resolve_to_actual_turf() + return get_mimic_turf() + //Properly install itself, and allow overriding how the target turf is picked /turf/simulated/mimic_edge/proc/setup_mimic() return @@ -69,7 +79,7 @@ return /turf/simulated/mimic_edge/get_vis_contents_to_add() - . = shared_mimic_edge_get_add_vis_contents(src, get_mimic_turf(), ..()) + . = shared_mimic_edge_get_add_vis_contents(src, get_mimic_turf(), list()) /turf/simulated/mimic_edge/proc/get_mimic_turf() return mimic_x && mimic_y && mimic_z && locate(mimic_x, mimic_y, mimic_z) @@ -127,6 +137,16 @@ QDEL_NULL(click_eater) return ..() +/turf/unsimulated/mimic_edge/Crossed(atom/movable/O) + . = ..() + if(isobserver(O)) + var/turf/drop_turf = get_mimic_turf() + if(drop_turf) + O.forceMove(drop_turf) + +/turf/unsimulated/mimic_edge/resolve_to_actual_turf() + return get_mimic_turf() + //Properly install itself, and allow overriding how the target turf is picked /turf/unsimulated/mimic_edge/proc/setup_mimic() return @@ -135,7 +155,7 @@ return /turf/unsimulated/mimic_edge/get_vis_contents_to_add() - . = shared_mimic_edge_get_add_vis_contents(src, get_mimic_turf(), ..()) + . = shared_mimic_edge_get_add_vis_contents(src, get_mimic_turf(), list()) /turf/unsimulated/mimic_edge/proc/get_mimic_turf() return mimic_x && mimic_y && mimic_z && locate(mimic_x, mimic_y, mimic_z) @@ -193,6 +213,16 @@ QDEL_NULL(click_eater) return ..() +/turf/exterior/mimic_edge/Crossed(atom/movable/O) + . = ..() + if(isobserver(O)) + var/turf/drop_turf = get_mimic_turf() + if(drop_turf) + O.forceMove(drop_turf) + +/turf/exterior/mimic_edge/resolve_to_actual_turf() + return get_mimic_turf() + //Properly install itself, and allow overriding how the target turf is picked /turf/exterior/mimic_edge/proc/setup_mimic() return @@ -201,7 +231,7 @@ return /turf/exterior/mimic_edge/get_vis_contents_to_add() - . = shared_mimic_edge_get_add_vis_contents(src, get_mimic_turf(), ..()) + . = shared_mimic_edge_get_add_vis_contents(src, get_mimic_turf(), list()) /turf/exterior/mimic_edge/proc/get_mimic_turf() return mimic_x && mimic_y && mimic_z && locate(mimic_x, mimic_y, mimic_z) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index d31a30330c4..20bf18bbcac 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -85,7 +85,7 @@ layer = MIMICED_LIGHTING_LAYER plane = OPENTURF_MAX_PLANE blend_mode = BLEND_MULTIPLY - invisibility = 0 + set_invisibility(INVISIBILITY_NONE) if (icon_state == LIGHTING_BASE_ICON_STATE) // We're using a color matrix, so just darken the colors across the board. diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 7b19155b7ba..a6772cb01b9 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -41,39 +41,39 @@ return owner.change_skin_tone(new_s_tone) if(href_list["skin_color"] && can_change_skin_color()) - var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", owner.skin_colour) as color|null - if(new_skin && can_still_topic(state) && owner.change_skin_color(new_skin)) + var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", owner.get_skin_colour()) as color|null + if(new_skin && can_still_topic(state) && owner.set_skin_colour(new_skin)) update_dna() return TRUE if(href_list["hair"]) var/decl/sprite_accessory/hair = locate(href_list["hair"]) - if(can_change(APPEARANCE_HAIR) && istype(hair) && (hair.type in owner.get_valid_hairstyle_types()) && owner.change_hair(hair.type)) + if(can_change(APPEARANCE_HAIR) && istype(hair) && (hair.type in owner.get_valid_hairstyle_types()) && owner.set_hairstyle(hair.type)) update_dna() return TRUE if(href_list["hair_color"] && can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input("Please select hair color.", "Hair Color", owner.hair_colour) as color|null - if(new_hair && can_still_topic(state) && owner.change_hair_color(new_hair)) + var/new_hair = input("Please select hair color.", "Hair Color", owner.get_hair_colour()) as color|null + if(new_hair && can_still_topic(state) && owner.set_hair_colour(new_hair)) update_dna() return TRUE if(href_list["facial_hair"]) var/decl/sprite_accessory/facial_hair = locate(href_list["facial_hair"]) - if(can_change(APPEARANCE_FACIAL_HAIR) && istype(facial_hair) && (facial_hair.type in owner.get_valid_facial_hairstyle_types()) && owner.change_facial_hair(facial_hair.type)) + if(can_change(APPEARANCE_FACIAL_HAIR) && istype(facial_hair) && (facial_hair.type in owner.get_valid_facial_hairstyle_types()) && owner.set_facial_hairstyle(facial_hair.type)) update_dna() return TRUE if(href_list["facial_hair_color"] && can_change(APPEARANCE_FACIAL_HAIR_COLOR)) - var/new_facial = input("Please select facial hair color.", "Facial Hair Color", owner.facial_hair_colour) as color|null - if(new_facial && can_still_topic(state) && owner.change_facial_hair_color(new_facial)) + var/new_facial = input("Please select facial hair color.", "Facial Hair Color", owner.get_facial_hair_colour()) as color|null + if(new_facial && can_still_topic(state) && owner.set_facial_hair_colour(new_facial)) update_dna() return TRUE if(href_list["eye_color"]) if(can_change(APPEARANCE_EYE_COLOR)) - var/new_eyes = input("Please select eye color.", "Eye Color", owner.eye_colour) as color|null - if(new_eyes && can_still_topic(state) && owner.change_eye_color(new_eyes)) + var/new_eyes = input("Please select eye color.", "Eye Color", owner.get_eye_colour()) as color|null + if(new_eyes && can_still_topic(state) && owner.set_eye_colour(new_eyes)) update_dna() return TRUE @@ -119,7 +119,8 @@ var/decl/sprite_accessory/hair_decl = GET_DECL(hair_style) hair_styles[++hair_styles.len] = list("hairstyle" = hair_decl.name, "ref" = "\ref[hair_decl]") data["hair_styles"] = hair_styles - var/decl/sprite_accessory/hair = GET_DECL(owner.h_style) + var/hairstyle = owner.get_hairstyle() + var/decl/sprite_accessory/hair = GET_DECL(hairstyle) data["hair_style"] = hair.name data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR) @@ -129,7 +130,8 @@ var/decl/sprite_accessory/facial_hair_decl = GET_DECL(facial_hair_style) facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_decl.name, "ref" = "\ref[facial_hair_decl]") data["facial_hair_styles"] = facial_hair_styles - var/decl/sprite_accessory/facial_hair = GET_DECL(owner.f_style) + var/facial_hairstyle = owner.get_facial_hairstyle() + var/decl/sprite_accessory/facial_hair = GET_DECL(facial_hairstyle) data["facial_hair_style"] = facial_hair.name data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm index 8d58cb06f10..86b3bc85f62 100644 --- a/code/modules/nano/nanomapgen.dm +++ b/code/modules/nano/nanomapgen.dm @@ -21,7 +21,11 @@ set category = "Server" if(holder) - nanomapgen_DumpTile(1, 1, text2num(input(usr,"Enter the Z level to generate"))) + var/zlevel = text2num(input(usr,"Enter the Z level to generate")) + if(!zlevel) + return + var/datum/level_data/level = SSmapping.levels_by_z[zlevel] + nanomapgen_DumpTile(level.level_inner_min_x, level.level_inner_min_y, zlevel, level.level_inner_max_x, level.level_inner_max_y) /client/proc/nanomapgen_DumpTile(var/startX = 1, var/startY = 1, var/currentZ = 1, var/endX = -1, var/endY = -1) @@ -66,13 +70,13 @@ var/icon/TurfIcon = new(Turf.icon, Turf.icon_state, dir = Turf.dir) TurfIcon.Scale(NANOMAP_ICON_SIZE, NANOMAP_ICON_SIZE) - Tile.Blend(TurfIcon, ICON_OVERLAY, ((WorldX - 1) * NANOMAP_ICON_SIZE), ((WorldY - 1) * NANOMAP_ICON_SIZE)) + Tile.Blend(TurfIcon, ICON_OVERLAY, ((WorldX - startX) * NANOMAP_ICON_SIZE), ((WorldY - startY) * NANOMAP_ICON_SIZE)) count++ if (count % 8000 == 0) to_world_log("NanoMapGen: [count] tiles done") - sleep(1) + CHECK_TICK var/mapFilename = "new_[map_image_file_name(currentZ)]" diff --git a/code/modules/organs/ailments/_ailment.dm b/code/modules/organs/ailments/_ailment.dm index 70f12accd40..101f4bb8dd8 100644 --- a/code/modules/organs/ailments/_ailment.dm +++ b/code/modules/organs/ailments/_ailment.dm @@ -21,7 +21,7 @@ var/treated_by_chem_effect_strength = 1 // How strong must the chemical effect be to cure this ailment? // Fluff strings - var/initial_ailment_message = "Your $ORGAN$ doesn't feel quite right..." // Shown in New() + var/initial_ailment_message = "Your $ORGAN$ $ORGAN_DOES$n't feel quite right..." // Shown in New() var/third_person_treatment_message = "$USER$ treats $TARGET$'s ailment with $ITEM$." // Shown when treating other with an item. var/self_treatment_message = "$USER$ treats $USER_HIS$ ailment with $ITEM$." // Shown when treating self with an item. var/medication_treatment_message = "Your ailment abates." // Shown when treated by a metabolized reagent or CE_X effect. @@ -56,7 +56,7 @@ /datum/ailment/proc/begin_ailment_event() if(!organ?.owner) return - timer_id = addtimer(CALLBACK(src, .proc/do_malfunction), rand(min_time, max_time), TIMER_STOPPABLE | TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_NO_HASH_WAIT) + timer_id = addtimer(CALLBACK(src, PROC_REF(do_malfunction)), rand(min_time, max_time), TIMER_STOPPABLE | TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_NO_HASH_WAIT) /datum/ailment/proc/do_malfunction() if(!organ?.owner) @@ -69,7 +69,13 @@ return /datum/ailment/proc/treated_by_item(var/obj/item/treatment) - return treated_by_item_type && istype(treatment, treated_by_item_type) + if(islist(treated_by_item_type)) + for(var/treatment_type in treated_by_item_type) + if(istype(treatment, treatment_type)) + return TRUE + else if(ispath(treated_by_item_type)) + return istype(treatment, treated_by_item_type) + return FALSE /datum/ailment/proc/replace_tokens(var/message, var/obj/item/treatment, var/mob/user, var/mob/target) . = message @@ -83,6 +89,9 @@ . = replacetext(., "$TARGET$", "\the [target]") if(organ) . = replacetext(., "$ORGAN$", organ.name) + var/decl/pronouns/organ_pronouns = get_pronouns_by_gender(organ.gender) + . = replacetext(., "$ORGAN_DOES$", organ_pronouns.does) + . = replacetext(., "$ORGAN_IS$", organ_pronouns.is) . = capitalize(trim(.)) /datum/ailment/proc/was_treated_by_item(var/obj/item/treatment, var/mob/user, var/mob/target) diff --git a/code/modules/organs/ailments/ailment_codex.dm b/code/modules/organs/ailments/ailment_codex.dm index 8cc388bcb80..a60d78ad2e3 100644 --- a/code/modules/organs/ailments/ailment_codex.dm +++ b/code/modules/organs/ailments/ailment_codex.dm @@ -1,14 +1,12 @@ -/datum/codex_entry/ailments - name = "Medical Ailments" - lore_text = "Day to day life can exert stress on the body, which can manifest in small, non-critical medical conditions like a sore back or a \ - headache. 9/10 doctors recommend a visit to your local physician for treatment before they compound into a chronic or acute condition." - mechanics_text = "Ailments are minor medical conditions that can crop up during a round. They aren't life-threatening, and \ - frequently aren't anything more than slightly annoying, and treating them is generally straightforward." +/datum/codex_entry/guide/ailments + name = "Guide to Medical Ailments" + mechanics_text = "Ailments are minor medical conditions that can crop up during a round. They aren't life-threatening, and frequently aren't anything more than slightly annoying, and treating them is generally straightforward." + lore_text = "Day to day life can exert stress on the body, which can manifest in small, non-critical medical conditions like a sore back or a headache. 9/10 doctors recommend a visit to your local physician for treatment before they compound into a chronic or acute condition." var/show_robotics_recipes = FALSE var/name_column = "Ailment" var/treatment_column = "Recommended treatment" -/datum/codex_entry/ailments/robotic +/datum/codex_entry/guide/ailments/robotic name = "Prosthetic Faults" lore_text = "Prosthetic limbs can be prone to debilitating and often dangerous faults, especially if exposed to hostile conditions." mechanics_text = "EMP damage or improper installation can cause prosthetic limbs to develop problems, some of them more serious than others." @@ -36,7 +34,7 @@ return "stimulant drugs" return null -/datum/codex_entry/ailments/New() +/datum/codex_entry/guide/ailments/New() var/list/ailment_table = list("") ailment_table += "" for(var/atype in subtypesof(/datum/ailment)) diff --git a/code/modules/organs/ailments/faults/_fault.dm b/code/modules/organs/ailments/faults/_fault.dm index a2aefe003b6..0eb2ec462f8 100644 --- a/code/modules/organs/ailments/faults/_fault.dm +++ b/code/modules/organs/ailments/faults/_fault.dm @@ -1,7 +1,10 @@ /datum/ailment/fault affects_robotics = TRUE category = /datum/ailment/fault - treated_by_item_type = /obj/item/stack/nanopaste + treated_by_item_type = list( + /obj/item/stack/nanopaste, + /obj/item/stack/tape_roll/duct_tape + ) treated_by_item_cost = 3 third_person_treatment_message = "$USER$ patches $TARGET$'s faulty $ORGAN$ with $ITEM$." self_treatment_message = "$USER$ patches $USER_HIS$ faulty $ORGAN$ with $ITEM$." diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index e7ba796dfc1..6beb21ae561 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -195,7 +195,7 @@ var/stress_modifier = get_stress_modifier() if(stress_modifier) - amount *= 1-(config.stress_blood_recovery_constant * stress_modifier) + amount *= 1-(get_config_value(/decl/config/num/health_stress_blood_recovery_constant) * stress_modifier) var/blood_volume_raw = vessel.total_volume amount = max(0,min(amount, species.blood_volume - blood_volume_raw)) @@ -301,8 +301,8 @@ splatter.basecolor = blood_data["blood_color"] splatter.update_icon() - splatter.fluorescent = 0 - splatter.set_invisibility(0) + splatter.fluorescent = FALSE + splatter.set_invisibility(INVISIBILITY_NONE) return splatter //Percentage of maximum blood volume. diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 3bfa82d7e41..9f6723cb5c0 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -9,9 +9,10 @@ organ_tag = "limb" appearance_flags = DEFAULT_APPEARANCE_FLAGS | LONG_GLIDE scale_max_damage_to_species_health = TRUE + abstract_type = /obj/item/organ/external var/slowdown = 0 - var/tmp/icon_cache_key + var/tmp/_icon_cache_key // Strings var/broken_description // fracture string if any. var/damage_state = "00" // Modifier used for generating the on-mob damage overlay for this limb. @@ -31,7 +32,6 @@ // Appearance vars. var/body_part = null // Part flag var/icon_position = 0 // Used in mob overlay layering calculations. - var/icon/mob_icon // Cached icon for use in mob overlays. var/skin_tone // Skin tone. var/skin_colour // skin colour var/skin_blend = ICON_ADD // How the skin colour is applied. @@ -123,18 +123,32 @@ LAZYREMOVE(owner.bad_external_organs, src) /obj/item/organ/external/set_species(specie_name) + _icon_cache_key = null . = ..() skin_blend = bodytype.limb_blend for(var/attack_type in species.unarmed_attacks) var/decl/natural_attack/attack = GET_DECL(attack_type) if(istype(attack) && (organ_tag in attack.usable_with_limbs)) LAZYADD(unarmed_attacks, attack_type) - get_icon() + update_icon() -/obj/item/organ/external/set_bodytype(decl/bodytype/new_bodytype, override_material = null) - . = ..() +/obj/item/organ/external/set_bodytype(decl/bodytype/new_bodytype, override_material = null, apply_to_internal_organs = TRUE) + _icon_cache_key = null + var/decl/bodytype/old_bodytype = bodytype + . = ..(new_bodytype, override_material) + if(bodytype != old_bodytype && apply_to_internal_organs) + bodytype.rebuild_internal_organs(src, override_material) slowdown = bodytype.movement_slowdown - update_icon(TRUE) + if(.) + update_icon(TRUE) + +/obj/item/organ/external/set_dna(var/datum/dna/new_dna) + _icon_cache_key = null + return ..() + +/obj/item/organ/external/reset_status() + _icon_cache_key = null + return ..() /obj/item/organ/external/proc/set_bodytype_with_children(decl/bodytype/new_bodytype, override_material = null) set_bodytype(new_bodytype, override_material) @@ -415,7 +429,7 @@ return owner.verbs -= /mob/living/carbon/human/proc/undislocate -/obj/item/organ/external/update_health() +/obj/item/organ/external/update_organ_health() damage = min(max_damage, (brute_dam + burn_dam)) return @@ -427,6 +441,8 @@ //If attached to an owner mob if(istype(owner)) + owner.full_prosthetic = null + // Initialize fingerprints if we don't already have some (TODO: we're assuming this is our first owner, maybe check for this elsewhere?). if((limb_flags & ORGAN_FLAG_FINGERPRINT) && !fingerprint && !BP_IS_PROSTHETIC(src)) fingerprint = owner.get_full_print(ignore_blockers = TRUE) @@ -440,11 +456,8 @@ // //If we contain any child organs add them to the owner // - for(var/obj/item/organ/organ in internal_organs) - owner.add_organ(organ, src, in_place, update_icon, detached) - - for(var/obj/item/organ/external/organ in children) - owner.add_organ(organ, src, in_place, update_icon, detached) + for(var/obj/item/organ/organ in (implants|children|internal_organs)) + owner.add_organ(organ, src, in_place, update_icon, FALSE) // //Add any existing organs in the owner that have us as parent @@ -558,7 +571,7 @@ switch(damage_type) if(BRUTE) src.heal_damage(repair_amount, 0, 0, 1) if(BURN) src.heal_damage(0, repair_amount, 0, 1) - owner.refresh_visible_overlays() + owner.try_refresh_visible_overlays() if(user == src.owner) var/decl/pronouns/G = user.get_pronouns() user.visible_message(SPAN_NOTICE("\The [user] patches [damage_desc] on [G.his] [name] with \the [tool].")) @@ -600,7 +613,7 @@ This function completely restores a damaged organ to perfect condition. . = ..() // Clear damage, reapply aspects. if(owner) - owner.updatehealth() + owner.update_health() //#TODO: Rejuvination hacks should probably be removed /obj/item/organ/external/remove_rejuv() @@ -641,7 +654,7 @@ This function completely restores a damaged organ to perfect condition. switch(type) if(BURN) fluid_loss_severity = FLUIDLOSS_WIDE_BURN if(LASER) fluid_loss_severity = FLUIDLOSS_CONC_BURN - var/fluid_loss = (damage/(owner.maxHealth - config.health_threshold_dead)) * SPECIES_BLOOD_DEFAULT * fluid_loss_severity + var/fluid_loss = (damage/(owner.get_max_health() - get_config_value(/decl/config/num/health_health_threshold_dead))) * SPECIES_BLOOD_DEFAULT * fluid_loss_severity owner.remove_blood(fluid_loss) // first check whether we can widen an existing wound @@ -866,12 +879,12 @@ Note that amputating the affected organ does in fact remove the infection from t // we only update wounds once in [wound_update_accuracy] ticks so have to emulate realtime heal_amt = heal_amt * wound_update_accuracy // configurable regen speed woo, no-regen hardcore or instaheal hugbox, choose your destiny - heal_amt = heal_amt * config.organ_regeneration_multiplier + heal_amt = heal_amt * get_config_value(/decl/config/num/health_organ_regeneration_multiplier) // Apply a modifier based on how stressed we currently are. if(owner) var/stress_modifier = owner.get_stress_modifier() if(stress_modifier) - heal_amt *= 1-(config.stress_healing_recovery_constant * stress_modifier) + heal_amt *= 1-(get_config_value(/decl/config/num/health_stress_healing_recovery_constant) * stress_modifier) // amount of healing is spread over all the wounds heal_amt = heal_amt / (LAZYLEN(wounds) + 1) // making it look prettier on scanners @@ -888,7 +901,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(update_surgery) owner.update_surgery() if (update_damstate()) - owner.UpdateDamageIcon(1) + owner.update_damage_icon(TRUE) //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. /obj/item/organ/external/proc/update_damages() @@ -1210,7 +1223,7 @@ Note that amputating the affected organ does in fact remove the infection from t I.exposed() /obj/item/organ/external/proc/fracture() - if(!config.bones_can_break) + if(!get_config_value(/decl/config/toggle/on/health_bones_can_break)) return if(BP_IS_PROSTHETIC(src)) return //ORGAN_BROKEN doesn't have the same meaning for robot limbs @@ -1245,7 +1258,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/mend_fracture() if(BP_IS_PROSTHETIC(src)) return 0 //ORGAN_BROKEN doesn't have the same meaning for robot limbs - if(brute_dam > min_broken_damage * config.organ_health_multiplier) + if(brute_dam > min_broken_damage * get_config_value(/decl/config/num/health_organ_health_multiplier)) return 0 //will just immediately fracture again status &= ~ORGAN_BROKEN @@ -1336,6 +1349,7 @@ Note that amputating the affected organ does in fact remove the infection from t W.forceMove(owner) /obj/item/organ/external/do_uninstall(in_place, detach, ignore_children, update_icon) + var/mob/living/carbon/human/victim = owner //parent proc clears owner if(!(. = ..())) return @@ -1387,6 +1401,8 @@ Note that amputating the affected organ does in fact remove the infection from t continue organ.do_install(null, src, FALSE, update_icon, FALSE) //Forcemove the organ and properly set it up in our internal data + victim.full_prosthetic = null + //Note that we don't need to change our own hierarchy when not removing from a mob // Remove parent references @@ -1413,7 +1429,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/set_detached(is_detached) if(BP_IS_PROSTHETIC(src)) is_detached = FALSE //External prosthetics are never detached - return ..(is_detached) + . = ..(is_detached) /obj/item/organ/external/proc/disfigure(var/type = BRUTE) if(status & ORGAN_DISFIGURED) diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index 60b8d217b62..6f6f150edcb 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -48,10 +48,10 @@ burn = max(burn - spillover, 0) //If limb took enough damage, try to cut or tear it off if(owner && loc == owner) - owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called - if((limb_flags & ORGAN_FLAG_CAN_AMPUTATE) && config.limbs_can_break) + owner.update_health() //droplimb will call update_health() again if it does end up being called + if((limb_flags & ORGAN_FLAG_CAN_AMPUTATE) && get_config_value(/decl/config/toggle/on/health_limbs_can_break)) var/total_damage = brute_dam + burn_dam + brute + burn + spillover - var/threshold = max_damage * config.organ_health_multiplier + var/threshold = max_damage * get_config_value(/decl/config/num/health_organ_health_multiplier) if(total_damage > threshold) if(attempt_dismemberment(pure_brute, burn, sharp, edge, used_weapon, spillover, total_damage > threshold*6, override_droplimb = override_droplimb)) return @@ -109,16 +109,16 @@ //If there are still hurties to dispense if (spillover) - owner.shock_stage += spillover * config.organ_damage_spillover_multiplier + owner.shock_stage += spillover * get_config_value(/decl/config/num/health_organ_damage_spillover_multiplier) // sync the organ's damage with its wounds update_damages() - owner.updatehealth() + owner.update_health() if(status & ORGAN_BLEEDING) owner.update_bandages() if(owner && update_damstate()) - owner.UpdateDamageIcon() + owner.update_damage_icon() if(created_wound && isobj(used_weapon)) var/obj/O = used_weapon @@ -192,8 +192,8 @@ status &= ~ORGAN_BROKEN //Sync the organ's damage with its wounds - src.update_damages() - owner.updatehealth() + update_damages() + owner.update_health() return update_damstate() diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 569c4b67066..aa77c6e51fc 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -4,27 +4,31 @@ var/global/list/limb_icon_cache = list() return ..(SOUTH) /obj/item/organ/external/proc/compile_icon() - //#FIXME: We REALLY shouldn't be messing with overlays outside on_update_icon. And on_update_icon doesn't call this. - cut_overlays() // This is a kludge, only one icon has more than one generation of children though. for(var/obj/item/organ/external/organ in contents) if(organ.children && organ.children.len) for(var/obj/item/organ/external/child in organ.children) - add_overlay(child.mob_icon) - add_overlay(organ.mob_icon) + child.update_icon() + child.compile_overlays() + organ.update_icon() + organ.compile_overlays() + update_icon() + compile_overlays() /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) + _icon_cache_key = null skin_tone = null skin_colour = null - hair_colour = human.hair_colour + hair_colour = human.get_hair_colour() // This used to do a bodytype set but that was *really really bad.* Things that need that should do it themselves. skin_blend = bodytype.limb_blend if(!isnull(human.skin_tone) && bodytype?.appearance_flags & HAS_A_SKIN_TONE) skin_tone = human.skin_tone if(bodytype.appearance_flags & HAS_SKIN_COLOR) - skin_colour = human.skin_colour + skin_colour = human.get_skin_colour() /obj/item/organ/external/proc/sync_colour_to_dna() + _icon_cache_key = null skin_tone = null skin_colour = null hair_colour = rgb(dna.GetUIValue(DNA_UI_HAIR_R),dna.GetUIValue(DNA_UI_HAIR_G),dna.GetUIValue(DNA_UI_HAIR_B)) @@ -42,18 +46,8 @@ var/global/list/limb_icon_cache = list() update_icon(1) if(last_owner) SetName("[last_owner.real_name]'s head") - addtimer(CALLBACK(last_owner, /mob/proc/update_hair), 1, TIMER_UNIQUE) - . = ..() - //Head markings, duplicated (sadly) below. - for(var/M in markings) - var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) - if (mark_style.draw_target == MARKING_TARGET_SKIN) - var/mark_color = markings[M] - var/icon/mark_s = mark_style.get_cached_marking_icon(bodytype, icon_state, mark_color) - //#TODO: This probably should be added to a list that's applied on update icon, otherwise its gonna act really wonky! - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, mark_style.layer_blend) //So when it's on your body, it has icons - icon_cache_key += "[M][mark_color]" + addtimer(CALLBACK(last_owner, TYPE_PROC_REF(/mob, update_hair)), 1, TIMER_UNIQUE) + return ..() /obj/item/organ/external/proc/update_limb_icon_file() if(!BP_IS_PROSTHETIC(src) && (status & ORGAN_MUTATED)) @@ -63,51 +57,92 @@ var/global/list/limb_icon_cache = list() else icon = bodytype.get_base_icon(owner) -/obj/item/organ/external/on_update_icon(var/regenerate = 0) - . = ..() - icon_state = organ_tag - icon_cache_key = "[icon_state]_[species.name][bodytype.name][render_alpha]" +var/global/list/organ_icon_cache = list() +/obj/item/organ/external/proc/generate_mob_icon() - update_limb_icon_file() - mob_icon = apply_colouration(new/icon(icon, icon_state)) + // Generate base icon with colour and tone. + var/icon/ret = bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) + if(status & ORGAN_DEAD) + ret.ColorTone(rgb(10,50,0)) + ret.SetIntensity(0.7) + if(skin_tone) + if(skin_tone >= 0) + ret.Blend(rgb(skin_tone, skin_tone, skin_tone), ICON_ADD) + else + ret.Blend(rgb(-skin_tone, -skin_tone, -skin_tone), ICON_SUBTRACT) + if((bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) + ret.Blend(skin_colour, skin_blend) - //Body markings, does not include head, duplicated (sadly) above. + //Body markings. for(var/M in markings) - var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) - if (mark_style.draw_target == MARKING_TARGET_SKIN) - var/mark_color = markings[M] - var/icon/mark_s = mark_style.get_cached_marking_icon(bodytype, icon_state, mark_color) - //#TODO: This probably should be added to a list that's applied on update icon, otherwise its gonna act really wonky! - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, mark_style.layer_blend) //So when it's on your body, it has icons - icon_cache_key += "[M][mark_color]" - + var/decl/sprite_accessory/marking/mark_style = resolve_accessory_to_decl(M) + if(mark_style && !mark_style.sprite_overlay_layer) + ret.Blend(mark_style.get_cached_accessory_icon(src, markings[M]), mark_style.layer_blend) if(render_alpha < 255) - mob_icon += rgb(,,,render_alpha) + ret += rgb(,,,render_alpha) + global.organ_icon_cache[_icon_cache_key] = ret + return ret - icon = mob_icon +/obj/item/organ/external/proc/get_mob_overlays() + for(var/M in markings) + var/decl/sprite_accessory/marking/mark_style = resolve_accessory_to_decl(M) + if(mark_style?.sprite_overlay_layer) + var/image/mark_image = image(mark_style.get_cached_accessory_icon(src, markings[M])) + mark_image.layer = mark_style.sprite_overlay_layer + LAZYADD(., mark_image) + +/obj/item/organ/external/proc/get_icon_cache_key_components() + . = list("[icon_state]_[species.name]_[bodytype.name]_[render_alpha]_[icon]") + for(var/M in markings) + var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) + if(!mark_style.sprite_overlay_layer) + . += "_[M][markings[M]]" + if(status & ORGAN_DEAD) + . += "_dead" + . += "_tone_[skin_tone]_color_[skin_colour]_[skin_blend]" -/obj/item/organ/external/proc/get_icon() - update_icon() - return mob_icon +/obj/item/organ/external/on_update_icon() + . = ..() -// Returns an image for use by the human health dolly HUD element. -// If the limb is in pain, it will be used as a minimum damage -// amount to represent the obfuscation of being in agonizing pain. + // Update our cache key and refresh or create our base icon. + update_limb_icon_file() + if(icon_state != organ_tag) + icon_state = organ_tag + _icon_cache_key = jointext(get_icon_cache_key_components(), null) + var/icon/mob_icon = global.organ_icon_cache[_icon_cache_key] || generate_mob_icon() + if(icon != mob_icon) + icon = mob_icon + + // We may have some overlays of our own (hair, glowing eyes, layered markings) + var/list/additional_overlays = get_mob_overlays() + if(length(additional_overlays)) + for(var/new_overlay in additional_overlays) + add_overlay(new_overlay) + + // If we've been severed, we may contain child organs that should be rendered (feet on legs etc). + if(!owner && length(contents)) + for(var/obj/item/organ/external/child in contents) + child.update_icon() + child.compile_overlays() // We need the appearance immediately. + add_overlay(child) // Global scope, used in code below. var/global/list/flesh_hud_colours = list("#00ff00","#aaff00","#ffff00","#ffaa00","#ff0000","#aa0000","#660000") var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888","#666666","#444444","#222222","#000000") +// Returns an image for use by the human health dolly HUD element. +// If the limb is in pain, it will be used as a minimum damage +// amount to represent the obfuscation of being in agonizing pain. /obj/item/organ/external/proc/get_damage_hud_image() // Generate the greyscale base icon and cache it for later. // icon_cache_key is set by any get_icon() calls that are made. // This looks convoluted, but it's this way to avoid icon proc calls. if(!hud_damage_image) - var/cache_key = "dambase-[icon_cache_key]" - if(!icon_cache_key || !limb_icon_cache[cache_key]) - limb_icon_cache[cache_key] = icon(get_icon(), null, SOUTH) + update_icon() + var/cache_key = "dambase-[_icon_cache_key]" + if(!cache_key || !limb_icon_cache[cache_key]) + limb_icon_cache[cache_key] = icon(icon, null, SOUTH) var/image/temp = image(limb_icon_cache[cache_key]) if(species) // Calculate the required colour matrix. @@ -130,27 +165,6 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" hud_damage_image.color = hud_colours[max(1,min(CEILING(dam_state*hud_colours.len),hud_colours.len))] return hud_damage_image -/obj/item/organ/external/proc/apply_colouration(var/icon/applying) - - applying = bodytype.apply_limb_colouration(src, applying) - if(status & ORGAN_DEAD) - icon_cache_key += "_dead" - applying.ColorTone(rgb(10,50,0)) - applying.SetIntensity(0.7) - - if(skin_tone) - if(skin_tone >= 0) - applying.Blend(rgb(skin_tone, skin_tone, skin_tone), ICON_ADD) - else - applying.Blend(rgb(-skin_tone, -skin_tone, -skin_tone), ICON_SUBTRACT) - icon_cache_key += "_tone_[skin_tone]" - if(bodytype.appearance_flags & HAS_SKIN_COLOR) - if(skin_colour) - applying.Blend(skin_colour, skin_blend) - icon_cache_key += "_color_[skin_colour]_[skin_blend]" - - return applying - /obj/item/organ/external/proc/bandage_level() if(damage_state_text() == "00") return 0 @@ -163,4 +177,15 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" else if (burn_dam + brute_dam < (max_damage * 0.75 / 2)) . = 2 else - . = 3 \ No newline at end of file + . = 3 + +/obj/item/organ/external/proc/resolve_accessory_to_decl(var/decl/sprite_accessory/accessory_style) + if(ispath(accessory_style)) + accessory_style = GET_DECL(accessory_style) + // Check if this style is permitted for this species, period. + if(!accessory_style.accessory_is_available(owner, species, bodytype)) + return null + // Check if we are concealed (long hair under a hat for example). + if(accessory_style.is_hidden(src)) + return accessory_style.get_hidden_substitute() + return accessory_style diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 75783bdc40a..9ea8af56647 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -16,23 +16,23 @@ limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE - var/draw_eyes = TRUE var/glowing_eyes = FALSE var/can_intake_reagents = TRUE var/has_lips = TRUE var/forehead_graffiti var/graffiti_style -/obj/item/organ/external/head/proc/get_eye_overlay() - if(glowing_eyes || owner?.has_chemical_effect(CE_GLOWINGEYES, 1)) - var/obj/item/organ/internal/eyes/eyes = owner.get_organ((owner.get_bodytype().vision_organ || BP_EYES), /obj/item/organ/internal/eyes) - if(eyes) - return eyes.get_special_overlay() - -/obj/item/organ/external/head/proc/get_eyes() - var/obj/item/organ/internal/eyes/eyes = owner.get_organ((owner.get_bodytype().vision_organ || BP_EYES), /obj/item/organ/internal/eyes) - if(eyes) - return eyes.get_onhead_icon() +/obj/item/organ/external/head/proc/get_organ_eyes_overlay() + if(!glowing_eyes && !owner?.has_chemical_effect(CE_GLOWINGEYES, 1)) + return + var/obj/item/organ/internal/eyes/eyes = get_eyes_organ() + var/icon/eyes_icon = eyes?.get_onhead_icon() // refreshes cache key + if(!eyes_icon) + return + var/cache_key = "[eyes.last_eye_cache_key]-glow" + if(!global.eye_icon_cache[cache_key]) + global.eye_icon_cache[cache_key] = emissive_overlay(eyes_icon, "") + return global.eye_icon_cache[cache_key] /obj/item/organ/external/head/examine(mob/user) . = ..() @@ -75,11 +75,10 @@ /obj/item/organ/external/head/get_agony_multiplier() return (owner && owner.headcheck(organ_tag)) ? 1.50 : 1 -/obj/item/organ/external/head/set_bodytype(decl/bodytype/new_bodytype, override_material = null) +/obj/item/organ/external/head/set_bodytype(decl/bodytype/new_bodytype, override_material = null, apply_to_internal_organs = TRUE) . = ..() - has_lips = bodytype.appearance_flags & HAS_LIPS + has_lips = (bodytype.appearance_flags & HAS_LIPS) can_intake_reagents = !(bodytype.body_flags & BODY_FLAG_NO_EAT) - draw_eyes = bodytype.has_eyes /obj/item/organ/external/head/take_external_damage(brute, burn, damage_flags, used_weapon, override_droplimb) . = ..() @@ -90,75 +89,53 @@ if (burn_dam > 40) disfigure(BURN) -/obj/item/organ/external/head/on_update_icon() - - ..() - +/obj/item/organ/external/head/proc/get_eyes_organ() + RETURN_TYPE(/obj/item/organ/internal/eyes) if(owner) - // Base eye icon. - if(draw_eyes) - var/icon/I = get_eyes() - if(I) - overlays |= I - mob_icon.Blend(I, ICON_OVERLAY) - - // Floating eyes or other effects. - var/image/eye_glow = get_eye_overlay() - if(eye_glow) - overlays |= eye_glow - - if(owner.lip_style && (bodytype.appearance_flags & HAS_LIPS)) - var/icon/lip_icon = new/icon(bodytype.get_lip_icon(owner) || 'icons/mob/human_races/species/lips.dmi', "lipstick_s") - lip_icon.Blend(owner.lip_style, ICON_MULTIPLY) - overlays |= lip_icon - mob_icon.Blend(lip_icon, ICON_OVERLAY) - - overlays |= get_hair_icon() - - return mob_icon - -/obj/item/organ/external/head/proc/get_hair_icon() - var/image/res = image(bodytype.icon_template,"") - if(!owner) - return res + return owner.get_organ((owner.get_bodytype().vision_organ || BP_EYES), /obj/item/organ/internal/eyes) + return locate(/obj/item/organ/internal/eyes) in contents - if(owner.f_style) - var/decl/sprite_accessory/facial_hair_style = GET_DECL(owner.f_style) +/obj/item/organ/external/head/get_icon_cache_key_components() + . = ..() + if(bodytype.has_eyes) + . += "_eyes[get_eyes_organ()?.eye_colour][bodytype.eye_icon]" + if(bodytype.appearance_flags & HAS_LIPS) + var/lip_icon = bodytype.get_lip_icon(owner) + if(lip_icon) + . += "_lips[lip_icon][owner?.lip_color || "skip"]" + +/obj/item/organ/external/head/generate_mob_icon() + var/icon/ret = ..() + // Eye icon. + if(bodytype.has_eyes) + var/icon/eyes_icon = get_eyes_organ()?.get_onhead_icon() + if(eyes_icon) + ret.Blend(eyes_icon, ICON_OVERLAY) + // Lip icon. + if(owner && (bodytype.appearance_flags & HAS_LIPS)) + var/lip_icon = bodytype.get_lip_icon(owner) + if(lip_icon) + var/lip_color = owner?.lip_color + if(lip_color) + var/icon/lip_appearance = new/icon(lip_icon, "lipstick_s") + lip_appearance.Blend(lip_color || COLOR_BLACK, ICON_MULTIPLY) + ret.Blend(lip_appearance, ICON_OVERLAY) + return ret + +/obj/item/organ/external/head/get_mob_overlays() + . = ..() + var/image/eye_glow = get_organ_eyes_overlay() + if(eye_glow) + LAZYADD(., eye_glow) + if(!owner) + return + var/facial_hairstyle = owner.get_facial_hairstyle() + if(facial_hairstyle) + var/decl/sprite_accessory/facial_hair_style = resolve_accessory_to_decl(facial_hairstyle) if(facial_hair_style?.accessory_is_available(owner, species, bodytype)) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(owner.facial_hair_colour && facial_hair_style.do_colouration) - facial_s.Blend(owner.facial_hair_colour, facial_hair_style.blend) - res.overlays |= facial_s - - if(owner.h_style) - var/decl/sprite_accessory/hair/hair_style = GET_DECL(owner.h_style) - var/obj/item/head = owner.get_equipped_item(slot_head_str) - if(head && (head.flags_inv & BLOCK_HEAD_HAIR)) - if(!(hair_style.flags & VERY_SHORT)) - hair_style = GET_DECL(/decl/sprite_accessory/hair/short) + LAZYADD(., image(facial_hair_style.get_cached_accessory_icon(src, owner.get_facial_hair_colour()))) + var/hairstyle = owner.get_hairstyle() + if(hairstyle) + var/decl/sprite_accessory/hair/hair_style = resolve_accessory_to_decl(hairstyle) if(hair_style?.accessory_is_available(owner, species, bodytype)) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration && hair_colour) - hair_s.Blend(hair_colour, hair_style.blend) - res.overlays |= hair_s - - for (var/M in markings) - var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) - if (mark_style.draw_target == MARKING_TARGET_HAIR) - - var/mark_color - if (!mark_style.do_colouration && owner.h_style) - var/decl/sprite_accessory/hair/hair_style = GET_DECL(owner.h_style) - if ((~hair_style.flags & HAIR_BALD) && hair_colour) - mark_color = hair_colour - else //only baseline human skin tones; others will need species vars for coloration - mark_color = rgb(200 + skin_tone, 150 + skin_tone, 123 + skin_tone) - else - mark_color = markings[M] - res.overlays |= mark_style.get_cached_marking_icon(bodytype, icon_state, mark_color) - icon_cache_key += "[M][mark_color]" - - return res - -/obj/item/organ/external/head/no_eyes - draw_eyes = FALSE + LAZYADD(., image(hair_style.get_cached_accessory_icon(src, owner.get_hair_colour()))) diff --git a/code/modules/organs/external/tail.dm b/code/modules/organs/external/tail.dm index 53b2a2fcb29..39e3ab99ee5 100644 --- a/code/modules/organs/external/tail.dm +++ b/code/modules/organs/external/tail.dm @@ -15,12 +15,17 @@ limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE skip_body_icon_draw = TRUE - var/tail // Name of tail state in species effects icon file. - var/tail_animation // If set, the icon to obtain tail animation states from. + /// Name of tail state in species effects icon file. Used as a prefix for animated states. + var/tail + /// Icon file to use for tail states (including animations) + var/tail_icon + /// Blend mode for overlaying colour on the tail. var/tail_blend = ICON_ADD + /// State modifier for hair overlays. var/tail_hair + /// Blend mode for hair overlays. var/tail_hair_blend = ICON_ADD - var/tail_icon = 'icons/effects/species.dmi' + /// How many random tail states are available for animations. var/tail_states = 1 /obj/item/organ/external/tail/do_uninstall(in_place, detach, ignore_children, update_icon) @@ -38,9 +43,6 @@ /obj/item/organ/external/tail/proc/get_tail() return tail -/obj/item/organ/external/tail/proc/get_tail_animation() - return tail_animation - /obj/item/organ/external/tail/proc/get_tail_icon() return tail_icon diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index 444a8247693..28b6da02c03 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -2,6 +2,7 @@ INTERNAL ORGANS DEFINES ****************************************************/ /obj/item/organ/internal + abstract_type = /obj/item/organ/internal scale_max_damage_to_species_health = TRUE // Damage healing vars (moved here from brains) @@ -23,6 +24,9 @@ var/min_bruised_damage = 10 // Damage before considered bruised var/damage_reduction = 0.5 //modifier for internal organ injury + /// Whether or not we should try to transfer a brainmob when removed or replaced in a mob. + var/transfer_brainmob_with_organ = FALSE + /obj/item/organ/internal/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) if(!alive_icon) alive_icon = initial(icon_state) @@ -252,3 +256,43 @@ var/obj/item/organ/O = last_owner.get_organ(parent_organ) if(O) O.vital_to_owner = null + +// Stub to allow brain interfaces to return their wrapped brainmob. +/obj/item/organ/internal/proc/get_brainmob(var/create_if_missing = FALSE) + return + +/obj/item/organ/internal/proc/transfer_key_to_brainmob(var/mob/living/M, var/update_brainmob = TRUE) + var/mob/living/brainmob = get_brainmob(create_if_missing = TRUE) + if(brainmob) + transfer_key_from_mob_to_mob(M, brainmob) + if(update_brainmob) + brainmob.SetName(M.real_name) + brainmob.real_name = M.real_name + brainmob.dna = M.dna?.Clone() + brainmob.languages = M.languages?.Copy() + brainmob.default_language = M.default_language + to_chat(brainmob, SPAN_NOTICE("You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].")) + callHook("debrain", list(brainmob)) + return TRUE + return FALSE + +/obj/item/organ/internal/proc/get_synthetic_owner_name() + return "Cyborg" + +/obj/item/organ/internal/preserve_in_cryopod(var/obj/machinery/cryopod/pod) + var/mob/living/brainmob = get_brainmob() + return brainmob?.key + +// This might need revisiting to stop people successfully implanting brains in groins and transferring minds. +/obj/item/organ/internal/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) + . = ..() + if(transfer_brainmob_with_organ && istype(owner)) + var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) + if(brainmob?.key) + transfer_key_from_mob_to_mob(brainmob, owner) + +/obj/item/organ/internal/do_uninstall(in_place, detach, ignore_children, update_icon) + var/mob/living/victim = owner // cleared in parent proc + . = ..() + if(transfer_brainmob_with_organ && istype(victim)) + transfer_key_to_brainmob(victim, update_brainmob = TRUE) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 3d7801a5ff6..d84032440d0 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -9,48 +9,63 @@ throwforce = 1 throw_speed = 3 throw_range = 5 - origin_tech = "{'biotech':3}" + origin_tech = @'{"biotech":3}' attack_verb = list("attacked", "slapped", "whacked") relative_size = 85 damage_reduction = 0 scale_max_damage_to_species_health = FALSE - var/can_use_mmi = TRUE - var/mob/living/carbon/brain/brainmob = null + transfer_brainmob_with_organ = TRUE + var/can_use_brain_interface = TRUE var/should_announce_brain_damage = TRUE var/oxygen_reserve = 6 + VAR_PRIVATE/mob/living/_brainmob = /mob/living/brain + +/obj/item/organ/internal/brain/get_brainmob(var/create_if_missing = FALSE) + if(!istype(_brainmob) && create_if_missing) + initialize_brainmob() + if(istype(_brainmob)) + return _brainmob + +/obj/item/organ/internal/brain/Initialize() + . = ..() + if(species) + set_max_damage(species.total_health) + else + set_max_damage(200) + +/obj/item/organ/internal/brain/proc/initialize_brainmob() + if(istype(_brainmob)) + return + if(!ispath(_brainmob)) + _brainmob = initial(_brainmob) + if(ispath(_brainmob)) + _brainmob = new _brainmob(src) + else + _brainmob = null /obj/item/organ/internal/brain/getToxLoss() return 0 /obj/item/organ/internal/brain/set_species(species_name) . = ..() + icon_state = "brain-prosthetic" if(species) set_max_damage(species.total_health) else set_max_damage(200) /obj/item/organ/internal/brain/Destroy() - QDEL_NULL(brainmob) + if(istype(_brainmob)) + QDEL_NULL(_brainmob) . = ..() -/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H) - - if(!brainmob) - brainmob = new(src) - brainmob.SetName(H.real_name) - brainmob.real_name = H.real_name - brainmob.dna = H.dna.Clone() - brainmob.timeofhostdeath = H.timeofdeath - - if(H.mind) - H.mind.transfer_to(brainmob) - - to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].") - callHook("debrain", list(brainmob)) - -/obj/item/organ/internal/brain/examine(mob/user) +/obj/item/organ/internal/brain/examine(mob/user, var/distance) . = ..() - if(brainmob && brainmob.client)//if thar be a brain inside... the brain. + if(distance <= 1) + show_brain_status(user) + +/obj/item/organ/internal/brain/proc/show_brain_status(mob/user) + if(istype(_brainmob) && _brainmob?.client) //if thar be a brain inside... the brain. to_chat(user, "You can feel the small spark of life still left in this one.") else to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") @@ -67,21 +82,6 @@ if(!(. = ..())) return -/obj/item/organ/internal/brain/on_remove_effects() - if(istype(owner)) - transfer_identity(owner) - return ..() - -/obj/item/organ/internal/brain/on_add_effects() - if(brainmob) - if(brainmob.mind) - if(owner.key) - owner.ghostize() - brainmob.mind.transfer_to(owner) - else - owner.key = brainmob.key - return ..() - /obj/item/organ/internal/brain/can_recover() return !(status & ORGAN_DEAD) @@ -172,7 +172,7 @@ SET_STATUS_MAX(owner, STAT_PARA, damage_secondary) SET_STATUS_MAX(owner, STAT_WEAK, round(damage, 1)) if(prob(30)) - addtimer(CALLBACK(src, .proc/brain_damage_callback, damage), rand(6, 20) SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(brain_damage_callback), damage), rand(6, 20) SECONDS, TIMER_UNIQUE) /obj/item/organ/internal/brain/proc/brain_damage_callback(var/damage) //Confuse them as a somewhat uncommon aftershock. Side note: Only here so a spawn isn't used. Also, for the sake of a unique timer. if(!QDELETED(owner)) @@ -221,7 +221,7 @@ /obj/item/organ/internal/brain/surgical_fix(mob/user) var/blood_volume = owner.get_blood_oxygenation() if(blood_volume < BLOOD_VOLUME_SURVIVE) - to_chat(user, "Parts of [src] didn't survive the procedure due to lack of air supply!") + to_chat(user, SPAN_DANGER("Parts of \the [src] didn't survive the procedure due to lack of air supply!")) set_max_damage(FLOOR(max_damage - 0.25*damage)) heal_damage(damage) @@ -229,4 +229,9 @@ . = (species.total_health - max_damage)/species.total_health /obj/item/organ/internal/brain/get_mechanical_assisted_descriptor() - return "machine-interface [name]" \ No newline at end of file + return "machine-interface [name]" + +/obj/item/organ/internal/brain/die() + if(istype(_brainmob) && _brainmob.stat != DEAD) + _brainmob.death() + ..() diff --git a/code/modules/organs/internal/brain_computer.dm b/code/modules/organs/internal/brain_computer.dm new file mode 100644 index 00000000000..3d298b04b30 --- /dev/null +++ b/code/modules/organs/internal/brain_computer.dm @@ -0,0 +1,92 @@ +// Robobrain. +/obj/item/organ/internal/brain/robotic + name = "computer intelligence core" + desc = "The pinnacle of artifical intelligence technology, conveniently stored in a fist-sized cube." + icon = 'icons/obj/items/brain_interface_robotic.dmi' + origin_tech = @'{"engineering":4,"materials":4,"wormholes":2,"programming":4}' + material = /decl/material/solid/metal/steel + matter = list( + /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, + /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, + /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE + ) + can_use_brain_interface = FALSE + var/searching = FALSE + var/brain_name + +/obj/item/organ/internal/brain/robotic/handle_severe_damage() + return // TODO: computer maladies + +/obj/item/organ/internal/brain/robotic/handle_disabilities() + return // TODO: computer maladies + +/obj/item/organ/internal/brain/robotic/Initialize() + . = ..() + set_bodytype(/decl/bodytype/prosthetic/basic_human) + update_icon() + brain_name = "[pick(list("ADA","DOS","GNU","MAC","WIN"))]-[random_id(type,1000,9999)]" + SetName("[name] ([brain_name])") + +/obj/item/organ/internal/brain/robotic/initialize_brainmob() + ..() + if(istype(_brainmob)) + _brainmob.SetName(brain_name) + _brainmob.add_language(/decl/language/machine) + +/obj/item/organ/internal/brain/robotic/on_update_icon() + var/mob/living/brainmob = get_brainmob() + icon_state = get_world_inventory_state() + if(!searching) + if(!brainmob?.key || brainmob.stat == DEAD) + icon_state = "[icon_state]-dead" + else + icon_state = "[icon_state]-full" + +/obj/item/organ/internal/brain/robotic/attack_self(mob/user) + var/mob/living/brainmob = get_brainmob(create_if_missing = TRUE) + if(!brainmob?.key && !searching) + to_chat(user, SPAN_NOTICE("You press the power button and boot up \the [src].")) + searching = TRUE + update_icon() + var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/machine_intelligence) + G.request_player(brainmob, "Someone is requesting a personality for a [name].", 1 MINUTE) + addtimer(CALLBACK(src, PROC_REF(reset_search)), 1 MINUTE) + return TRUE + . = ..() + +/obj/item/organ/internal/brain/robotic/proc/reset_search() + searching = FALSE + update_icon() + var/mob/living/brainmob = get_brainmob() + if(!brainmob?.key) + visible_message(SPAN_WARNING("\The [src] emits a series of loud beeps, indicating a failure to boot. Try again in a few minutes.")) + +/obj/item/organ/internal/brain/robotic/attack_ghost(var/mob/observer/ghost/user) + var/mob/living/brainmob = get_brainmob(create_if_missing = TRUE) + if(brainmob?.key) + to_chat(user, SPAN_WARNING("\The [src] is already inhabited; there's no room for you!")) + return TRUE + + var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/machine_intelligence) + if(G.assess_candidate(user)) + var/response = alert(user, "Are you sure you wish to possess \the [src]?", "Possess [capitalize(name)]", "Yes", "No") + if(response == "Yes" && brainmob && !brainmob?.key && G.assess_candidate(user)) + G.transfer_personality(user, brainmob) + +/obj/item/organ/internal/brain/robotic/show_brain_status(mob/user) + var/mob/living/brainmob = get_brainmob() + if(brainmob?.key) + switch(brainmob.stat) + if(CONSCIOUS) + if(!brainmob.client) + to_chat(user, SPAN_WARNING("It appears to be in stand-by mode.")) + if(UNCONSCIOUS) + to_chat(user, SPAN_WARNING("It doesn't seem to be responsive.")) + if(DEAD) + to_chat(user, SPAN_WARNING("It appears to be completely inactive.")) + else + to_chat(user, SPAN_WARNING("It appears to be completely inactive.")) + +/obj/item/organ/internal/brain/robotic/get_synthetic_owner_name() + return "Robot" diff --git a/code/modules/organs/internal/cell.dm b/code/modules/organs/internal/cell.dm new file mode 100644 index 00000000000..b9d478150f1 --- /dev/null +++ b/code/modules/organs/internal/cell.dm @@ -0,0 +1,96 @@ +/obj/item/organ/internal/cell + name = "microbattery" + desc = "A small, powerful cell for use in fully prosthetic bodies." + icon_state = "cell" + dead_icon = "cell_bork" + organ_tag = BP_CELL + parent_organ = BP_CHEST + var/open + var/obj/item/cell/cell = /obj/item/cell/hyper + //at 0.8 completely depleted after 60ish minutes of constant walking or 130 minutes of standing still + var/servo_cost = 0.8 + +/obj/item/organ/internal/cell/Initialize() + if(ispath(cell)) + cell = new cell(src) + . = ..() + +/obj/item/organ/internal/cell/proc/percent() + if(!cell) + return 0 + return get_charge()/cell.maxcharge * 100 + +/obj/item/organ/internal/cell/proc/get_charge() + if(!cell) + return 0 + if(status & ORGAN_DEAD) + return 0 + return round(cell.charge*(1 - damage/max_damage)) + +/obj/item/organ/internal/cell/proc/checked_use(var/amount) + if(!is_usable()) + return FALSE + return cell && cell.checked_use(amount) + +/obj/item/organ/internal/cell/proc/use(var/amount) + if(!is_usable()) + return 0 + return cell && cell.use(amount) + +/obj/item/organ/internal/cell/proc/get_power_drain() + var/damage_factor = 1 + 10 * damage/max_damage + return servo_cost * damage_factor + +/obj/item/organ/internal/cell/Process() + ..() + if(!owner) + return + if(owner.stat == DEAD) //not a drain anymore + return + var/cost = get_power_drain() + if(world.time - owner.l_move_time < 15) + cost *= 2 + if(!checked_use(cost) && owner.isSynthetic()) + if(!owner.lying && !owner.buckled) + to_chat(owner, SPAN_WARNING("You don't have enough energy to function!")) + SET_STATUS_MAX(owner, STAT_PARA, 3) + +/obj/item/organ/internal/cell/emp_act(severity) + ..() + if(cell) + cell.emp_act(severity) + +/obj/item/organ/internal/cell/attackby(obj/item/W, mob/user) + if(IS_SCREWDRIVER(W)) + if(open) + open = 0 + to_chat(user, SPAN_NOTICE("You screw the battery panel in place.")) + else + open = 1 + to_chat(user, SPAN_NOTICE("You unscrew the battery panel.")) + + if(IS_CROWBAR(W)) + if(open) + if(cell) + user.put_in_hands(cell) + to_chat(user, SPAN_NOTICE("You remove \the [cell] from \the [src].")) + cell = null + + if (istype(W, /obj/item/cell)) + if(open) + if(cell) + to_chat(user, SPAN_WARNING("There is a power cell already installed.")) + else if(user.try_unequip(W, src)) + cell = W + to_chat(user, SPAN_NOTICE("You insert \the [cell].")) + +/obj/item/organ/internal/cell/on_add_effects() + . = ..() + // This is very ghetto way of rebooting an IPC. TODO better way. + if(owner && owner.stat == DEAD) + owner.set_stat(CONSCIOUS) + owner.visible_message(SPAN_NOTICE("\The [owner] twitches visibly!")) + +/obj/item/organ/internal/cell/listen() + if(get_charge()) + return "faint hum of the power bank" diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index f5bc6dd2980..bdb11a3dd1f 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -33,40 +33,39 @@ /obj/item/organ/internal/eyes/robot/Initialize(mapload, material_key, datum/dna/given_dna, decl/bodytype/new_bodytype) . = ..() - verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow -/obj/item/organ/internal/eyes/proc/get_eye_cache_key() +/obj/item/organ/internal/eyes/proc/get_onhead_icon() last_cached_eye_colour = eye_colour last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[bodytype.eye_offset]" - return last_eye_cache_key - -/obj/item/organ/internal/eyes/proc/get_onhead_icon() - var/cache_key = get_eye_cache_key() - if(!human_icon_cache[cache_key]) + if(!bodytype.eye_icon) + return + if(!global.eye_icon_cache[last_eye_cache_key]) var/icon/eyes_icon = icon(icon = bodytype.eye_icon, icon_state = "") if(bodytype.eye_offset) eyes_icon.Shift(NORTH, bodytype.eye_offset) if(bodytype.apply_eye_colour) eyes_icon.Blend(last_cached_eye_colour, bodytype.eye_blend) - human_icon_cache[cache_key] = eyes_icon - return human_icon_cache[cache_key] - -/obj/item/organ/internal/eyes/proc/get_special_overlay() - var/icon/I = get_onhead_icon() - if(I) - var/cache_key = "[last_eye_cache_key]-glow" - if(!human_icon_cache[cache_key]) - human_icon_cache[cache_key] = emissive_overlay(I, "") - return human_icon_cache[cache_key] + global.eye_icon_cache[last_eye_cache_key] = eyes_icon + return global.eye_icon_cache[last_eye_cache_key] /obj/item/organ/internal/eyes/proc/update_colour() if(!owner) return + // Update our eye colour. + var/new_eye_colour if(owner.has_chemical_effect(CE_GLOWINGEYES, 1)) - eye_colour = "#75bdd6" // blue glow, hardcoded for now. + new_eye_colour = "#75bdd6" // blue glow, hardcoded for now. else - eye_colour = owner.eye_colour + new_eye_colour = owner.get_eye_colour() + + if(new_eye_colour && eye_colour != new_eye_colour) + eye_colour = new_eye_colour + // Clear the head cache key so they can update their cached icon. + var/obj/item/organ/external/head/head = GET_EXTERNAL_ORGAN(owner, BP_HEAD) + if(istype(head)) + head._icon_cache_key = null /obj/item/organ/internal/eyes/take_internal_damage(amount, var/silent=0) var/oldbroken = is_broken() @@ -92,16 +91,16 @@ /obj/item/organ/internal/eyes/do_install(mob/living/carbon/human/target, affected, in_place, update_icon, detached) // Apply our eye colour to the target. if(istype(target) && eye_colour) - target.eye_colour = eye_colour + target.set_eye_colour(eye_colour, skip_update = TRUE) target.update_eyes(update_icons = update_icon) if(owner && BP_IS_PROSTHETIC(src)) - verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow . = ..() /obj/item/organ/internal/eyes/do_uninstall(in_place, detach, ignore_children, update_icon) . = ..() - verbs -= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs -= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs -= /obj/item/organ/internal/eyes/proc/toggle_eye_glow // TODO: FIND A BETTER WAY TO DO THIS @@ -111,36 +110,36 @@ if(BP_IS_PROSTHETIC(src)) name = "optical sensor" icon = 'icons/obj/robot_component.dmi' - verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow else name = initial(name) icon = initial(icon) - verbs -= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs -= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs -= /obj/item/organ/internal/eyes/proc/toggle_eye_glow update_colour() /obj/item/organ/internal/eyes/get_mechanical_assisted_descriptor() return "retinal overlayed [name]" -/obj/item/organ/internal/eyes/proc/change_eye_color() +/obj/item/organ/internal/eyes/proc/change_eye_color_verb() set name = "Change Eye Color" set desc = "Changes your robotic eye color." set category = "IC" set src in usr if(!owner || !BP_IS_PROSTHETIC(src)) - verbs -= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs -= /obj/item/organ/internal/eyes/proc/change_eye_color_verb return if(owner.incapacitated()) return - var/new_eyes = input("Please select eye color.", "Eye Color", owner.eye_colour) as color|null - if(new_eyes && do_after(owner, 10) && owner.change_eye_color(new_eyes)) + var/new_eyes = input("Please select eye color.", "Eye Color", owner.get_eye_colour()) as color|null + if(new_eyes && do_after(owner, 10) && owner.set_eye_colour(new_eyes)) update_colour() // Finally, update the eye icon on the mob. - owner.refresh_visible_overlays() + owner.try_refresh_visible_overlays() owner.visible_message(SPAN_NOTICE("\The [owner] changes their eye color."),SPAN_NOTICE("You change your eye color."),) /obj/item/organ/internal/eyes/proc/toggle_eye_glow() @@ -160,4 +159,4 @@ var/obj/item/organ/external/head/head = owner.get_organ(BP_HEAD, /obj/item/organ/external/head) if(head) head.glowing_eyes = !head.glowing_eyes - owner.refresh_visible_overlays() + owner.try_refresh_visible_overlays() diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index b8a1e9d9d8b..be7f416b0d4 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -5,13 +5,13 @@ icon_state = "heart-on" dead_icon = "heart-off" prosthetic_icon = "heart-prosthetic" + damage_reduction = 0.7 + relative_size = 5 + max_damage = 45 var/pulse = PULSE_NORM var/heartbeat = 0 var/beat_sound = 'sound/effects/singlebeat.ogg' var/tmp/next_blood_squirt = 0 - damage_reduction = 0.7 - relative_size = 5 - max_damage = 45 var/open var/list/external_pump @@ -70,7 +70,7 @@ return else //and if it's beating, let's see if it should var/should_stop = prob(80) && owner.get_blood_circulation() < BLOOD_VOLUME_SURVIVE //cardiovascular shock, not enough liquid to pump - should_stop = should_stop || prob(max(0, owner.getBrainLoss() - owner.maxHealth * 0.75)) //brain failing to work heart properly + should_stop = should_stop || prob(max(0, owner.getBrainLoss() - owner.get_max_health() * 0.75)) //brain failing to work heart properly should_stop = should_stop || (prob(5) && pulse == PULSE_THREADY) //erratic heart patterns, usually caused by oxyloss if(should_stop) // The heart has stopped due to going into traumatic or cardiovascular shock. to_chat(owner, "Your heart has stopped!") diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index a5e4ca1812e..a0dcbf6e66e 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -271,16 +271,16 @@ /obj/item/organ/internal/lungs/proc/handle_temperature_effects(datum/gas_mixture/breath) // Hot air hurts :( - var/cold_1 = species.get_species_temperature_threshold(COLD_LEVEL_1) - var/heat_1 = species.get_species_temperature_threshold(HEAT_LEVEL_1) + var/cold_1 = bodytype.get_body_temperature_threshold(COLD_LEVEL_1) + var/heat_1 = bodytype.get_body_temperature_threshold(HEAT_LEVEL_1) if((breath.temperature < cold_1 || breath.temperature > heat_1) && !(MUTATION_COLD_RESISTANCE in owner.mutations)) var/damage = 0 if(breath.temperature <= cold_1) if(prob(20)) to_chat(owner, "You feel your face freezing and icicles forming in your lungs!") - if(breath.temperature < species.get_species_temperature_threshold(COLD_LEVEL_3)) + if(breath.temperature < bodytype.get_body_temperature_threshold(COLD_LEVEL_3)) damage = COLD_GAS_DAMAGE_LEVEL_3 - else if(breath.temperature < species.get_species_temperature_threshold(COLD_LEVEL_2)) + else if(breath.temperature < bodytype.get_body_temperature_threshold(COLD_LEVEL_2)) damage = COLD_GAS_DAMAGE_LEVEL_2 else damage = COLD_GAS_DAMAGE_LEVEL_1 @@ -294,9 +294,9 @@ if(prob(20)) to_chat(owner, "You feel your face burning and a searing heat in your lungs!") - if(breath.temperature < species.get_species_temperature_threshold(HEAT_LEVEL_2)) + if(breath.temperature < bodytype.get_body_temperature_threshold(HEAT_LEVEL_2)) damage = HEAT_GAS_DAMAGE_LEVEL_1 - else if(breath.temperature < species.get_species_temperature_threshold(HEAT_LEVEL_3)) + else if(breath.temperature < bodytype.get_body_temperature_threshold(HEAT_LEVEL_3)) damage = HEAT_GAS_DAMAGE_LEVEL_2 else damage = HEAT_GAS_DAMAGE_LEVEL_3 @@ -322,10 +322,14 @@ // log_debug("Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]") owner.bodytemperature += temp_adj - else if(breath.temperature >= species.heat_discomfort_level) - species.get_environment_discomfort(owner,"heat") - else if(breath.temperature <= species.cold_discomfort_level) - species.get_environment_discomfort(owner,"cold") + else + // Get root bodytype as discomfort messages are not specifically related to the lungs. + var/decl/bodytype/root_bodytype = owner?.get_bodytype() || bodytype + if(root_bodytype) + if(breath.temperature >= root_bodytype.heat_discomfort_level) + root_bodytype.get_environment_discomfort(owner,"heat") + else if(breath.temperature <= root_bodytype.cold_discomfort_level) + root_bodytype.get_environment_discomfort(owner,"cold") /obj/item/organ/internal/lungs/listen() if(owner.failed_last_breath || !active_breathing) diff --git a/code/modules/organs/internal/posibrain.dm b/code/modules/organs/internal/posibrain.dm deleted file mode 100644 index 8d3fc31f8a7..00000000000 --- a/code/modules/organs/internal/posibrain.dm +++ /dev/null @@ -1,333 +0,0 @@ -/obj/item/organ/internal/posibrain - name = "positronic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." - icon = 'icons/obj/assemblies.dmi' - icon_state = "posibrain" - organ_tag = BP_POSIBRAIN - parent_organ = BP_CHEST - force = 1.0 - w_class = ITEM_SIZE_NORMAL - throwforce = 1 - throw_speed = 3 - throw_range = 5 - origin_tech = "{'engineering':4,'materials':4,'wormholes':2,'programming':4}" - attack_verb = list("attacked", "slapped", "whacked") - material = /decl/material/solid/metal/steel - matter = list( - /decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, - /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, - /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE - ) - relative_size = 60 - req_access = list(access_robotics) - organ_properties = ORGAN_PROP_PROSTHETIC //triggers robotization on init - scale_max_damage_to_species_health = FALSE - - var/mob/living/carbon/brain/brainmob = null - var/searching = 0 - var/askDelay = 60 SECONDS - -/obj/item/organ/internal/posibrain/Initialize() - . = ..() - if(!brainmob && iscarbon(loc)) - init(loc) //Not sure why we're creating a braimob on load, and also why not installing it in the owner... - -/obj/item/organ/internal/posibrain/proc/init(var/mob/living/carbon/H) - if(brainmob) - return - brainmob = new(src) - if(istype(H)) - brainmob.SetName(H.real_name) - brainmob.real_name = H.real_name - brainmob.dna = H.dna.Clone() - brainmob.add_language(/decl/language/human/common) - brainmob.add_language(/decl/language/binary) - -/obj/item/organ/internal/posibrain/Destroy() - QDEL_NULL(brainmob) - return ..() - -/obj/item/organ/internal/posibrain/attack_self(mob/user) - if(brainmob && !brainmob.key && searching == 0) - //Start the process of searching for a new user. - to_chat(user, "You carefully locate the manual activation switch and start the positronic brain's boot process.") - icon_state = "posibrain-searching" - src.searching = 1 - var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/positronic_brain) - G.request_player(brainmob, "Someone is requesting a personality for a positronic brain.", 60 SECONDS) - addtimer(CALLBACK(src, .proc/reset_search), askDelay) - -/obj/item/organ/internal/posibrain/proc/reset_search() //We give the players time to decide, then reset the timer. - if(!brainmob?.key) - searching = FALSE - icon_state = "posibrain" - visible_message(SPAN_WARNING("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")) - -/obj/item/organ/internal/posibrain/attack_ghost(var/mob/observer/ghost/user) - if(!searching || (src.brainmob && src.brainmob.key)) - return - - var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/positronic_brain) - if(!G.assess_candidate(user)) - return - var/response = alert(user, "Are you sure you wish to possess this [src]?", "Possess [src]", "Yes", "No") - if(response == "Yes") - G.transfer_personality(user, brainmob) - -/obj/item/organ/internal/posibrain/examine(mob/user) - . = ..() - - var/msg = "*---------*\nThis is [html_icon(src)] \a [src]!\n[desc]\n" - - msg += "" - - if(src.brainmob && src.brainmob.key) - switch(src.brainmob.stat) - if(CONSCIOUS) - if(!src.brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk - if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n" - if(DEAD) msg += "It appears to be completely inactive.\n" - else - msg += "It appears to be completely inactive.\n" - - msg += "*---------*" - to_chat(user, msg) - return - -/obj/item/organ/internal/posibrain/emp_act(severity) - if(!src.brainmob) - return - else - switch(severity) - if(1) - src.brainmob.emp_damage += rand(20,30) - if(2) - src.brainmob.emp_damage += rand(10,20) - if(3) - src.brainmob.emp_damage += rand(0,10) - ..() - -/obj/item/organ/internal/posibrain/proc/PickName() - src.brainmob.SetName("[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[random_id(type,100,999)]") - src.brainmob.real_name = src.brainmob.name - -/obj/item/organ/internal/posibrain/on_update_icon() - . = ..() - if(src.brainmob && src.brainmob.key) - icon_state = "posibrain-occupied" - else - icon_state = "posibrain" - -/obj/item/organ/internal/posibrain/proc/transfer_identity(var/mob/living/carbon/H) - if(H && H.mind) - brainmob.set_stat(CONSCIOUS) - H.mind.transfer_to(brainmob) - brainmob.SetName(H.real_name) - brainmob.real_name = H.real_name - brainmob.dna = H.dna.Clone() - - update_icon() - - to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].") - callHook("debrain", list(brainmob)) - -/obj/item/organ/internal/posibrain/on_add_effects() - if(brainmob) - if(brainmob.mind) - if(owner.key) - owner.ghostize() - brainmob.mind.transfer_to(owner) - else if(brainmob.key) //posibrain init with a dummy brainmob for some reasons, so gotta do this or its gonna disconnect the client on mob transformation - owner.key = brainmob.key - return ..() - -/obj/item/organ/internal/posibrain/on_remove_effects() - if(istype(owner)) - transfer_identity(owner) - return ..() - -/obj/item/organ/internal/posibrain/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) - if(!(. = ..())) - return - if(istype(owner)) - SetName(initial(name)) //Reset the organ's name to stay coherent if we're put back into someone's skull - -/obj/item/organ/internal/posibrain/do_uninstall(in_place, detach, ignore_children) - if(!in_place && istype(owner) && name == initial(name)) - SetName("\the [owner.real_name]'s [initial(name)]") - return ..() - -/obj/item/organ/internal/cell - name = "microbattery" - desc = "A small, powerful cell for use in fully prosthetic bodies." - icon_state = "cell" - dead_icon = "cell_bork" - organ_tag = BP_CELL - parent_organ = BP_CHEST - organ_properties = ORGAN_PROP_PROSTHETIC //triggers robotization on init - var/open - var/obj/item/cell/cell = /obj/item/cell/hyper - //at 0.8 completely depleted after 60ish minutes of constant walking or 130 minutes of standing still - var/servo_cost = 0.8 - -/obj/item/organ/internal/cell/Initialize() - if(ispath(cell)) - cell = new cell(src) - . = ..() - -/obj/item/organ/internal/cell/proc/percent() - if(!cell) - return 0 - return get_charge()/cell.maxcharge * 100 - -/obj/item/organ/internal/cell/proc/get_charge() - if(!cell) - return 0 - if(status & ORGAN_DEAD) - return 0 - return round(cell.charge*(1 - damage/max_damage)) - -/obj/item/organ/internal/cell/proc/checked_use(var/amount) - if(!is_usable()) - return FALSE - return cell && cell.checked_use(amount) - -/obj/item/organ/internal/cell/proc/use(var/amount) - if(!is_usable()) - return 0 - return cell && cell.use(amount) - -/obj/item/organ/internal/cell/proc/get_power_drain() - var/damage_factor = 1 + 10 * damage/max_damage - return servo_cost * damage_factor - -/obj/item/organ/internal/cell/Process() - ..() - if(!owner) - return - if(owner.stat == DEAD) //not a drain anymore - return - var/cost = get_power_drain() - if(world.time - owner.l_move_time < 15) - cost *= 2 - if(!checked_use(cost) && owner.isSynthetic()) - if(!owner.lying && !owner.buckled) - to_chat(owner, "You don't have enough energy to function!") - SET_STATUS_MAX(owner, STAT_PARA, 3) - -/obj/item/organ/internal/cell/emp_act(severity) - ..() - if(cell) - cell.emp_act(severity) - -/obj/item/organ/internal/cell/attackby(obj/item/W, mob/user) - if(IS_SCREWDRIVER(W)) - if(open) - open = 0 - to_chat(user, "You screw the battery panel in place.") - else - open = 1 - to_chat(user, "You unscrew the battery panel.") - - if(IS_CROWBAR(W)) - if(open) - if(cell) - user.put_in_hands(cell) - to_chat(user, "You remove \the [cell] from \the [src].") - cell = null - - if (istype(W, /obj/item/cell)) - if(open) - if(cell) - to_chat(user, "There is a power cell already installed.") - else if(user.try_unequip(W, src)) - cell = W - to_chat(user, "You insert \the [cell].") - -/obj/item/organ/internal/cell/on_add_effects() - . = ..() - // This is very ghetto way of rebooting an IPC. TODO better way. - if(owner && owner.stat == DEAD) - owner.set_stat(CONSCIOUS) - owner.visible_message("\The [owner] twitches visibly!") - -/obj/item/organ/internal/cell/listen() - if(get_charge()) - return "faint hum of the power bank" - -// Used for an MMI or posibrain being installed into a human. -/obj/item/organ/internal/mmi_holder - name = "brain interface" - icon_state = "mmi-empty" - organ_tag = BP_BRAIN - parent_organ = BP_HEAD - organ_properties = ORGAN_PROP_PROSTHETIC //triggers robotization on init - scale_max_damage_to_species_health = FALSE - var/obj/item/mmi/stored_mmi - var/datum/mind/persistantMind //Mind that the organ will hold on to after being removed, used for transfer_and_delete - var/ownerckey // used in the event the owner is out of body - -/obj/item/organ/internal/mmi_holder/Destroy() - stored_mmi = null - persistantMind = null - return ..() - -/obj/item/organ/internal/mmi_holder/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place) - if(status & ORGAN_CUT_AWAY || !(. = ..())) - return - - if(!stored_mmi) - stored_mmi = new(src) - update_from_mmi() - persistantMind = owner.mind - ownerckey = owner.ckey - -/obj/item/organ/internal/mmi_holder/proc/update_from_mmi() - - if(!stored_mmi.brainmob) - stored_mmi.brainmob = new(stored_mmi) - stored_mmi.brainobj = new(stored_mmi) - stored_mmi.brainmob.container = stored_mmi - stored_mmi.brainmob.real_name = owner.real_name - stored_mmi.brainmob.SetName(stored_mmi.brainmob.real_name) - stored_mmi.SetName("[initial(stored_mmi.name)] ([owner.real_name])") - - if(!owner) return - - name = stored_mmi.name - desc = stored_mmi.desc - icon = stored_mmi.icon - - stored_mmi.icon_state = "mmi-full" - icon_state = stored_mmi.icon_state - - if(owner && owner.stat == DEAD) - owner.set_stat(CONSCIOUS) - owner.switch_from_dead_to_living_mob_list() - owner.visible_message("\The [owner] twitches visibly!") - -/obj/item/organ/internal/mmi_holder/on_remove_effects(mob/living/last_owner) - if(last_owner && last_owner.mind) - persistantMind = last_owner.mind - if(last_owner.ckey) - ownerckey = last_owner.ckey - . = ..() - -/obj/item/organ/internal/mmi_holder/proc/transfer_and_delete() - if(stored_mmi) - . = stored_mmi - stored_mmi.forceMove(src.loc) - if(persistantMind) - persistantMind.transfer_to(stored_mmi.brainmob) - else - var/response = input(find_dead_player(ownerckey, 1), "Your [initial(stored_mmi.name)] has been removed from your body. Do you wish to return to life?", "Robotic Rebirth") as anything in list("Yes", "No") - if(response == "Yes") - persistantMind.transfer_to(stored_mmi.brainmob) - qdel(src) - -//Since the mmi_holder is an horrible hacky pos we turn it into a mmi on drop, since it shouldn't exist outside a mob -/obj/item/organ/internal/mmi_holder/dropInto(atom/destination) - . = ..() - if (!QDELETED(src)) - transfer_and_delete() diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index f54d30964d6..d2e15775d76 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -104,8 +104,8 @@ qdel(M) continue - M.adjustBruteLoss(3) - M.adjustFireLoss(3) + M.adjustBruteLoss(3, do_update_health = FALSE) + M.adjustFireLoss(3, do_update_health = FALSE) M.adjustToxLoss(3) var/digestion_product = M.get_digestion_product() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e620be9b5bc..5a685b7c59d 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -4,7 +4,7 @@ germ_level = 0 w_class = ITEM_SIZE_TINY default_action_type = /datum/action/item_action/organ - origin_tech = "{'materials':1,'biotech':1}" + origin_tech = @'{"materials":1,"biotech":1}' throwforce = 2 abstract_type = /obj/item/organ @@ -54,7 +54,7 @@ /obj/item/organ/attack_self(var/mob/user) return (owner && loc == owner && owner == user) -/obj/item/organ/proc/update_health() +/obj/item/organ/proc/update_organ_health() return /obj/item/organ/proc/is_broken() @@ -125,13 +125,16 @@ blood_DNA = list(dna.unique_enzymes = dna.b_type) set_species(dna.species) -/obj/item/organ/proc/set_bodytype(decl/bodytype/new_bodytype, override_material = null) +/obj/item/organ/proc/set_bodytype(decl/bodytype/new_bodytype, override_material = null, apply_to_internal_organs = TRUE) + SHOULD_CALL_PARENT(TRUE) if(isnull(new_bodytype)) - CRASH("Null bodytype passed to set_bodytype!") + PRINT_STACK_TRACE("Null bodytype passed to set_bodytype!") + return FALSE if(ispath(new_bodytype, /decl/bodytype)) new_bodytype = GET_DECL(new_bodytype) if(!istype(new_bodytype)) - CRASH("Invalid bodytype [new_bodytype]") + PRINT_STACK_TRACE("Invalid bodytype [new_bodytype]") + return FALSE bodytype = new_bodytype if(bodytype.modifier_string) name = "[bodytype.modifier_string] [initial(name)]" @@ -141,7 +144,7 @@ min_broken_damage *= bodytype.hardiness bodytype.resize_organ(src) set_material(override_material || bodytype.material) - matter = bodytype.matter + matter = bodytype.matter?.Copy() create_matter() // maybe this should be a generalized repopulate_reagents helper?? if(reagents) @@ -150,6 +153,7 @@ if(bodytype.body_flags & BODY_FLAG_NO_DNA) QDEL_NULL(dna) reset_status() + return TRUE /obj/item/organ/proc/set_species(specie_name) vital_to_owner = null // This generally indicates the owner mob is having species set, and this value may be invalidated. @@ -198,7 +202,7 @@ //dead already, no need for more processing if(status & ORGAN_DEAD) return - // Don't process if we're in a freezer, an MMI or a stasis bag.or a freezer or something I dunno + // Don't process if we're in a freezer, an interface or a stasis bag. if(is_preserved()) return //Process infections @@ -211,7 +215,7 @@ if(reagents.has_reagent(/decl/material/liquid/blood)) blood_splatter(get_turf(src), src, 1) reagents.remove_any(0.1) - if(config.organs_decay) + if(get_config_value(/decl/config/toggle/health_organs_decay)) take_general_damage(rand(1,3)) germ_level += rand(2,6) if(germ_level >= INFECTION_LEVEL_TWO) @@ -244,11 +248,18 @@ ailment.was_treated_by_chem_effect() /obj/item/organ/proc/is_preserved() - if(istype(loc,/obj/item/organ)) + if(istype(loc, /obj/item/organ)) var/obj/item/organ/O = loc return O.is_preserved() - else - return (istype(loc,/obj/item/mmi) || istype(loc,/obj/structure/closet/body_bag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer) || istype(loc,/obj/item/storage/box/freezer)) + var/static/list/preserved_types = list( + /obj/item/storage/box/freezer, + /obj/structure/closet/crate/freezer, + /obj/structure/closet/body_bag/cryobag + ) + for(var/preserved_type in preserved_types) + if(istype(loc, preserved_type)) + return TRUE + return FALSE /obj/item/organ/examine(mob/user) . = ..(user) @@ -258,6 +269,8 @@ if(status & ORGAN_DEAD) to_chat(user, "The decay has set into \the [src].") +// TODO: bodytemp rework that handles this with better respect to +// individual organs vs. expected body temperature for other organs. /obj/item/organ/proc/handle_germ_effects() //** Handle the effects of infections var/germ_immunity = owner.get_immunity() //reduces the amount of times we need to call this proc @@ -275,7 +288,7 @@ germ_level += 10 if(germ_level >= INFECTION_LEVEL_ONE) - var/fever_temperature = (owner.get_temperature_threshold(HEAT_LEVEL_1) - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature + var/fever_temperature = (owner.get_mob_temperature_threshold(HEAT_LEVEL_1) - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature owner.bodytemperature += clamp(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature) if (germ_level >= INFECTION_LEVEL_TWO) @@ -361,6 +374,8 @@ /obj/item/organ/proc/heal_damage(amount) if(can_recover()) damage = clamp(0, damage - round(amount, 0.1), max_damage) + if(owner) + owner.update_health() /obj/item/organ/attack(var/mob/target, var/mob/user) if(BP_IS_PROSTHETIC(src) || !istype(target) || !istype(user) || (user != target && user.a_intent == I_HELP)) @@ -536,6 +551,8 @@ var/global/list/ailment_reference_cache = list() /obj/item/organ/proc/do_install(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected, var/in_place = FALSE, var/update_icon = TRUE, var/detached = FALSE) //Make sure to force the flag accordingly set_detached(detached) + if(QDELETED(src)) + return owner = target vital_to_owner = null @@ -571,7 +588,8 @@ var/global/list/ailment_reference_cache = list() else owner = null vital_to_owner = null - return src + if(!QDELETED(src)) + return src //Events handling for checks and effects that should happen when removing the organ through interactions. Called by the owner mob. /obj/item/organ/proc/on_remove_effects(var/mob/living/last_owner) diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/prosthetics/_prosthetics.dm index 1b742282f6f..916eb8ea492 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/prosthetics/_prosthetics.dm @@ -157,7 +157,7 @@ visible_message( SPAN_NOTICE("\The [src] attaches \the [E] to [G.his] body!"), SPAN_NOTICE("You attach \the [E] to your body!")) - refresh_visible_overlays() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance. + try_refresh_visible_overlays() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance. return TRUE /mob/living/carbon/human/proc/detach_limb_verb() diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index b91d7da5b10..588098e60f6 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -2,16 +2,45 @@ abstract_type = /decl/bodytype/prosthetic icon_base = 'icons/mob/human_races/cyberlimbs/robotic.dmi' desc = "A generic unbranded robotic prosthesis." - limb_tech = "{'engineering':1,'materials':1,'magnets':1}" + limb_tech = @'{"engineering":1,"materials":1,"magnets":1}' modifier_string = "robotic" is_robotic = TRUE body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_EAT material = /decl/material/solid/metal/steel eye_flash_mod = 1 eye_darksight_range = 2 + associated_gender = PLURAL + bodyfall_sounds = list( + 'sound/foley/metal1.ogg' + ) + has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain_interface, + BP_EYES = /obj/item/organ/internal/eyes, + BP_CELL = /obj/item/organ/internal/cell + ) + cold_level_1 = SYNTH_COLD_LEVEL_1 + cold_level_2 = SYNTH_COLD_LEVEL_2 + cold_level_3 = SYNTH_COLD_LEVEL_3 + heat_level_1 = SYNTH_HEAT_LEVEL_1 + heat_level_2 = SYNTH_HEAT_LEVEL_2 + heat_level_3 = SYNTH_HEAT_LEVEL_3 + cold_discomfort_strings = null + heat_discomfort_level = 373.15 + heat_discomfort_strings = list( + "You are dangerously close to overheating!" + ) /// Determines which bodyparts can use this limb. var/list/applies_to_part +/decl/bodytype/prosthetic/get_user_species_for_validation() + if(bodytype_category) + for(var/species_name in get_all_species()) + var/decl/species/species = get_species_by_key(species_name) + for(var/decl/bodytype/bodytype_data in species.available_bodytypes) + if(bodytype_data.bodytype_category == bodytype_category) + return species_name + return ..() + /decl/bodytype/prosthetic/apply_bodytype_organ_modifications(obj/item/organ/org) ..() BP_SET_PROSTHETIC(org) diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm index 3a9be367c0c..c031736188c 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm @@ -13,6 +13,6 @@ is_robotic = FALSE modular_limb_tier = MODULAR_BODYPART_ANYWHERE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood DEFINE_ROBOLIMB_MODEL_ASPECTS(/decl/bodytype/prosthetic/wooden, pirate, 0) diff --git a/code/modules/overmap/contacts/_contacts.dm b/code/modules/overmap/contacts/_contacts.dm index 6caa410e957..600c081918d 100644 --- a/code/modules/overmap/contacts/_contacts.dm +++ b/code/modules/overmap/contacts/_contacts.dm @@ -88,7 +88,7 @@ pinged = TRUE show() animate(marker, alpha=255, 0.5 SECOND, 1, LINEAR_EASING) - addtimer(CALLBACK(src, .proc/unping), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(unping)), 1 SECOND) /datum/overmap_contact/proc/unping() animate(marker, alpha=75, 2 SECOND, 1, LINEAR_EASING) diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm index fc847367b5b..372c37b56c3 100644 --- a/code/modules/overmap/contacts/contact_sensors.dm +++ b/code/modules/overmap/contacts/contact_sensors.dm @@ -137,7 +137,7 @@ var/time_delay = max((SENSOR_TIME_DELAY * get_dist(linked, contact)),1) if(!record.pinged) - addtimer(CALLBACK(record, .proc/ping), time_delay) + addtimer(CALLBACK(record, PROC_REF(ping)), time_delay) /obj/machinery/computer/ship/sensors/attackby(var/obj/item/I, var/mob/user) . = ..() @@ -150,11 +150,11 @@ if(tracker in trackers) trackers -= tracker - events_repository.unregister(/decl/observ/destroyed, tracker, src, .proc/remove_tracker) + events_repository.unregister(/decl/observ/destroyed, tracker, src, PROC_REF(remove_tracker)) to_chat(user, SPAN_NOTICE("You unlink the tracker in \the [P]'s buffer from \the [src].")) return trackers += tracker - events_repository.register(/decl/observ/destroyed, tracker, src, .proc/remove_tracker) + events_repository.register(/decl/observ/destroyed, tracker, src, PROC_REF(remove_tracker)) to_chat(user, SPAN_NOTICE("You link the tracker in \the [P]'s buffer to \the [src].")) /obj/machinery/computer/ship/sensors/proc/remove_tracker(var/obj/item/ship_tracker/tracker) diff --git a/code/modules/overmap/contacts/tracker.dm b/code/modules/overmap/contacts/tracker.dm index c8009002396..feb89fe461f 100644 --- a/code/modules/overmap/contacts/tracker.dm +++ b/code/modules/overmap/contacts/tracker.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/ship_tracker.dmi' icon_state = "disabled" w_class = ITEM_SIZE_SMALL - - origin_tech = "{'magnets':3, 'programming':2}" + + origin_tech = @'{"magnets":3, "programming":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT) var/enabled = FALSE diff --git a/code/modules/overmap/disperser/disperser_charge.dm b/code/modules/overmap/disperser/disperser_charge.dm index 1833aadd73c..4ab02455666 100644 --- a/code/modules/overmap/disperser/disperser_charge.dm +++ b/code/modules/overmap/disperser/disperser_charge.dm @@ -2,7 +2,7 @@ name = "unknown disperser charge" desc = "A charge to power the obstruction field disperser with. It looks impossibly round and shiny. This charge does not have a defined purpose." icon_state = "slug" - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/overmap/disperser/disperser_circuit.dm b/code/modules/overmap/disperser/disperser_circuit.dm index f54bafa7a1f..16b2aa0bf9b 100644 --- a/code/modules/overmap/disperser/disperser_circuit.dm +++ b/code/modules/overmap/disperser/disperser_circuit.dm @@ -1,13 +1,13 @@ /obj/item/stock_parts/circuitboard/disperser name = "circuitboard (obstruction field disperser control)" build_path = /obj/machinery/computer/ship/disperser - origin_tech = "{'engineering':2,'combat':2,'wormholes':2}" + origin_tech = @'{"engineering":2,"combat":2,"wormholes":2}' /obj/item/stock_parts/circuitboard/disperserfront name = "circuitboard (obstruction field disperser beam generator)" build_path = /obj/machinery/disperser/front board_type = "machine" - origin_tech = "{'engineering':2,'combat':2,'wormholes':2}" + origin_tech = @'{"engineering":2,"combat":2,"wormholes":2}' req_components = list ( /obj/item/stock_parts/manipulator/pico = 5 ) @@ -16,7 +16,7 @@ name = "circuitboard (obstruction field disperser fusor)" build_path = /obj/machinery/disperser/middle board_type = "machine" - origin_tech = "{'engineering':2,'combat':2,'wormholes':2}" + origin_tech = @'{"engineering":2,"combat":2,"wormholes":2}' req_components = list ( /obj/item/stock_parts/subspace/crystal = 10 ) @@ -25,7 +25,7 @@ name = "circuitboard (obstruction field disperser material deconstructor)" build_path = /obj/machinery/disperser/back board_type = "machine" - origin_tech = "{'engineering':2,'combat':2,'wormholes':2}" + origin_tech = @'{"engineering":2,"combat":2,"wormholes":2}' req_components = list ( /obj/item/stock_parts/capacitor/super = 5 ) \ No newline at end of file diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm index 46166a2bdba..14105d9f912 100644 --- a/code/modules/overmap/disperser/disperser_console.dm +++ b/code/modules/overmap/disperser/disperser_console.dm @@ -54,9 +54,9 @@ middle = M back = B if(is_valid_setup()) - events_repository.register(/decl/observ/destroyed, F, src, .proc/release_links) - events_repository.register(/decl/observ/destroyed, M, src, .proc/release_links) - events_repository.register(/decl/observ/destroyed, B, src, .proc/release_links) + events_repository.register(/decl/observ/destroyed, F, src, PROC_REF(release_links)) + events_repository.register(/decl/observ/destroyed, M, src, PROC_REF(release_links)) + events_repository.register(/decl/observ/destroyed, B, src, PROC_REF(release_links)) return TRUE return FALSE @@ -68,9 +68,9 @@ return FALSE /obj/machinery/computer/ship/disperser/proc/release_links() - events_repository.unregister(/decl/observ/destroyed, front, src, .proc/release_links) - events_repository.unregister(/decl/observ/destroyed, middle, src, .proc/release_links) - events_repository.unregister(/decl/observ/destroyed, back, src, .proc/release_links) + events_repository.unregister(/decl/observ/destroyed, front, src, PROC_REF(release_links)) + events_repository.unregister(/decl/observ/destroyed, middle, src, PROC_REF(release_links)) + events_repository.unregister(/decl/observ/destroyed, back, src, PROC_REF(release_links)) front = null middle = null back = null diff --git a/code/modules/overmap/events/event.dm b/code/modules/overmap/events/event.dm index 64e0e449bdd..922924fdba5 100644 --- a/code/modules/overmap/events/event.dm +++ b/code/modules/overmap/events/event.dm @@ -126,13 +126,13 @@ if(!active_hazards.len) hazard_by_turf -= T - events_repository.unregister(/decl/observ/entered, T, src, .proc/on_turf_entered) - events_repository.unregister(/decl/observ/exited, T, src, .proc/on_turf_exited) + events_repository.unregister(/decl/observ/entered, T, src, PROC_REF(on_turf_entered)) + events_repository.unregister(/decl/observ/exited, T, src, PROC_REF(on_turf_exited)) else hazard_by_turf |= T hazard_by_turf[T] = active_hazards - events_repository.register(/decl/observ/entered, T, src, .proc/on_turf_entered) - events_repository.register(/decl/observ/exited, T, src, .proc/on_turf_exited) + events_repository.register(/decl/observ/entered, T, src, PROC_REF(on_turf_entered)) + events_repository.register(/decl/observ/exited, T, src, PROC_REF(on_turf_exited)) for(var/obj/effect/overmap/visitable/ship/ship in T) for(var/datum/event/E in ship_events[ship]) diff --git a/code/modules/overmap/ftl_shunt/computer.dm b/code/modules/overmap/ftl_shunt/computer.dm index 14bc2933ab0..e971f2d5a38 100644 --- a/code/modules/overmap/ftl_shunt/computer.dm +++ b/code/modules/overmap/ftl_shunt/computer.dm @@ -74,7 +74,7 @@ plot_delay_mult = 2 delay = clamp(((jump_dist * BASE_PLOT_TIME_PER_TILE) * plot_delay_mult),1, INFINITY) - jump_plot_timer = addtimer(CALLBACK(src, .proc/finish_plot, x, y), delay, TIMER_STOPPABLE) + jump_plot_timer = addtimer(CALLBACK(src, PROC_REF(finish_plot), x, y), delay, TIMER_STOPPABLE) plotting_jump = TRUE jump_plotted = FALSE return delay diff --git a/code/modules/overmap/ftl_shunt/core.dm b/code/modules/overmap/ftl_shunt/core.dm index e9bd63a5e8d..c9ae2ac1b46 100644 --- a/code/modules/overmap/ftl_shunt/core.dm +++ b/code/modules/overmap/ftl_shunt/core.dm @@ -234,7 +234,7 @@ update_icon() if(check_charge()) - jump_timer = addtimer(CALLBACK(src, .proc/execute_shunt), jump_delay, TIMER_STOPPABLE) + jump_timer = addtimer(CALLBACK(src, PROC_REF(execute_shunt)), jump_delay, TIMER_STOPPABLE) return FTL_START_CONFIRMED /obj/machinery/ftl_shunt/core/proc/calculate_jump_requirements() @@ -270,7 +270,7 @@ return if(use_fuel(required_fuel_joules)) - jump_timer = addtimer(CALLBACK(src, .proc/execute_shunt), jump_delay, TIMER_STOPPABLE) + jump_timer = addtimer(CALLBACK(src, PROC_REF(execute_shunt)), jump_delay, TIMER_STOPPABLE) else cancel_shunt() return //If for some reason we don't have fuel now, just return. @@ -281,7 +281,7 @@ var/jumpdist = get_dist(get_turf(ftl_computer.linked), destination) var/obj/effect/portal/wormhole/W = new(destination) //Generate a wormhole effect on overmap to give some indication that something is about to happen. QDEL_IN(W, 6 SECONDS) - addtimer(CALLBACK(src, .proc/do_shunt, shunt_x, shunt_y, jumpdist, destination), 6 SECONDS) + addtimer(CALLBACK(src, PROC_REF(do_shunt), shunt_x, shunt_y, jumpdist, destination), 6 SECONDS) jumping = TRUE update_icon() for(var/mob/living/carbon/M in global.living_mob_list_) @@ -646,13 +646,13 @@ name = "circuit board (superluminal shunt)" board_type = "machine" build_path = /obj/machinery/ftl_shunt/core - origin_tech = "{'programming':3,'magnets':5,'materials':5,'wormholes':5}" + origin_tech = @'{"programming":3,"magnets":5,"materials":5,"wormholes":5}' additional_spawn_components = list(/obj/item/stock_parts/power/terminal = 1) /obj/item/stock_parts/ftl_core name = "exotic matter bridge" desc = "The beating heart of a superluminal shunt - without this, the power to manipulate space-time is out of reach." - origin_tech = "{'programming':3,'magnets':5,'materials':5,'wormholes':5}" + origin_tech = @'{"programming":3,"magnets":5,"materials":5,"wormholes":5}' icon = 'icons/obj/items/stock_parts/stock_parts.dmi' icon_state = "smes_coil" color = COLOR_YELLOW diff --git a/code/modules/overmap/internet/internet_circuitboards.dm b/code/modules/overmap/internet/internet_circuitboards.dm index 5649be365d9..3e865580bda 100644 --- a/code/modules/overmap/internet/internet_circuitboards.dm +++ b/code/modules/overmap/internet/internet_circuitboards.dm @@ -2,7 +2,7 @@ name = "circuitboard (PLEXUS uplink)" board_type = "machine" build_path = /obj/machinery/internet_uplink - origin_tech = "{'magnets':4,'wormholes':3,'powerstorage':3,'engineering':3}" + origin_tech = @'{"magnets":4,"wormholes":3,"powerstorage":3,"engineering":3}' req_components = list( /obj/item/stock_parts/capacitor = 2, /obj/item/stock_parts/micro_laser = 2, @@ -13,13 +13,13 @@ /obj/item/stock_parts/circuitboard/internet_uplink_computer name = "circuitboard (PLEXUS uplink controller)" build_path = /obj/machinery/computer/internet_uplink - origin_tech = "{'programming':2,'engineering':2}" + origin_tech = @'{"programming":2,"engineering":2}' /obj/item/stock_parts/circuitboard/internet_repeater name = "circuitboard (PLEXUS repeater)" build_path = /obj/machinery/internet_repeater board_type = "machine" - origin_tech = "{'magnets':3,'engineering':2,'programming':2}" + origin_tech = @'{"magnets":3,"engineering":2,"programming":2}' req_components = list( /obj/item/stock_parts/subspace/filter = 1, /obj/item/stock_parts/capacitor = 2, diff --git a/code/modules/overmap/overmap_object.dm b/code/modules/overmap/overmap_object.dm index b05f4debea2..c186fb99187 100644 --- a/code/modules/overmap/overmap_object.dm +++ b/code/modules/overmap/overmap_object.dm @@ -54,7 +54,7 @@ var/global/list/overmap_unknown_ids = list() return INITIALIZE_HINT_QDEL if(requires_contact) - invisibility = INVISIBILITY_OVERMAP // Effects that require identification have their images cast to the client via sensors. + set_invisibility(INVISIBILITY_OVERMAP) // Effects that require identification have their images cast to the client via sensors. if(scannable) unknown_id = "[pick(global.phonetic_alphabet)]-[random_id(/obj/effect/overmap, 100, 999)]" @@ -64,16 +64,20 @@ var/global/list/overmap_unknown_ids = list() add_filter("glow", 1, list("drop_shadow", color = color + "F0", size = 2, offset = 1,x = 0, y = 0)) update_icon() -/obj/effect/overmap/Crossed(var/obj/effect/overmap/visitable/other) - if(istype(other)) - for(var/obj/effect/overmap/visitable/O in loc) - SSskybox.rebuild_skyboxes(O.map_z) +/obj/effect/overmap/Crossed(atom/movable/AM) + var/obj/effect/overmap/visitable/other = AM + if(!istype(other)) + return + for(var/obj/effect/overmap/visitable/O in loc) + SSskybox.rebuild_skyboxes(O.map_z) -/obj/effect/overmap/Uncrossed(var/obj/effect/overmap/visitable/other) - if(istype(other)) - SSskybox.rebuild_skyboxes(other.map_z) - for(var/obj/effect/overmap/visitable/O in loc) - SSskybox.rebuild_skyboxes(O.map_z) +/obj/effect/overmap/Uncrossed(atom/movable/AM) + var/obj/effect/overmap/visitable/other = AM + if(!istype(other)) + return + SSskybox.rebuild_skyboxes(other.map_z) + for(var/obj/effect/overmap/visitable/O in loc) + SSskybox.rebuild_skyboxes(O.map_z) /obj/effect/overmap/on_update_icon() . = ..() diff --git a/code/modules/overmap/radio_beacon.dm b/code/modules/overmap/radio_beacon.dm index 4d35f60124f..4d6f541b3f7 100644 --- a/code/modules/overmap/radio_beacon.dm +++ b/code/modules/overmap/radio_beacon.dm @@ -13,8 +13,8 @@

    ---END OF TRANSMISSION---" /obj/effect/overmap/radio/proc/set_origin(obj/effect/overmap/origin) - events_repository.register(/decl/observ/moved, origin, src, /obj/effect/overmap/radio/proc/follow) - events_repository.register(/decl/observ/destroyed, origin, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/moved, origin, src, TYPE_PROC_REF(/obj/effect/overmap/radio, follow)) + events_repository.register(/decl/observ/destroyed, origin, src, TYPE_PROC_REF(/datum, qdel_self)) forceMove(origin.loc) source = origin pixel_x = -(origin.bound_width - 6) @@ -35,7 +35,7 @@ icon = 'icons/obj/items/device/radio/beacon.dmi' icon_state = "beacon" - origin_tech = "{'magnets':2, 'programming':2}" + origin_tech = @'{"magnets":2, "programming":2}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/overmap/ships/circuits.dm b/code/modules/overmap/ships/circuits.dm index bf196ca3792..3d729a46a55 100644 --- a/code/modules/overmap/ships/circuits.dm +++ b/code/modules/overmap/ships/circuits.dm @@ -2,7 +2,7 @@ name = "circuitboard (gas thruster)" icon = 'icons/obj/modules/module_controller.dmi' build_path = /obj/machinery/atmospherics/unary/engine - origin_tech = "{'powerstorage':1,'engineering':2}" + origin_tech = @'{"powerstorage":1,"engineering":2}' req_components = list( /obj/item/stack/cable_coil = 30, /obj/item/pipe = 2 @@ -17,7 +17,7 @@ name = "circuitboard (fusion thruster)" icon = 'icons/obj/modules/module_controller.dmi' build_path = /obj/machinery/atmospherics/unary/engine/fusion - origin_tech = "{'powerstorage':1,'engineering':2}" + origin_tech = @'{"powerstorage":1,"engineering":2}' req_components = list( /obj/item/stack/cable_coil = 30, /obj/item/pipe = 2 diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 6302e7926b7..cf103d9e075 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -317,7 +317,7 @@ var/global/list/overmap_helm_computers current_operator = weakref(current_operator_actual) linked.update_operator_skill(current_operator_actual) if (!autopilot && old_operator && viewing_overmap(old_operator)) - addtimer(CALLBACK(src, /obj/machinery/computer/ship/.proc/unlook, old_operator), 0) // Workaround for linter SHOULD_NOT_SLEEP checks. + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/computer/ship, unlook), old_operator), 0) // Workaround for linter SHOULD_NOT_SLEEP checks. log_debug("HELM CONTROL: [current_operator_actual ? current_operator_actual : "NO PILOT"] taking control of [src] from [old_operator ? old_operator : "NO PILOT"] in [get_area_name(src)]. [autopilot ? "(AUTOPILOT MODE)" : null]") diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm index c3837101c69..396a4fe2172 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -69,9 +69,9 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov for(var/obj/machinery/computer/ship/sensors/sensor in linked.get_linked_machines_of_type(/obj/machinery/computer/ship)) sensor.reveal_contacts(user) - events_repository.register(/decl/observ/moved, user, src, /obj/machinery/computer/ship/proc/unlook) + events_repository.register(/decl/observ/moved, user, src, TYPE_PROC_REF(/obj/machinery/computer/ship, unlook)) if(isliving(user)) - events_repository.register(/decl/observ/stat_set, user, src, /obj/machinery/computer/ship/proc/unlook) + events_repository.register(/decl/observ/stat_set, user, src, TYPE_PROC_REF(/obj/machinery/computer/ship, unlook)) LAZYDISTINCTADD(viewers, weakref(user)) if(linked) LAZYDISTINCTADD(linked.navigation_viewers, weakref(user)) @@ -84,9 +84,9 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov for(var/obj/machinery/computer/ship/sensors/sensor in linked.get_linked_machines_of_type(/obj/machinery/computer/ship)) sensor.hide_contacts(user) - events_repository.unregister(/decl/observ/moved, user, src, /obj/machinery/computer/ship/proc/unlook) + events_repository.unregister(/decl/observ/moved, user, src, TYPE_PROC_REF(/obj/machinery/computer/ship, unlook)) if(isliving(user)) - events_repository.unregister(/decl/observ/stat_set, user, src, /obj/machinery/computer/ship/proc/unlook) + events_repository.unregister(/decl/observ/stat_set, user, src, TYPE_PROC_REF(/obj/machinery/computer/ship, unlook)) LAZYREMOVE(viewers, weakref(user)) if(linked) LAZYREMOVE(linked.navigation_viewers, weakref(user)) diff --git a/code/modules/overmap/ships/device_types/fusion_thruster.dm b/code/modules/overmap/ships/device_types/fusion_thruster.dm index 56b7ef76bb8..e2a16504901 100644 --- a/code/modules/overmap/ships/device_types/fusion_thruster.dm +++ b/code/modules/overmap/ships/device_types/fusion_thruster.dm @@ -4,11 +4,12 @@ /datum/extension/ship_engine/gas/fusion/get_propellant(var/sample_only = TRUE) var/obj/machinery/atmospherics/unary/engine/fusion/thruster = holder - if(!thruster.harvest_from || !thruster.harvest_from.owned_field) + if(!istype(thruster) || !thruster.harvest_from?.owned_field) return // No valid propellant. var/datum/gas_mixture/propellant = ..() - propellant.temperature += log(100, (thruster.harvest_from.owned_field.plasma_temperature * efficiency)) - return propellant + if(propellant) + propellant.temperature += log(100, (thruster.harvest_from.owned_field.plasma_temperature * efficiency)) + . = propellant /datum/extension/ship_engine/gas/fusion/has_fuel() . = ..() diff --git a/code/modules/overmap/ships/device_types/gas_thruster.dm b/code/modules/overmap/ships/device_types/gas_thruster.dm index 1568f527fe6..b2fcd871177 100644 --- a/code/modules/overmap/ships/device_types/gas_thruster.dm +++ b/code/modules/overmap/ships/device_types/gas_thruster.dm @@ -29,13 +29,14 @@ /datum/extension/ship_engine/gas/proc/get_propellant(var/sample_only = TRUE, var/partial = 1) var/obj/machinery/atmospherics/unary/engine/E = holder - var/datum/gas_mixture/removed = E.air_contents.remove_ratio((volume_per_burn * thrust_limit * partial) / E.air_contents.volume) - if(sample_only) - var/datum/gas_mixture/sample = new(removed.volume) - sample.copy_from(removed) - E.air_contents.merge(removed) - return sample - return removed + if(istype(E) && E.air_contents?.volume > 0) + var/datum/gas_mixture/removed = E.air_contents.remove_ratio((volume_per_burn * thrust_limit * partial) / E.air_contents.volume) + if(removed && sample_only) + var/datum/gas_mixture/sample = new(removed.volume) + sample.copy_from(removed) + E.air_contents.merge(removed) + return sample + . = removed /datum/extension/ship_engine/gas/get_exhaust_velocity(var/datum/gas_mixture/propellant) if(!is_on() || !has_fuel()) diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index 771cd6ed2a5..2948c418427 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -122,7 +122,7 @@ visitor_dir = turn(visitor_dir, 90) // Configure shuttle datum - events_repository.register(/decl/observ/shuttle_moved, shuttle_datum, src, .proc/on_shuttle_jump) + events_repository.register(/decl/observ/shuttle_moved, shuttle_datum, src, PROC_REF(on_shuttle_jump)) on_landing(landmark, shuttle_datum.current_location) // We "land" at round start to properly place ourselves on the overmap. if(landmark == shuttle_datum.current_location) status = SHIP_STATUS_OVERMAP // we spawned on the overmap, so have to initialize our state properly. @@ -161,7 +161,7 @@ core_landmark = master SetName(_name) landmark_tag = master.shuttle_name + _name - events_repository.register(/decl/observ/destroyed, master, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/destroyed, master, src, TYPE_PROC_REF(/datum, qdel_self)) . = ..() /obj/effect/shuttle_landmark/visiting_shuttle/Destroy() diff --git a/code/modules/overmap/ships/machines/ion_thruster.dm b/code/modules/overmap/ships/machines/ion_thruster.dm index 5ca69b414ed..63d98305036 100644 --- a/code/modules/overmap/ships/machines/ion_thruster.dm +++ b/code/modules/overmap/ships/machines/ion_thruster.dm @@ -83,7 +83,7 @@ board_type = "machine" icon = 'icons/obj/modules/module_controller.dmi' build_path = /obj/machinery/ion_thruster - origin_tech = "{'powerstorage':1,'engineering':2}" + origin_tech = @'{"powerstorage":1,"engineering":2}' req_components = list( /obj/item/stack/cable_coil = 2, /obj/item/stock_parts/matter_bin = 1, diff --git a/code/modules/overmap/ships/ship_physics.dm b/code/modules/overmap/ships/ship_physics.dm index 3b093cf3747..b315e744982 100644 --- a/code/modules/overmap/ships/ship_physics.dm +++ b/code/modules/overmap/ships/ship_physics.dm @@ -37,8 +37,14 @@ /obj/effect/overmap/visitable/ship/proc/recalculate_vessel_mass() var/list/zones = list() for(var/area/A in get_areas()) + + // Do not include space please + if(istype(A, world.area)) + continue + for(var/turf/T in A) - if(T.is_open()) + + if(!T.simulated || T.is_open()) continue . += DEFAULT_TURF_MASS diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm index 6c60ba8181d..2aaef59f4f4 100644 --- a/code/modules/overmap/spacetravel.dm +++ b/code/modules/overmap/spacetravel.dm @@ -1,7 +1,7 @@ //Space stragglers go here /obj/effect/overmap/visitable/sector/temporary name = "Deep Space" - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT sector_flags = OVERMAP_SECTOR_IN_SPACE /obj/effect/overmap/visitable/sector/temporary/Initialize(mapload, var/nx, var/ny, var/nz) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 792180f618a..48b9de4f5e7 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -10,7 +10,7 @@ throw_range = 10 slot_flags = SLOT_LOWER_BODY material_alteration = MAT_FLAG_ALTERATION_COLOR - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood drop_sound = 'sound/foley/tooldrop5.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -27,15 +27,6 @@ stored_pen = null return ..() -/obj/item/clipboard/handle_mouse_drop(atom/over, mob/user) - if(ishuman(user) && istype(over, /obj/screen/inventory)) - var/obj/screen/inventory/inv = over - add_fingerprint(user) - if(user.try_unequip(src)) - user.equip_to_slot_if_possible(src, inv.slot_id) - return TRUE - . = ..() - /obj/item/clipboard/examine(mob/user, distance, infix, suffix) . = ..() if(stored_pen) @@ -204,7 +195,7 @@ close_browser(user, initial(name)) /obj/item/clipboard/ebony - material = /decl/material/solid/wood/ebony + material = /decl/material/solid/organic/wood/ebony /obj/item/clipboard/steel material = /decl/material/solid/metal/steel @@ -216,4 +207,4 @@ material = /decl/material/solid/glass /obj/item/clipboard/plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 265e8da7beb..ea1eb67279d 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -14,7 +14,7 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to name = "circuitboard (fax machine)" build_path = /obj/machinery/faxmachine board_type = "machine" - origin_tech = "{'engineering':1, 'programming':1}" + origin_tech = @'{"engineering":1, "programming":1}' req_components = list( /obj/item/stock_parts/printer = 1, /obj/item/stock_parts/manipulator = 1, @@ -61,6 +61,7 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to density = TRUE idle_power_usage = 30 active_power_usage = 200 + base_type = /obj/machinery/faxmachine construct_state = /decl/machine_construction/default/panel_closed maximum_component_parts = list( /obj/item/stock_parts/item_holder/disk_reader = 1, @@ -115,18 +116,18 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to printer = get_component_of_type(/obj/item/stock_parts/printer) if(disk_reader) - disk_reader.register_on_insert(CALLBACK(src, /obj/machinery/faxmachine/proc/on_insert_disk)) - disk_reader.register_on_eject( CALLBACK(src, /obj/machinery/faxmachine/proc/update_ui)) + disk_reader.register_on_insert(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, on_insert_disk))) + disk_reader.register_on_eject( CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, update_ui))) if(card_reader) - card_reader.register_on_insert(CALLBACK(src, /obj/machinery/faxmachine/proc/on_insert_card)) - card_reader.register_on_eject( CALLBACK(src, /obj/machinery/faxmachine/proc/update_ui)) + card_reader.register_on_insert(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, on_insert_card))) + card_reader.register_on_eject( CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, update_ui))) if(printer) - printer.register_on_printed_page( CALLBACK(src, /obj/machinery/faxmachine/proc/on_printed_page)) - printer.register_on_finished_queue(CALLBACK(src, /obj/machinery/faxmachine/proc/on_queue_finished)) - printer.register_on_print_error( CALLBACK(src, /obj/machinery/faxmachine/proc/on_print_error)) - printer.register_on_status_changed(CALLBACK(src, /obj/machinery/faxmachine/proc/update_ui)) + printer.register_on_printed_page( CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, on_printed_page))) + printer.register_on_finished_queue(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, on_queue_finished))) + printer.register_on_print_error( CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, on_print_error))) + printer.register_on_status_changed(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/faxmachine, update_ui))) /obj/machinery/faxmachine/interface_interact(mob/user) ui_interact(user) @@ -430,6 +431,9 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to return FALSE use_power_oneoff(active_power_usage) + var/obj/item/card/id/ID = try_get_card() + ID = istype(ID)? ID : null + //Grab our network var/datum/extension/network_device/sender_dev = get_extension(src, /datum/extension/network_device) var/datum/computer_network/origin_network = sender_dev?.get_network() @@ -437,16 +441,6 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to to_chat(user, SPAN_WARNING("No network connection!")) return FALSE - if(!length(target_net_id)) - target_net_id = origin_network.network_id //Use the current network if none specified - - if((target_net_id != origin_network.network_id) && !sender_dev.has_internet_connection(origin_network)) - to_chat(user, SPAN_WARNING("No internet connection!")) - return FALSE - - var/obj/item/card/id/ID = try_get_card() - ID = istype(ID)? ID : null - //If sending to admins, don't try to get a target network or device var/target_URI = uppertext("[target_net_tag].[target_net_id]") var/list/target_admin_fax = LAZYACCESS(global.using_map.map_admin_faxes, target_URI) @@ -462,8 +456,8 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to else if(prob(1)) spark_at(src, 1) - .= send_fax_to_admin(user, scanner_item, target_URI, src) - log_history("Outgoing", "'[scanner_item]', from '[get_area(src)]'s [src]' @ '[sender_dev.get_network_URI()]' to [target_admin_fax["name"]]' @ '[target_URI]'.") + . = send_fax_to_admin(user, scanner_item, target_URI, src) + log_history("Outgoing", "'[scanner_item]', from '[get_area(src)]'s [src]' @ '[sender_dev?.get_network_URI() || "UNKNOWN SENDER"]' to [target_admin_fax["name"]]' @ '[target_URI]'.") update_ui() flick("faxsend", src) //#TODO: sync the animation, sound and message together when I got enough patience. @@ -472,6 +466,13 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to time_cooldown_end = world.timeofday + FAX_ADMIN_COOLDOWN return TRUE + if(!length(target_net_id)) + target_net_id = origin_network.network_id //Use the current network if none specified + + if((target_net_id != origin_network.network_id) && !sender_dev.has_internet_connection(origin_network)) + to_chat(user, SPAN_WARNING("No internet connection!")) + return FALSE + var/datum/computer_network/target_net if(target_net_id != origin_network.network_id) target_net = origin_network.get_internet_connection(target_net_id) @@ -632,6 +633,8 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to if(user) to_chat(user, SPAN_WARNING("Please select a contact to remove!")) return FALSE + + var/remove_uri = LAZYACCESS(quick_dial, contact_name) LAZYREMOVE(quick_dial, contact_name) //Overwrite quick dial @@ -642,7 +645,7 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to D.write_file(datfile, FAX_QUICK_DIAL_FILE) if(user) - to_chat(user, SPAN_NOTICE("Successfully removed contact '[contact_name]' with URI '[LAZYACCESS(quick_dial, contact_name)]'!")) + to_chat(user, SPAN_NOTICE("Successfully removed contact '[contact_name]' with URI '[remove_uri]'!")) update_ui() return TRUE @@ -689,4 +692,20 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to #undef FAX_QUICK_DIAL_FILE #undef FAX_HISTORY_FILE #undef FAX_COOLDOWN -#undef FAX_ADMIN_COOLDOWN \ No newline at end of file +#undef FAX_ADMIN_COOLDOWN + +/obj/machinery/faxmachine/mapped/Initialize() + . = ..() + if(. != INITIALIZE_HINT_QDEL) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/faxmachine/mapped/LateInitialize() + ..() + // Pre-populate our admin targets. + if(!disk_reader) + CRASH("Missing disk reader from pre-mapped fax machine!") + if(!disk_reader.disk) + disk_reader.insert_item(new /obj/item/disk(disk_reader)) + for(var/uri in global.using_map.map_admin_faxes) + var/list/contact_info = global.using_map.map_admin_faxes[uri] + add_quick_dial_contact(contact_info["name"], uri) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 19b69dbe898..4e728b71bd9 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -9,7 +9,7 @@ material = /decl/material/solid/metal/steel density = TRUE anchored = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE obj_flags = OBJ_FLAG_ANCHORABLE tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT var/tmp/list/can_hold = list( @@ -70,7 +70,7 @@ desc = "A filing cabinet installed into a cavity in the wall to save space. Wow!" icon_state = "wallcabinet" obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' /obj/structure/filing_cabinet/tall icon_state = "tallcabinet" diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index cd33ee78f43..392d25940da 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -10,7 +10,7 @@ throwforce = 0 drop_sound = 'sound/foley/paperpickup1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard item_flags = ITEM_FLAG_CAN_TAPE /obj/item/folder/blue diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 605a5c0b37e..12a71b32301 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -16,7 +16,7 @@ name = "hand labeler" icon = 'icons/obj/items/hand_labeler.dmi' icon_state = ICON_STATE_WORLD - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic w_class = ITEM_SIZE_SMALL item_flags = ITEM_FLAG_NO_BLUDGEON matter = list( @@ -156,8 +156,8 @@ to_chat(user, SPAN_WARNING("\The [P] is not blank. You can't use that for refilling \the [src].")) return - var/incoming_amt = LAZYACCESS(P.matter, /decl/material/solid/paper) - var/current_amt = LAZYACCESS(matter, /decl/material/solid/paper) + var/incoming_amt = LAZYACCESS(P.matter, /decl/material/solid/organic/paper) + var/current_amt = LAZYACCESS(matter, /decl/material/solid/organic/paper) var/label_added = incoming_amt / LABEL_MATERIAL_COST if(incoming_amt < LABEL_MATERIAL_COST) @@ -236,7 +236,7 @@ . = ..() //Dump label paper left if(labels_left > 0) - var/decl/material/M = GET_DECL(/decl/material/solid/paper) + var/decl/material/M = GET_DECL(/decl/material/solid/organic/paper) var/turf/T = get_turf(src) var/total_sheets = round((labels_left * LABEL_MATERIAL_COST) / SHEET_MATERIAL_AMOUNT) var/leftovers = round((labels_left * LABEL_MATERIAL_COST) % SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index a4b06ff6cc9..9bb9e14bf74 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -19,7 +19,7 @@ throw_speed = 1 w_class = ITEM_SIZE_TINY attack_verb = list("bapped") - material = /decl/material/solid/paper + material = /decl/material/solid/organic/paper drop_sound = 'sound/foley/paperpickup1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' item_flags = ITEM_FLAG_CAN_TAPE @@ -150,25 +150,32 @@ /obj/item/paper/attack(mob/living/carbon/M, mob/living/carbon/user) if(user.get_target_zone() == BP_EYES) - user.visible_message(SPAN_NOTICE("You show the paper to [M]."), \ - SPAN_NOTICE("[user] holds up a paper and shows it to [M].")) + user.visible_message( + SPAN_NOTICE("You show the paper to [M]."), + SPAN_NOTICE("[user] holds up a paper and shows it to [M].") + ) M.examinate(src) + return TRUE - else if(user.get_target_zone() == BP_MOUTH) // lipstick wiping - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H == user) - to_chat(user, SPAN_NOTICE("You wipe off the lipstick with [src].")) - H.lip_style = null - H.update_body() - else - user.visible_message(SPAN_WARNING("[user] begins to wipe [H]'s lipstick off with \the [src]."), \ - SPAN_NOTICE("You begin to wipe off [H]'s lipstick.")) - if(do_after(user, 10, H) && do_after(H, 10, check_holding = 0)) //user needs to keep their active hand, H does not. - user.visible_message(SPAN_NOTICE("[user] wipes [H]'s lipstick off with \the [src]."), \ - SPAN_NOTICE("You wipe off [H]'s lipstick.")) - H.lip_style = null - H.update_body() + if(user.get_target_zone() == BP_MOUTH && M.get_lip_colour()) + var/mob/living/carbon/human/H = M + if(H == user) + to_chat(user, SPAN_NOTICE("You wipe off the lipstick with [src].")) + H.set_lip_colour() + return TRUE + user.visible_message( + SPAN_NOTICE("\The [user] begins to wipe \the [H]'s lipstick off with \the [src]."), + SPAN_NOTICE("You begin to wipe off [H]'s lipstick.") + ) + if(do_after(user, 10, H) && do_after(H, 10, check_holding = 0)) //user needs to keep their active hand, H does not. + user.visible_message( + SPAN_NOTICE("\The [user] wipes \the [H]'s lipstick off with \the [src]."), + SPAN_NOTICE("You wipe off \the [H]'s lipstick.") + ) + H.set_lip_colour() + return TRUE + + . = ..() /obj/item/paper/proc/addtofield(var/id, var/text, var/links = 0) var/locid = 0 diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index c566744aa62..5f10c344837 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -24,16 +24,6 @@ var/tmp/cur_page = 1 // current page var/tmp/max_pages = 100 //Maximum number of papers that can be in the bundle var/list/pages // Ordered list of pages as they are to be displayed. Can be different order than src.contents. - var/static/list/cached_overlays //Cached images used by all paper bundles for generating the overlays and underlays - -/**Creates frequently used images globally, so we can re-use them. */ -/obj/item/paper_bundle/proc/cache_overlays() - if(LAZYLEN(cached_overlays)) - return - LAZYSET(cached_overlays, "clip", image('icons/obj/bureaucracy.dmi', "clip")) - LAZYSET(cached_overlays, "paper", image('icons/obj/bureaucracy.dmi', "paper")) - LAZYSET(cached_overlays, "photo", image('icons/obj/bureaucracy.dmi', "photo")) - LAZYSET(cached_overlays, "refill", image('icons/obj/bureaucracy.dmi', "paper_refill_label")) /obj/item/paper_bundle/Destroy() LAZYCLEARLIST(pages) //Get rid of refs @@ -192,7 +182,7 @@ user.visible_message( \ "\The [user] holds \the [P] up to \the [src]. It looks like [G.he] [G.is] trying to burn it!", \ "You hold \the [P] up to \the [src], burning it slowly.") - addtimer(CALLBACK(src, .proc/burn_callback, P, user, span_class), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(burn_callback), P, user, span_class), 2 SECONDS) /obj/item/paper_bundle/examine(mob/user, distance) . = ..() @@ -306,14 +296,13 @@ /obj/item/paper_bundle/on_update_icon() . = ..() - if(!LAZYLEN(cached_overlays)) - cache_overlays() - underlays.Cut() + underlays.Cut() var/obj/item/paper/P = pages[1] icon = P.icon icon_state = P.icon_state - copy_overlays(P.overlays) + + copy_overlays(P) var/paper_count = 0 var/photo_count = 0 @@ -321,7 +310,7 @@ for(var/obj/O in pages) if(istype(O, /obj/item/paper) && (paper_count < MAX_PAPER_UNDERLAYS)) //We can't even see them, so don't bother create appearences form each paper's icon, and use a generic one - var/mutable_appearance/img = new(cached_overlays["paper"]) + var/mutable_appearance/img = mutable_appearance('icons/obj/bureaucracy.dmi', "paper") img.color = O.color img.pixel_x -= min(paper_count, 2) img.pixel_y -= min(paper_count, 2) @@ -336,7 +325,7 @@ if(photo_count < 1) add_overlay(Ph.tiny) else - add_overlay(cached_overlays["photo"]) //We can't even see them, so don't bother create new unique appearences + add_overlay("photo") //We can't even see them, so don't bother create new unique appearences photo_count++ //Break if we have nothing else to do @@ -353,7 +342,7 @@ else if(photo_count > 0) desc += "\nThere is a photo attached to it." - add_overlay(cached_overlays["clip"]) + add_overlay("clip") /** * Merge another bundle or paper into us. @@ -518,7 +507,7 @@ /obj/item/paper_bundle/refill/on_update_icon() . = ..() - add_overlay(cached_overlays["refill"]) + add_overlay("refill") /////////////////////////////////////////////////////////////////////////// // Interaction Rename diff --git a/code/modules/paperwork/paper_plane.dm b/code/modules/paperwork/paper_plane.dm index 91989d9a15f..18d0a6664a1 100644 --- a/code/modules/paperwork/paper_plane.dm +++ b/code/modules/paperwork/paper_plane.dm @@ -15,7 +15,7 @@ w_class = ITEM_SIZE_TINY item_flags = ITEM_FLAG_CAN_TAPE attack_verb = list("stabbed", "pricked") - material = /decl/material/solid/paper + material = /decl/material/solid/organic/paper var/obj/item/paper/my_paper //The sheet of paper this paper_plane is made of /obj/item/paper_plane/proc/set_paper(var/obj/item/paper/_paper) diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index 726fe028f17..3df1a1b80ef 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -9,7 +9,7 @@ icon_state = "pad_full" item_state = "paper" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/paper + material = /decl/material/solid/organic/paper var/papers = 50 var/tmp/max_papers = 50 var/paper_type = /obj/item/paper/sticky @@ -21,7 +21,7 @@ /obj/item/sticky_pad/proc/update_matter() matter = list( - /decl/material/solid/paper = round((papers * SHEET_MATERIAL_AMOUNT) * 0.2) + /decl/material/solid/organic/paper = round((papers * SHEET_MATERIAL_AMOUNT) * 0.2) ) /obj/item/sticky_pad/create_matter() @@ -97,7 +97,7 @@ /obj/item/paper/sticky/Initialize() . = ..() - events_repository.register(/decl/observ/moved, src, src, /obj/item/paper/sticky/proc/reset_persistence_tracking) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/item/paper/sticky, reset_persistence_tracking)) /obj/item/paper/sticky/proc/reset_persistence_tracking() SSpersistence.forget_value(src, /decl/persistence_handler/paper/sticky) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 2ebba0789c7..97f80cf22dd 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -12,7 +12,7 @@ w_class = ITEM_SIZE_NORMAL throw_speed = 3 throw_range = 7 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/amount = 30 //How much paper is in the bin. var/tmp/max_amount = 30 //How much paper fits in the bin var/list/papers //List of papers put in the bin for reference. @@ -21,7 +21,7 @@ LAZYCLEARLIST(papers) //Gets rid of any refs return ..() -/obj/item/paper_bin/handle_mouse_drop(atom/over, mob/user) +/obj/item/paper_bin/handle_mouse_drop(atom/over, mob/user, params) if((loc == user || in_range(src, user)) && user.get_empty_hand_slot()) user.put_in_hands(src) return TRUE diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 1f207c28fe7..d71d22b1c96 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -8,7 +8,7 @@ icon_state = "papershredder0" density = TRUE anchored = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE obj_flags = OBJ_FLAG_ANCHORABLE idle_power_usage = 0 stat_immune = NOSCREEN | NOINPUT @@ -16,7 +16,7 @@ construct_state = /decl/machine_construction/default/panel_closed required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES uncreated_component_parts = list( - /obj/item/stock_parts/power/apc = 1, + /obj/item/stock_parts/power/apc = 1 ) var/list/shredder_bin //List of shreded material type to matter amount var/cached_total_matter = 0 //Total of all the matter units we put in the shredder so far @@ -211,7 +211,7 @@ throw_speed = 2 throwforce = 0 w_class = ITEM_SIZE_TINY - material = /decl/material/solid/paper + material = /decl/material/solid/organic/paper material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME /obj/item/shreddedp/get_matter_amount_modifier() @@ -229,7 +229,7 @@ return ..() /obj/item/shreddedp/proc/burnpaper(var/obj/item/flame/lighter/P, var/mob/user) - if(!CanPhysicallyInteractWith(user, src) && material?.fuel_value) + if(!CanPhysicallyInteractWith(user, src) || material?.accelerant_value <= FUEL_VALUE_NONE) return if(!P.lit) to_chat(user, SPAN_WARNING("\The [P] is not lit.")) @@ -247,5 +247,6 @@ fire_act() /obj/item/shreddedp/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + SHOULD_CALL_PARENT(FALSE) new /obj/effect/decal/cleanable/ash(get_turf(src)) physically_destroyed() diff --git a/code/modules/paperwork/pen/crayon.dm b/code/modules/paperwork/pen/crayon.dm index 64cd4b94c2a..de44fe206df 100644 --- a/code/modules/paperwork/pen/crayon.dm +++ b/code/modules/paperwork/pen/crayon.dm @@ -11,7 +11,9 @@ pen_quality = TOOL_QUALITY_BAD //Writing with those things is awkward max_uses = 30 pen_font = PEN_FONT_CRAYON + material = /decl/material/solid/organic/wax var/shade_colour = "#220000" //RGB + var/pigment_type = /decl/material/liquid/pigment /obj/item/pen/crayon/make_pen_description() desc = "A colourful [stroke_colour_name] [istype(material)?"[material.name] ":null][medium_name]. Please refrain from eating it or putting it in your nose." @@ -45,54 +47,47 @@ target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. return -/obj/item/pen/crayon/attack(mob/living/M, mob/user) - if(istype(M) && M == user) - var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) - playsound(src, 'sound/weapons/bite.ogg', 40) - to_chat(M, SPAN_NOTICE("You take a bite of the crayon and swallow it.")) - M.adjust_nutrition(1) - var/uses = get_tool_property(TOOL_PEN, TOOL_PROP_USES) - M.reagents.add_reagent(/decl/material/liquid/pigment, min(5,uses)/3) - if(parch.decrement_uses(user, src, 5) <= 0) - to_chat(M, SPAN_WARNING("You ate your crayon!")) - return - . = ..() - /obj/item/pen/crayon/red icon_state = "crayonred" stroke_colour = "#da0000" shade_colour = "#810c0c" stroke_colour_name = "red" + pigment_type = /decl/material/liquid/pigment/red /obj/item/pen/crayon/orange icon_state = "crayonorange" stroke_colour = "#ff9300" stroke_colour_name = "orange" shade_colour = "#a55403" + pigment_type = /decl/material/liquid/pigment/orange /obj/item/pen/crayon/yellow icon_state = "crayonyellow" stroke_colour = "#fff200" shade_colour = "#886422" stroke_colour_name = "yellow" + pigment_type = /decl/material/liquid/pigment/yellow /obj/item/pen/crayon/green icon_state = "crayongreen" stroke_colour = "#a8e61d" shade_colour = "#61840f" stroke_colour_name = "green" + pigment_type = /decl/material/liquid/pigment/green /obj/item/pen/crayon/blue icon_state = "crayonblue" stroke_colour = "#00b7ef" shade_colour = "#0082a8" stroke_colour_name = "blue" + pigment_type = /decl/material/liquid/pigment/blue /obj/item/pen/crayon/purple icon_state = "crayonpurple" stroke_colour = "#da00ff" shade_colour = "#810cff" stroke_colour_name = "purple" + pigment_type = /decl/material/liquid/pigment/purple /obj/item/pen/crayon/mime icon_state = "crayonmime" @@ -100,6 +95,7 @@ shade_colour = "#000000" stroke_colour_name = "mime" max_uses = -1 //Infinite + pigment_type = null /obj/item/pen/crayon/mime/make_pen_description() desc = "A very sad-looking crayon." @@ -119,6 +115,7 @@ shade_colour = "#000fff" stroke_colour_name = "rainbow" max_uses = -1 + pigment_type = null /obj/item/pen/crayon/rainbow/make_pen_description() desc = "A very colourful [istype(material)?"[material.name] ":null][medium_name]. Please refrain from eating it or putting it in your nose." diff --git a/code/modules/paperwork/pen/crayon_edibility.dm b/code/modules/paperwork/pen/crayon_edibility.dm new file mode 100644 index 00000000000..ba7666f17e4 --- /dev/null +++ b/code/modules/paperwork/pen/crayon_edibility.dm @@ -0,0 +1,21 @@ +/obj/item/pen/crayon/transfer_eaten_material(mob/eater, amount) + var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) + parch.decrement_uses(eater, src, amount, destroy_on_zero = FALSE) // we'll qdel in food code if we eat the end of the crayon + if(!isliving(eater)) + return + var/mob/living/living_eater = eater + var/datum/reagents/eater_ingested = living_eater.get_ingested_reagents() + if(!eater_ingested) + return + if(pigment_type) + var/partial_amount = CEILING(amount * 0.4) + eater_ingested.add_reagent(pigment_type, partial_amount) + eater_ingested.add_reagent(/decl/material/solid/organic/wax, amount - partial_amount) + else + eater_ingested.add_reagent(/decl/material/solid/organic/wax, amount) + +/obj/item/pen/crayon/get_edible_material_amount(mob/eater) + return max(0, get_tool_property(TOOL_PEN, TOOL_PROP_USES)) + +/obj/item/pen/crayon/get_food_default_transfer_amount(mob/eater) + return eater?.get_eaten_transfer_amount(5) diff --git a/code/modules/paperwork/pen/fancy.dm b/code/modules/paperwork/pen/fancy.dm index 46a46f394e2..0bb353669e2 100644 --- a/code/modules/paperwork/pen/fancy.dm +++ b/code/modules/paperwork/pen/fancy.dm @@ -16,7 +16,7 @@ name = "dire goose quill" icon = 'icons/obj/items/pens/pen_quill.dmi' sharp = 0 - material = /decl/material/solid/skin/feathers + material = /decl/material/solid/organic/skin/feathers pen_quality = TOOL_QUALITY_BEST /obj/item/pen/fancy/quill/make_pen_description() diff --git a/code/modules/paperwork/pen/pen.dm b/code/modules/paperwork/pen/pen.dm index 9458c93c3d7..a40e12ea42e 100644 --- a/code/modules/paperwork/pen/pen.dm +++ b/code/modules/paperwork/pen/pen.dm @@ -8,7 +8,7 @@ throwforce = 0 throw_speed = 7 throw_range = 15 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/pen_flag = PEN_FLAG_ACTIVE //Properties/state of the pen used. var/stroke_colour = "black" //What colour the ink is! Can be hexadecimal colour or a colour name string. var/stroke_colour_name = "black" //Human readable name of the stroke colour. Used in text strings, and to identify the nearest colour to the stroke colour. @@ -22,7 +22,7 @@ . = ..() set_extension(src, /datum/extension/tool, list( - TOOL_DRILL = TOOL_QUALITY_WORST, + TOOL_SURGICAL_DRILL = TOOL_QUALITY_WORST, TOOL_PEN = pen_quality), list( @@ -35,20 +35,20 @@ make_pen_description() /obj/item/pen/attack(atom/A, mob/user, target_zone) - if(ismob(A)) - var/mob/M = A - if(ishuman(A) && user.a_intent == I_HELP && target_zone == BP_HEAD) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD, /obj/item/organ/external/head) - if(istype(head)) - head.write_on(user, "[stroke_colour_name] [medium_name]") - else - to_chat(user, SPAN_WARNING("You stab [M] with \the [src].")) - admin_attack_log(user, M, "Stabbed using \a [src]", "Was stabbed with \a [src]", "used \a [src] to stab") - else if(istype(A, /obj/item/organ/external/head)) + if(isliving(A) && user.a_intent == I_HELP && target_zone == BP_HEAD) + var/mob/living/M = A + var/obj/item/organ/external/head/head = M.get_organ(BP_HEAD, /obj/item/organ/external/head) + if(istype(head)) + head.write_on(user, "[stroke_colour_name] [medium_name]") + return TRUE + + if(istype(A, /obj/item/organ/external/head)) var/obj/item/organ/external/head/head = A head.write_on(user, "[stroke_colour_name] [medium_name]") + return TRUE + + return ..() /obj/item/pen/proc/toggle() if(pen_flag & PEN_FLAG_ACTIVE) diff --git a/code/modules/paperwork/pen/reagent_pen.dm b/code/modules/paperwork/pen/reagent_pen.dm index 1b531b72cce..3519a61b3c0 100644 --- a/code/modules/paperwork/pen/reagent_pen.dm +++ b/code/modules/paperwork/pen/reagent_pen.dm @@ -1,6 +1,6 @@ /obj/item/pen/reagent atom_flags = ATOM_FLAG_OPEN_CONTAINER - origin_tech = "{'materials':2,'esoteric':5}" + origin_tech = @'{"materials":2,"esoteric":5}' sharp = 1 pen_quality = TOOL_QUALITY_MEDIOCRE @@ -38,7 +38,7 @@ * Sleepy Pens */ /obj/item/pen/reagent/sleepy - origin_tech = "{'materials':2,'esoteric':5}" + origin_tech = @'{"materials":2,"esoteric":5}' /obj/item/pen/reagent/sleepy/make_pen_description() desc = "It's \a [stroke_colour_name] [medium_name] pen with a sharp point and a carefully engraved \"Waffle Co.\"." diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6c318baa347..01ffa0e2528 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -5,7 +5,7 @@ name = "circuitboard (photocopier)" build_path = /obj/machinery/photocopier board_type = "machine" - origin_tech = "{'engineering':1, 'programming':1}" + origin_tech = @'{"engineering":1, "programming":1}' req_components = list( /obj/item/stock_parts/printer/buildable = 1, /obj/item/stock_parts/manipulator = 2, @@ -28,7 +28,7 @@ density = TRUE idle_power_usage = 30 active_power_usage = 200 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE obj_flags = OBJ_FLAG_ANCHORABLE construct_state = /decl/machine_construction/default/panel_closed maximum_component_parts = list( @@ -60,10 +60,10 @@ printer = get_component_of_type(/obj/item/stock_parts/printer) //Cache the printer component if(printer) printer.show_queue_ctrl = FALSE //Make sure we don't let users mess with the print queue - printer.register_on_printed_page( CALLBACK(src, /obj/machinery/photocopier/proc/update_ui)) - printer.register_on_finished_queue(CALLBACK(src, /obj/machinery/photocopier/proc/update_ui)) - printer.register_on_print_error( CALLBACK(src, /obj/machinery/photocopier/proc/update_ui)) - printer.register_on_status_changed(CALLBACK(src, /obj/machinery/photocopier/proc/update_ui)) + printer.register_on_printed_page( CALLBACK(src, TYPE_PROC_REF(/obj/machinery/photocopier, update_ui))) + printer.register_on_finished_queue(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/photocopier, update_ui))) + printer.register_on_print_error( CALLBACK(src, TYPE_PROC_REF(/obj/machinery/photocopier, update_ui))) + printer.register_on_status_changed(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/photocopier, update_ui))) /obj/machinery/photocopier/on_update_icon() cut_overlays() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 4b273e23071..7641bf1ca10 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -18,7 +18,7 @@ w_class = ITEM_SIZE_TINY throwforce = 0 throw_range = 10 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/tmp/max_uses = 10 var/uses_left = 10 @@ -64,7 +64,7 @@ randpixel = 10 w_class = ITEM_SIZE_TINY item_flags = ITEM_FLAG_CAN_TAPE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/id //Unique id used to name the photo resource to upload to the client, and for synthetic photo synchronization var/icon/img //The actual real photo image var/image/tiny //A thumbnail of the image that's displayed on the actual world icon of the photo @@ -183,20 +183,13 @@ w_class = ITEM_SIZE_NORMAL //same as book storage_slots = DEFAULT_BOX_STORAGE //yes, that's storage_slots. Photos are w_class 1 so this has as many slots equal to the number of photos you could put in a box can_hold = list(/obj/item/photo) - material = /decl/material/solid/cardboard - -/obj/item/storage/photo_album/handle_mouse_drop(atom/over, mob/user) - if(istype(over, /obj/screen/inventory)) - var/obj/screen/inventory/inv = over - playsound(loc, "rustle", 50, 1, -5) - if(user.get_equipped_item(slot_back_str) == src) - add_fingerprint(user) - if(user.try_unequip(src)) - user.equip_to_slot_if_possible(src, inv.slot_id) - else if(over == user && in_range(src, user) || loc == user) - if(user.active_storage) - user.active_storage.close(user) - show_to(user) + material = /decl/material/solid/organic/plastic + +/obj/item/storage/photo_album/handle_mouse_drop(atom/over, mob/user, params) + if(over == user && in_range(src, user) || loc == user) + if(user.active_storage) + user.active_storage.close(user) + show_to(user) return TRUE . = ..() @@ -214,10 +207,14 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY material = /decl/material/solid/metal/aluminium - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) var/turned_on = TRUE - var/field_of_view = 3 //3 tiles - var/obj/item/camera_film/film //Currently loaded film + var/field_of_view = 3 // squared, so 3 is a 3x3 of tiles + var/obj/item/camera_film/film = new //Currently loaded film + +/obj/item/camera/loaded/Initialize() + film = new(src) + return ..() /obj/item/camera/Initialize() set_extension(src, /datum/extension/base_icon_state, icon_state) @@ -305,9 +302,9 @@ if(length(holding)) holding = "They are holding [english_list(holding)]" if(!mob_detail) - mob_detail = "You can see [A] on the photo[(A.health / A.maxHealth) < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + mob_detail = "You can see [A] on the photo[A.get_health_ratio() < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " else - mob_detail += "You can also see [A] on the photo[(A.health / A.maxHealth)< 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + mob_detail += "You can also see [A] on the photo[A.get_health_ratio() < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail /obj/item/camera/afterattack(atom/target, mob/user, flag) diff --git a/code/modules/paperwork/printer.dm b/code/modules/paperwork/printer.dm index d2be8b2b24b..83c8af53727 100644 --- a/code/modules/paperwork/printer.dm +++ b/code/modules/paperwork/printer.dm @@ -10,7 +10,7 @@ icon_state = "printer" randpixel = 5 w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY, /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, @@ -281,7 +281,19 @@ stop_printing_queue() return FALSE print_picture(queued_element) - else + else if(istype(queued_element, /obj/item/paper_bundle)) + var/obj/item/paper_bundle/bundle = queued_element + var/photo_count = 0 + for(var/obj/item/photo/picture in bundle.pages) + photo_count++ + if(!has_enough_to_print((TONER_USAGE_PAPER * (length(bundle.pages) - photo_count)) + (TONER_USAGE_PHOTO * photo_count))) + var/obj/machinery/M = loc + if(istype(M)) + M.state("Warning: Not enough paper or toner!") + stop_printing_queue() + return FALSE + print_paper_bundle(bundle) + else if(istype(queued_element, /obj/item/paper)) if(!has_enough_to_print(TONER_USAGE_PAPER)) var/obj/machinery/M = loc if(istype(M)) @@ -289,6 +301,8 @@ stop_printing_queue() return FALSE print_paper(queued_element) + else + PRINT_STACK_TRACE("A printer printed something that wasn't a paper, paper bundle, or photo: [queued_element] ([queued_element.type])") //#TODO: machinery should allow a component to trigger and wait for an animation sequence. So that we can drop out the paper in sync. queued_element.dropInto(get_turf(loc)) @@ -305,6 +319,14 @@ use_toner(TONER_USAGE_PHOTO, FALSE) //photos use a lot of ink! use_paper(1) + P.update_icon() + +/obj/item/stock_parts/printer/proc/print_paper_bundle(var/obj/item/paper_bundle/bundle) + for(var/obj/item/paper/page in bundle.pages) + print_paper(page) + for(var/obj/item/photo/picture in bundle.pages) + print_picture(picture) + bundle.update_icon() /obj/item/stock_parts/printer/proc/print_paper(var/obj/item/paper/P) //Apply a greyscale filter on all stamps overlays @@ -321,6 +343,7 @@ use_toner(TONER_USAGE_PAPER, FALSE) use_paper(1) + P.update_icon() // reapply stamp overlays /obj/item/stock_parts/printer/proc/use_toner(var/amount, var/update_parent = TRUE) if(!toner?.use_toner(amount)) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 4facd2232d6..62ca6dd1b30 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -10,7 +10,7 @@ throw_range = 15 material = /decl/material/solid/metal/steel matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, ) attack_verb = list("stamped") diff --git a/code/modules/paperwork/toner_cartridge.dm b/code/modules/paperwork/toner_cartridge.dm index 2d191cd6ed3..8550afbd739 100644 --- a/code/modules/paperwork/toner_cartridge.dm +++ b/code/modules/paperwork/toner_cartridge.dm @@ -11,7 +11,7 @@ throwforce = 3 force = 3 w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic volume = 60 amount_per_transfer_from_this = 30 possible_transfer_amounts = @"[30,60]" diff --git a/code/modules/persistence/noticeboards.dm b/code/modules/persistence/noticeboards.dm index 1b8c6bcaa1b..9a6d48d0613 100644 --- a/code/modules/persistence/noticeboards.dm +++ b/code/modules/persistence/noticeboards.dm @@ -8,8 +8,8 @@ layer = ABOVE_WINDOW_LAYER tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" - material = /decl/material/solid/wood + directional_offset = @'{"SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' + material = /decl/material/solid/organic/wood var/tmp/max_notices = 5 var/list/notices diff --git a/code/modules/persistence/persistence_datum_book.dm b/code/modules/persistence/persistence_datum_book.dm index c890055a7e1..e55a5cc9427 100644 --- a/code/modules/persistence/persistence_datum_book.dm +++ b/code/modules/persistence/persistence_datum_book.dm @@ -60,7 +60,7 @@ if(length(global.station_bookcases)) T = get_turf(pick(global.station_bookcases)) else - T = pick(global.latejoin_locations) + T = get_random_spawn_turf(SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) . = ..(T, tokens) diff --git a/code/modules/persistence/persistence_datum_paper.dm b/code/modules/persistence/persistence_datum_paper.dm index 36a71c49c74..70be0a952a1 100644 --- a/code/modules/persistence/persistence_datum_paper.dm +++ b/code/modules/persistence/persistence_datum_paper.dm @@ -14,7 +14,7 @@ var/obj/structure/noticeboard/board = locate() in creating if(!board) var/decl/material/mat = SSmaterials.get_material_by_name(tokens["noticeboard_material"]) - board = new(creating, (mat?.type || /decl/material/solid/wood)) + board = new(creating, (mat?.type || /decl/material/solid/organic/wood)) if("noticeboard_direction" in tokens) board.set_dir(tokens["noticeboard_direction"]) if(LAZYLEN(board.notices) < board.max_notices) diff --git a/code/modules/pointdefense/pointdefense.dm b/code/modules/pointdefense/pointdefense.dm index a945f6b41b4..dfec4c84562 100644 --- a/code/modules/pointdefense/pointdefense.dm +++ b/code/modules/pointdefense/pointdefense.dm @@ -8,7 +8,7 @@ anchored = TRUE base_type = /obj/machinery/pointdefense_control construct_state = /decl/machine_construction/default/panel_closed - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE var/ui_template = "pointdefense_control.tmpl" var/initial_id_tag @@ -105,7 +105,7 @@ desc = "A Kuiper pattern anti-meteor battery. Capable of destroying most threats in a single salvo." density = TRUE anchored = TRUE - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE idle_power_usage = 0.1 KILOWATTS construct_state = /decl/machine_construction/default/panel_closed base_type = /obj/machinery/pointdefense @@ -151,7 +151,7 @@ return FALSE return TRUE -/obj/machinery/pointdefense/proc/Shoot(var/weakref/target) +/obj/machinery/pointdefense/proc/shoot_at(var/weakref/target) var/obj/effect/meteor/M = target.resolve() if(!istype(M)) return @@ -159,7 +159,7 @@ var/Angle = round(Get_Angle(src,M)) var/matrix/rot_matrix = matrix() rot_matrix.Turn(Angle) - addtimer(CALLBACK(src, .proc/finish_shot, target), rotation_speed) + addtimer(CALLBACK(src, PROC_REF(finish_shot), target), rotation_speed) animate(src, transform = rot_matrix, rotation_speed, easing = SINE_EASING) set_dir(transform.get_angle() > 0 ? NORTH : SOUTH) @@ -233,7 +233,7 @@ if(!emagged && space_los(M)) var/weakref/target = weakref(M) PC.targets +=target - Shoot(target) + shoot_at(target) return /obj/machinery/pointdefense/RefreshParts() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 4190c0b618b..27911cf1baa 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -100,7 +100,7 @@ var/global/list/all_apcs = list() initial_access = list(access_engine_equip) clicksound = "switch" layer = ABOVE_WINDOW_LAYER - directional_offset = "{'NORTH':{'y':22}, 'SOUTH':{'y':-22}, 'EAST':{'x':22}, 'WEST':{'x':-22}}" + directional_offset = @'{"NORTH":{"y":22}, "SOUTH":{"y":-22}, "EAST":{"x":22}, "WEST":{"x":-22}}' var/powered_down = FALSE var/area/area @@ -220,14 +220,14 @@ var/global/list/all_apcs = list() old_area.power_environ = 0 power_alarm.clearAlarm(old_area, src) old_area.power_change() - events_repository.unregister(/decl/observ/name_set, old_area, src, .proc/change_area_name) + events_repository.unregister(/decl/observ/name_set, old_area, src, PROC_REF(change_area_name)) if(new_area) ASSERT(isnull(new_area.apc)) ASSERT(isnull(area)) new_area.apc = src area = new_area change_area_name(new_area, null, new_area.name) - events_repository.register(/decl/observ/name_set, new_area, src, .proc/change_area_name) + events_repository.register(/decl/observ/name_set, new_area, src, PROC_REF(change_area_name)) /obj/machinery/power/apc/get_req_access() if(!locked) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 0822883f516..c1e1c7610d1 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -5,7 +5,7 @@ // Used for advanced grid control (read: Substations) /obj/machinery/power/breakerbox - name = "Breaker Box" + name = "breaker box" icon = 'icons/obj/power.dmi' icon_state = "bbox_off" desc = "A large machine with heavy duty switching circuits used for advanced grid control." diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 8b8e086ded0..86bb4d1d262 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -31,8 +31,10 @@ By design, d1 is the smallest direction and d2 is the highest color = COLOR_MAROON anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - level = 1 + level = LEVEL_BELOW_PLATING + /// Whether this cable type can be (re)colored. + var/can_have_color = TRUE var/d1 var/d2 var/datum/powernet/powernet @@ -73,7 +75,7 @@ By design, d1 is the smallest direction and d2 is the highest // ensure d1 & d2 reflect the icon_state for entering and exiting cable . = ..(ml) var/turf/T = src.loc // hide if turf is not intact - if(level==1 && T) + if(level == LEVEL_BELOW_PLATING && T) hide(!T.is_plating()) global.cable_list += src //add it to the global cable list @@ -241,6 +243,8 @@ By design, d1 is the smallest direction and d2 is the highest . = ..() /obj/structure/cable/proc/cableColor(var/colorC) + if(!can_have_color) + return var/color_n = "#dd0000" if(colorC) color_n = colorC @@ -255,7 +259,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction) //search for and merge diagonally matching cables from the first direction component (north/south) - var/turf/T = get_step(src, direction&3)//go north/south + var/turf/T = get_step_resolving_mimic(src, direction & (NORTH|SOUTH)) for(var/obj/structure/cable/C in T) @@ -265,7 +269,7 @@ By design, d1 is the smallest direction and d2 is the highest if(src == C) continue - if(C.d1 == (direction^3) || C.d2 == (direction^3)) //we've got a diagonally matching cable + if(C.d1 == (direction ^ (NORTH|SOUTH)) || C.d2 == (direction ^ (NORTH|SOUTH))) //we've got a diagonally matching cable if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) var/datum/powernet/newPN = new() newPN.add_cable(C) @@ -276,7 +280,7 @@ By design, d1 is the smallest direction and d2 is the highest C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet //the same from the second direction component (east/west) - T = get_step(src, direction&12)//go east/west + T = get_step_resolving_mimic(src, direction & (EAST|WEST)) for(var/obj/structure/cable/C in T) @@ -285,7 +289,7 @@ By design, d1 is the smallest direction and d2 is the highest if(src == C) continue - if(C.d1 == (direction^12) || C.d2 == (direction^12)) //we've got a diagonally matching cable + if(C.d1 == (direction ^ (EAST|WEST)) || C.d2 == (direction ^ (EAST|WEST))) //we've got a diagonally matching cable if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) var/datum/powernet/newPN = new() newPN.add_cable(C) @@ -303,7 +307,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!(d1 == direction || d2 == direction)) //if the cable is not pointed in this direction, do nothing return - var/turf/TB = get_zstep(src, direction) + var/turf/TB = get_zstep_resolving_mimic(src, direction) for(var/obj/structure/cable/C in TB) @@ -380,14 +384,14 @@ By design, d1 is the smallest direction and d2 is the highest if(cable_dir == 0) continue var/reverse = global.reverse_dir[cable_dir] - T = get_zstep(src, cable_dir) + T = get_zstep_resolving_mimic(src, cable_dir) if(T) for(var/obj/structure/cable/C in T) if(C.d1 == reverse || C.d2 == reverse) . += C if(cable_dir & (cable_dir - 1)) // Diagonal, check for /\/\/\ style cables along cardinal directions for(var/pair in list(NORTH|SOUTH, EAST|WEST)) - T = get_step(src, cable_dir & pair) + T = get_step_resolving_mimic(src, cable_dir & pair) if(T) var/req_dir = cable_dir ^ pair for(var/obj/structure/cable/C in T) @@ -431,7 +435,7 @@ By design, d1 is the smallest direction and d2 is the highest var/list/P_list if(!T1) return if(d1) - T1 = get_step(T1, d1) + T1 = get_zstep_resolving_mimic(T1, d1) P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable... P_list += power_list(loc, src, d1, 0, cable_only = 1)//... and on turf @@ -487,7 +491,7 @@ By design, d1 is the smallest direction and d2 is the highest material = /decl/material/solid/metal/copper matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY @@ -495,6 +499,8 @@ By design, d1 is the smallest direction and d2 is the highest attack_verb = list("whipped", "lashed", "disciplined", "flogged") stack_merge_type = /obj/item/stack/cable_coil matter_multiplier = 0.15 + /// Whether or not this cable coil can even have a color in the first place. + var/can_have_color = TRUE /obj/item/stack/cable_coil/single amount = 1 @@ -509,14 +515,13 @@ By design, d1 is the smallest direction and d2 is the highest max_health = ITEM_HEALTH_NO_DAMAGE is_spawnable_type = FALSE -/obj/item/stack/cable_coil/Initialize(mapload, c_length = MAXCOIL, var/param_color = null) +/obj/item/stack/cable_coil/Initialize(mapload, c_length, var/param_color = null) . = ..(mapload, c_length) set_extension(src, /datum/extension/tool/variable, list( TOOL_CABLECOIL = TOOL_QUALITY_DEFAULT, TOOL_SUTURES = TOOL_QUALITY_MEDIOCRE )) - src.amount = c_length - if (param_color) // It should be red by default, so only recolor it if parameter was specified. + if (can_have_color && param_color) // It should be red by default, so only recolor it if parameter was specified. color = param_color update_icon() update_wclass() @@ -548,7 +553,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/on_update_icon() . = ..() - if (!color) + if (!color && can_have_color) var/list/possible_cable_colours = get_global_cable_colors() color = possible_cable_colours[pick(possible_cable_colours)] if(amount == 1) @@ -565,7 +570,7 @@ By design, d1 is the smallest direction and d2 is the highest SetName(initial(name)) /obj/item/stack/cable_coil/proc/set_cable_color(var/selected_color, var/user) - if(!selected_color) + if(!selected_color || !can_have_color) return var/list/possible_cable_colours = get_global_cable_colors() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 66c00a53646..e5c5de34844 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/power.dmi' icon_state = "cell" item_state = "cell" - origin_tech = "{'powerstorage':1}" + origin_tech = @'{"powerstorage":1}' force = 5.0 throwforce = 5 throw_speed = 3 @@ -14,11 +14,10 @@ material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) var/charge // Current charge var/maxcharge = 1000 // Capacity in Wh - var/overlay_state /obj/item/cell/Initialize() . = ..() @@ -40,19 +39,16 @@ /obj/item/cell/on_update_icon() . = ..() - var/new_overlay_state = null + var/overlay_state = null switch(percent()) if(95 to 100) - new_overlay_state = "cell-o2" + overlay_state = "cell-o2" if(25 to 95) - new_overlay_state = "cell-o1" + overlay_state = "cell-o1" if(0.05 to 25) - new_overlay_state = "cell-o0" - - if(new_overlay_state != overlay_state) - overlay_state = new_overlay_state - if(overlay_state) - add_overlay(overlay_state) + overlay_state = "cell-o0" + if(overlay_state) + add_overlay(overlay_state) /obj/item/cell/proc/percent() // return % charge of cell return maxcharge && (100.0*charge/maxcharge) @@ -136,9 +132,10 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) -/obj/item/cell/device/variable/Initialize(mapload, charge_amount) - maxcharge = charge_amount - return ..(mapload) +/obj/item/cell/device/variable/Initialize(ml, material_key, charge_amount) + if(!isnull(charge_amount)) + maxcharge = charge_amount + return ..(ml, material_key) /obj/item/cell/device/standard name = "standard device power cell" @@ -151,17 +148,51 @@ maxcharge = 100 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'powerstorage':2}" + origin_tech = @'{"powerstorage":2}' + +/obj/item/cell/device/infinite + name = "experimental device power cell" + desc = "This special experimental power cell has both very large capacity, and ability to recharge itself with zero-point energy." + icon_state = "icell" + origin_tech = null + maxcharge = 3000 + material = /decl/material/solid/metal/steel + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/aluminium = MATTER_AMOUNT_TRACE + ) + +/obj/item/cell/device/infinite/percent() + return 100 + +/obj/item/cell/device/infinite/fully_charged() + return TRUE + +/obj/item/cell/device/infinite/check_charge(var/amount) + return (maxcharge >= amount) + +/obj/item/cell/device/infinite/use(var/amount) + return min(maxcharge, amount) + +/obj/item/cell/device/infinite/checked_use(var/amount) + return check_charge(amount) + +/obj/item/cell/device/infinite/give() + return 0 + +/obj/item/cell/device/infinite/get_electrocute_damage() + charge = maxcharge + return ..() /obj/item/cell/crap name = "old power cell" desc = "A cheap old power cell. It's probably been in use for quite some time now." - origin_tech = "{'powerstorage':1}" + origin_tech = @'{"powerstorage":1}' maxcharge = 100 material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/cell/crap/empty @@ -170,36 +201,36 @@ /obj/item/cell/standard name = "standard power cell" desc = "A standard and relatively cheap power cell, commonly used." - origin_tech = "{'powerstorage':1}" + origin_tech = @'{"powerstorage":1}' maxcharge = 250 material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/cell/apc name = "APC power cell" desc = "A special power cell designed for heavy-duty use in area power controllers." - origin_tech = "{'powerstorage':1}" + origin_tech = @'{"powerstorage":1}' maxcharge = 500 material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/cell/high name = "advanced power cell" desc = "An advanced high-grade power cell, for use in important systems." - origin_tech = "{'powerstorage':2}" + origin_tech = @'{"powerstorage":2}' icon_state = "hcell" maxcharge = 1000 material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) /obj/item/cell/high/empty @@ -208,7 +239,7 @@ /obj/item/cell/exosuit name = "exosuit power cell" desc = "A special power cell designed for heavy-duty use in industrial exosuits." - origin_tech = "{'powerstorage':3}" + origin_tech = @'{"powerstorage":3}' icon_state = "hcell" maxcharge = 1500 material = /decl/material/solid/metal/steel @@ -221,7 +252,7 @@ /obj/item/cell/super name = "enhanced power cell" desc = "A very advanced power cell with increased energy density, for use in critical applications." - origin_tech = "{'powerstorage':5}" + origin_tech = @'{"powerstorage":5}' icon_state = "scell" maxcharge = 2000 material = /decl/material/solid/metal/steel @@ -236,7 +267,7 @@ /obj/item/cell/hyper name = "superior power cell" desc = "Pinnacle of power storage technology, this very expensive power cell provides the best energy density reachable with conventional electrochemical cells." - origin_tech = "{'powerstorage':6}" + origin_tech = @'{"powerstorage":6}' icon_state = "hpcell" maxcharge = 3000 material = /decl/material/solid/metal/steel @@ -287,7 +318,7 @@ /obj/item/cell/potato name = "potato battery" desc = "A rechargable starch based power cell." - origin_tech = "{'powerstorage':1}" + origin_tech = @'{"powerstorage":1}' icon = 'icons/obj/power.dmi' icon_state = "potato_cell" maxcharge = 20 @@ -296,7 +327,7 @@ /obj/item/cell/gun name = "weapon energy cell" desc = "A military grade high-density battery, expected to deplete after tens of thousands of complete charge cycles." - origin_tech = "{'combat':2,'materials':2,'powerstorage': 2}" + origin_tech = @'{"combat":2,"materials":2,"powerstorage": 2}' icon_state = "gunbattery" maxcharge = 500 w_class = ITEM_SIZE_SMALL //Perhaps unwise. diff --git a/code/modules/power/fission/core.dm b/code/modules/power/fission/core.dm index 763dbb7cdd8..0ed5dcc2732 100644 --- a/code/modules/power/fission/core.dm +++ b/code/modules/power/fission/core.dm @@ -216,7 +216,7 @@ if(!user.try_unequip(W, src)) return fuel_rods[W] = FALSE // Rod is not exposed to begin with. - visible_message(SPAN_NOTICE("\The [user] inserts \a [W] into \the [src]."), SPAN_NOTICE("You insert \a [W] into \the [src].")) + user.visible_message(SPAN_NOTICE("\The [user] inserts \a [W] into \the [src]."), SPAN_NOTICE("You insert \a [W] into \the [src].")) return . = ..() diff --git a/code/modules/power/fission/fission_circuits.dm b/code/modules/power/fission/fission_circuits.dm index 27c88bea33e..f36b48f2fa3 100644 --- a/code/modules/power/fission/fission_circuits.dm +++ b/code/modules/power/fission/fission_circuits.dm @@ -1,13 +1,13 @@ /obj/item/stock_parts/circuitboard/fission_core_control name = "circuit board (fission core controller)" build_path = /obj/machinery/computer/fission - origin_tech = "{'programming':2,'engineering':3}" + origin_tech = @'{"programming":2,"engineering":3}' /obj/item/stock_parts/circuitboard/unary_atmos/fission_core name = "circuit board (fission core)" build_path = /obj/machinery/atmospherics/unary/fission_core board_type = "machine" - origin_tech = "{'engineering':2,'materials':2}" + origin_tech = @'{"engineering":2,"materials":2}' additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1 ) diff --git a/code/modules/power/floorlamp.dm b/code/modules/power/floorlamp.dm index 6c2bdabce05..39ff3b57c3a 100644 --- a/code/modules/power/floorlamp.dm +++ b/code/modules/power/floorlamp.dm @@ -72,7 +72,7 @@ desc = "A lampshade for a lamp." icon = 'icons/obj/floorlamp.dmi' icon_state = "lampshade" - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth obj_flags = OBJ_FLAG_HOLLOW w_class = ITEM_SIZE_NORMAL diff --git a/code/modules/power/fuel_assembly/fuel_compressor.dm b/code/modules/power/fuel_assembly/fuel_compressor.dm index 09d8f49f561..6df9b9a8a0b 100644 --- a/code/modules/power/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fuel_assembly/fuel_compressor.dm @@ -111,7 +111,7 @@ rod_makeup[mat_type] = amt return TOPIC_REFRESH -/obj/machinery/fuel_compressor/receive_mouse_drop(var/atom/movable/dropping, var/mob/user) +/obj/machinery/fuel_compressor/receive_mouse_drop(atom/dropping, mob/user, params) if(user.incapacitated() || !user.Adjacent(src)) return return !add_material(dropping, user) diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm index c053090aac8..f1ac424ed41 100644 --- a/code/modules/power/fusion/core/core_field.dm +++ b/code/modules/power/fusion/core/core_field.dm @@ -87,7 +87,7 @@ catcher.SetSize((iter*2)+1) particle_catchers.Add(catcher) - addtimer(CALLBACK(src, .proc/update_light_colors), 10 SECONDS, TIMER_LOOP) + addtimer(CALLBACK(src, PROC_REF(update_light_colors)), 10 SECONDS, TIMER_LOOP) /obj/effect/fusion_em_field/proc/handle_tick() //make sure the field generator is still intact @@ -194,7 +194,7 @@ if(field_cohesion == 0) owned_core.Shutdown(force_rupture=1) - + if(percent_unstable > 0.5 && prob(percent_unstable*100)) if(plasma_temperature < FUSION_RUPTURE_THRESHOLD) visible_message("\The [src] ripples uneasily, like a disturbed pond.") diff --git a/code/modules/power/fusion/fusion_circuits.dm b/code/modules/power/fusion/fusion_circuits.dm index 73814a03224..b03d6a03616 100644 --- a/code/modules/power/fusion/fusion_circuits.dm +++ b/code/modules/power/fusion/fusion_circuits.dm @@ -1,13 +1,13 @@ /obj/item/stock_parts/circuitboard/fusion/core_control name = "circuitboard (fusion core controller)" build_path = /obj/machinery/computer/fusion/core_control - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' /obj/item/stock_parts/circuitboard/kinetic_harvester name = "circuitboard (kinetic harvester)" build_path = /obj/machinery/kinetic_harvester board_type = "machine" - origin_tech = "{'programming':4,'engineering':4,'materials':4}" + origin_tech = @'{"programming":4,"engineering":4,"materials":4}' additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1 @@ -21,18 +21,18 @@ /obj/item/stock_parts/circuitboard/fusion_fuel_control name = "circuitboard (fusion fuel controller)" build_path = /obj/machinery/computer/fusion/fuel_control - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' /obj/item/stock_parts/circuitboard/gyrotron_control name = "circuitboard (gyrotron controller)" build_path = /obj/machinery/computer/fusion/gyrotron - origin_tech = "{'programming':4,'engineering':4}" + origin_tech = @'{"programming":4,"engineering":4}' /obj/item/stock_parts/circuitboard/fusion_core name = "circuitboard (fusion core)" build_path = /obj/machinery/fusion_core board_type = "machine" - origin_tech = "{'wormholes':2,'magnets':4,'powerstorage':4}" + origin_tech = @'{"wormholes":2,"magnets":4,"powerstorage":4}' additional_spawn_components = list( /obj/item/stock_parts/power/terminal = 1 ) @@ -48,7 +48,7 @@ name = "circuitboard (fusion fuel injector)" build_path = /obj/machinery/fusion_fuel_injector board_type = "machine" - origin_tech = "{'powerstorage':3,'engineering':4,'materials':4}" + origin_tech = @'{"powerstorage":3,"engineering":4,"materials":4}' req_components = list( /obj/item/stock_parts/manipulator/pico = 2, /obj/item/stock_parts/scanning_module/phasic = 1, @@ -61,7 +61,7 @@ name = "circuitboard (gyrotron)" build_path = /obj/machinery/emitter/gyrotron board_type = "machine" - origin_tech = "{'powerstorage':4,'engineering':4}" + origin_tech = @'{"powerstorage":4,"engineering":4}' additional_spawn_components = list( /obj/item/stock_parts/power/terminal = 1 ) diff --git a/code/modules/power/fusion/fusion_particle_catcher.dm b/code/modules/power/fusion/fusion_particle_catcher.dm index fcd106b6662..fc23d2ce304 100644 --- a/code/modules/power/fusion/fusion_particle_catcher.dm +++ b/code/modules/power/fusion/fusion_particle_catcher.dm @@ -2,7 +2,7 @@ icon = 'icons/effects/effects.dmi' density = TRUE anchored = TRUE - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT light_color = COLOR_BLUE is_spawnable_type = FALSE // invalid without parent passed diff --git a/code/modules/power/geothermal/_geothermal.dm b/code/modules/power/geothermal/_geothermal.dm index 9cad5e8ccd0..101fdd6bcbf 100644 --- a/code/modules/power/geothermal/_geothermal.dm +++ b/code/modules/power/geothermal/_geothermal.dm @@ -31,7 +31,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 // Geyser Object ////////////////////////////////////////////////////////////////////// -///A prop that periodically emit steam spouts and can have a geothermal generator placed on top to generate power. +/// A prop that periodically emit steam spouts and can have a geothermal generator placed on top to generate power. /obj/effect/geyser name = "geothermal vent" desc = "A vent leading to an underground geothermally heated reservoir, which periodically spews superheated liquid." @@ -39,8 +39,8 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 icon_state = "geyser" anchored = TRUE layer = TURF_LAYER + 0.01 - level = 1 //Goes under floor/plating - ///The particle emitter that will generate the steam column effect for this geyser + level = LEVEL_BELOW_PLATING // Goes under floor/plating + /// The particle emitter that will generate the steam column effect for this geyser var/particles/geyser_steam/steamfx /obj/effect/geyser/Initialize(ml) @@ -84,7 +84,10 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 for(var/turf/exterior/seafloor/T in RANGE_TURFS(loc, 5)) var/dist = get_dist(loc, T)-1 if(prob(100 - (dist * 20))) - T = T.ChangeTurf(/turf/exterior/mud) + if(prob(25)) + T = T.ChangeTurf(/turf/exterior/clay) + else + T = T.ChangeTurf(/turf/exterior/mud) if(prob(50 - (dist * 10))) new /obj/random/seaweed(T) @@ -187,7 +190,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 current_pressure = clamp(current_pressure + pressure, 0, MAX_GEOTHERMAL_PRESSURE) var/leftover = round(pressure - current_pressure) if(leftover > 0) - addtimer(CALLBACK(src, .proc/propagate_pressure, leftover), 5) + addtimer(CALLBACK(src, PROC_REF(propagate_pressure), leftover), 5) update_icon() START_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF) @@ -204,7 +207,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 generate_power(last_generated) remaining_pressure = round(remaining_pressure * GEOTHERMAL_PRESSURE_LOSS) if(remaining_pressure) - addtimer(CALLBACK(src, .proc/propagate_pressure, remaining_pressure), 5) + addtimer(CALLBACK(src, PROC_REF(propagate_pressure), remaining_pressure), 5) update_icon() if(current_pressure <= 1) return PROCESS_KILL diff --git a/code/modules/power/geothermal/geothermal_circuit.dm b/code/modules/power/geothermal/geothermal_circuit.dm index 07d451d68fa..f569521f85e 100644 --- a/code/modules/power/geothermal/geothermal_circuit.dm +++ b/code/modules/power/geothermal/geothermal_circuit.dm @@ -2,7 +2,7 @@ name = "circuitboard (geothermal generator)" build_path = /obj/machinery/geothermal board_type = "machine" - origin_tech = "{'magnets':3,'powerstorage':3}" + origin_tech = @'{"magnets":3,"powerstorage":3}' req_components = list( /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/manipulator = 2, diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index d6121c37a9f..b0279ba8abd 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -37,7 +37,7 @@ construct_state = /decl/machine_construction/wall_frame/panel_closed/simple base_type = /obj/machinery/light frame_type = /obj/item/frame/light - directional_offset = "{'NORTH':{'y':21}, 'EAST':{'x':10}, 'WEST':{'x':-10}}" + directional_offset = @'{"NORTH":{"y":21}, "EAST":{"x":10}, "WEST":{"x":-10}}' var/on = 0 // 1 if on, 0 if off var/flickering = 0 @@ -412,6 +412,7 @@ /obj/machinery/light/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C broken() + return ..() /obj/machinery/light/small/readylight light_type = /obj/item/light/bulb/red/readylight @@ -472,7 +473,7 @@ throwforce = 5 w_class = ITEM_SIZE_TINY material = /decl/material/solid/metal/steel - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CAN_BE_PAINTED + atom_flags = ATOM_FLAG_CAN_BE_PAINTED obj_flags = OBJ_FLAG_HOLLOW var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN @@ -592,7 +593,7 @@ to_chat(user, "You inject the solution into \the [src].") for(var/rtype in S.reagents?.reagent_volumes) var/decl/material/R = GET_DECL(rtype) - if(R.fuel_value) + if(R.accelerant_value > FUEL_VALUE_ACCELERANT) rigged = TRUE log_and_message_admins("injected a light with flammable reagents, rigging it to explode.", user) break diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 0cc70e45ac5..5e1ad2297c3 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -178,10 +178,8 @@ /obj/machinery/port_gen/pacman/proc/process_exhaust() var/decl/material/mat = GET_DECL(sheet_material) - if(mat && mat.burn_product) - var/datum/gas_mixture/environment = loc.return_air() - if(environment) - environment.adjust_gas(mat.burn_product, 0.05*power_output) + if(mat) + mat.add_burn_product(loc, 0.05*power_output) /obj/machinery/port_gen/pacman/HasFuel() var/needed_sheets = power_output / time_per_sheet diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm index c91a060d678..f4266872ef0 100644 --- a/code/modules/power/sensors/powernet_sensor.dm +++ b/code/modules/power/sensors/powernet_sensor.dm @@ -8,11 +8,11 @@ // This is used in NanoUI, for example. /obj/machinery/power/sensor - name = "Powernet Sensor" + name = "powernet sensor" desc = "Small machine which transmits data about specific powernet." anchored = TRUE density = FALSE - level = 1 + level = LEVEL_BELOW_PLATING icon = 'icons/obj/objects.dmi' icon_state = "floor_beacon" // If anyone wants to make better sprite, feel free to do so without asking me. @@ -37,7 +37,7 @@ if(!A) return // in nullspace id_tag = "[A.proper_name] #[sequential_id(A.name + "power/sensor")]" - name = "[id_tag] - Powernet Sensor" + name = "[id_tag] - powernet sensor" // Proc: check_grid_warning() // Parameters: None diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 7b8984696b4..47a89e778ee 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -10,9 +10,9 @@ var/global/list/rad_collectors = list() anchored = FALSE density = TRUE initial_access = list(access_engine_equip) + max_health = 100 var/obj/item/tank/hydrogen/loaded_tank = null - var/health = 100 var/max_safe_temp = 1000 + T0C var/melted diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 25e9748ff2c..29f7fc5d532 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -7,7 +7,6 @@ icon_state = "Contain_F" anchored = TRUE density = FALSE - unacidable = 1 light_range = 4 movable_flags = MOVABLE_FLAG_PROXMOVE var/obj/machinery/field_generator/FG1 = null diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index ebede885d4a..049e62a9051 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -29,7 +29,7 @@ animation.pixel_y = -32 animation.layer = SINGULARITY_EFFECT_LAYER flick('icons/effects/singularity_effect.dmi', animation) - addtimer(CALLBACK(src, .proc/spawn_contained, T), 6 SECOND) + addtimer(CALLBACK(src, PROC_REF(spawn_contained), T), 6 SECOND) QDEL_IN(animation, 7 SECOND) return PROCESS_KILL diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 3d922b263b2..dc88c1bb9c8 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -63,7 +63,6 @@ /obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) var/radiation = (energy*2) M.apply_damage((radiation*3),IRRADIATE, damage_flags = DAM_DISPERSED) - M.updatehealth() /obj/effect/accelerated_particle/proc/move(var/lag) set waitfor = FALSE diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index f3971eb3147..004052a0ffb 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -6,7 +6,6 @@ var/global/list/singularities = list() icon_state = "singularity_s1" anchored = TRUE density = TRUE - unacidable = TRUE //Don't comment this out. layer = SINGULARITY_LAYER light_power = 1 light_range = 6 diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 7f42b7b0fd4..bea33abcdbf 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -12,7 +12,7 @@ icon = 'icons/obj/items/stock_parts/stock_parts.dmi' icon_state = "smes_coil" w_class = ITEM_SIZE_LARGE // It's LARGE (backpack size) - origin_tech = "{'materials':7,'powerstorage':7,'engineering':5}" + origin_tech = @'{"materials":7,"powerstorage":7,"engineering":5}' base_type = /obj/item/stock_parts/smes_coil part_flags = PART_FLAG_HAND_REMOVE material = /decl/material/solid/metal/steel @@ -210,8 +210,8 @@ SET_STATUS_MAX(h_user, STAT_PARA, 6) spawn(0) empulse(src.loc, 8, 16) - charge = 0 apcs_overload(1, 10, 20) + charge = 0 energy_fail(10) src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.") @@ -225,8 +225,8 @@ SET_STATUS_MAX(h_user, STAT_PARA, 8) spawn(0) empulse(src.loc, 32, 64) - charge = 0 apcs_overload(5, 25, 100) + charge = 0 energy_fail(30) src.ping("Caution. Output regulators malfunction. Significant uncontrolled discharge detected.") @@ -258,23 +258,34 @@ total_system_failure(failure_probability, user) return TRUE -// Proc: apcs_overload() -// Parameters: 3 (failure_chance - chance to actually break the APC, overload_chance - Chance of breaking lights, reboot_chance - Chance of temporarily disabling the APC) -// Description: Damages output powernet by power surge. Destroys few APCs and lights, depending on parameters. +/** + * Processes the APCs overloaded by malfunctioning SMES. + * + * Damages output powernet by power surge. Destroys or damages few APCs and lights, depending on parameters and current SMES charge. + * + * - `failure_chance`: chance to actually damage the individual APC (in %). Damage scales from SMES charge, can easily destroy some. + * - `overload_chance`: chance of breaking the lightbulbs on individual APC network (in %). + * - `reboot_chance`: chance of temporarily (30..60 sec) disabling the individual APC (in %). + */ /obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance, var/reboot_chance) if (!src.powernet) return - + var/list/obj/machinery/power/apc/apcs = list() for(var/obj/machinery/power/terminal/T in powernet.nodes) var/obj/machinery/power/apc/A = T.master_machine() if(istype(A)) if (prob(overload_chance)) A.overload_lighting() if (prob(failure_chance)) - A.set_broken(TRUE) + apcs |= A if(prob(reboot_chance)) A.energy_fail(rand(30,60)) + if (apcs.len) + var/overload_damage = charge/100/apcs.len + for (var/obj/machinery/power/apc/A in apcs) + A.take_damage(overload_damage, ELECTROCUTE) + // Proc: update_icon() // Parameters: None // Description: Allows us to use special icon overlay for critical SMESs diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 992fa1ab3b3..2633d130893 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -12,7 +12,7 @@ var/global/list/solars_list = list() density = TRUE idle_power_usage = 0 active_power_usage = 0 - var/health = 10 + max_health = 10 var/obscured = 0 var/sunfrac = 0 var/efficiency = 1 diff --git a/code/modules/power/stirling.dm b/code/modules/power/stirling.dm index db91f60ed90..b3e94d0f3e5 100644 --- a/code/modules/power/stirling.dm +++ b/code/modules/power/stirling.dm @@ -39,9 +39,15 @@ /obj/machinery/atmospherics/binary/stirling/Process() ..() + if(!active) + return + var/line1_heatcap = air1.heat_capacity() var/line2_heatcap = air2.heat_capacity() + if(!(line1_heatcap + line2_heatcap)) + return + var/delta_t = air1.temperature - air2.temperature // Absolute value of the heat transfer required to bring both lines in equilibrium. diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index b80f3111c77..80036c842a1 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -7,7 +7,7 @@ name = "terminal" icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." - level = 1 + level = LEVEL_BELOW_PLATING layer = EXPOSED_WIRE_TERMINAL_LAYER var/obj/item/stock_parts/power/terminal/master anchored = TRUE @@ -20,7 +20,7 @@ /obj/machinery/power/terminal/Initialize() . = ..() var/turf/T = src.loc - if(level == 1 && isturf(T)) + if(level == LEVEL_BELOW_PLATING && isturf(T)) hide(!T.is_plating()) /obj/machinery/power/terminal/Destroy() @@ -67,7 +67,7 @@ return machine /obj/machinery/power/terminal/hide(var/do_hide) - if(do_hide && level == 1) + if(do_hide && level == LEVEL_BELOW_PLATING) layer = WIRE_TERMINAL_LAYER else reset_plane_and_layer() diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index d414b975fc5..f8488ea20b3 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -43,22 +43,21 @@ update_icon() -/obj/item/ammo_casing/Crossed(atom/AM) +/obj/item/ammo_casing/Crossed(atom/movable/AM) ..() + if(!isliving(AM)) + return - if(isliving(AM)) - var/mob/living/L = AM - - if(L.buckled) - return + var/mob/living/L = AM + if(L.buckled || MOVING_DELIBERATELY(L) || prob(90)) + return - if(!MOVING_DELIBERATELY(L) && prob(10)) - playsound(src, pick(drop_sound), 50, 1) - var/turf/turf_current = get_turf(src) - var/turf/turf_destiinaton = get_step(turf_current, AM.dir) - if(turf_destiinaton.Adjacent(turf_current)) - throw_at(turf_destiinaton, 2, 2, spin = FALSE) - animate(src, pixel_x = rand(-16, 16), pixel_y = rand(-16, 16), transform = turn(matrix(), rand(120, 300)), time = rand(3, 8)) + playsound(src, pick(drop_sound), 50, 1) + var/turf/turf_current = get_turf(src) + var/turf/turf_destiinaton = get_step(turf_current, AM.dir) + if(turf_destiinaton.Adjacent(turf_current)) + throw_at(turf_destiinaton, 2, 2, spin = FALSE) + animate(src, pixel_x = rand(-16, 16), pixel_y = rand(-16, 16), transform = turn(matrix(), rand(120, 300)), time = rand(3, 8)) /obj/item/ammo_casing/proc/leave_residue() var/obj/item/gun/G = get_recursive_loc_of_type(/obj/item/gun) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index eafd25d70d6..1d1bf7a0cb0 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -130,7 +130,7 @@ /obj/item/ammo_magazine/pistol name = "pistol magazine" icon_state = "pistol" - origin_tech = "{'combat':2}" + origin_tech = @'{"combat":2}' mag_type = MAGAZINE caliber = CALIBER_PISTOL material = /decl/material/solid/metal/steel @@ -178,7 +178,7 @@ /obj/item/ammo_magazine/box/smallpistol name = "ammunition box (pistol, small)" icon_state = "smallpistol" - origin_tech = "{'combat':2}" + origin_tech = @'{"combat":2}' material = /decl/material/solid/metal/steel caliber = CALIBER_PISTOL_SMALL ammo_type = /obj/item/ammo_casing/pistol/small @@ -187,7 +187,7 @@ /obj/item/ammo_magazine/box/pistol name = "ammunition box (pistol)" icon_state = "smallpistol" - origin_tech = "{'combat':2}" + origin_tech = @'{"combat":2}' caliber = CALIBER_PISTOL material = /decl/material/solid/metal/steel ammo_type = /obj/item/ammo_casing/pistol @@ -203,7 +203,7 @@ ammo_type = /obj/item/ammo_casing/pistol/emp caliber = CALIBER_PISTOL max_ammo = 15 - origin_tech = "{'combat':2,'magnets':2,'powerstorage':2}" + origin_tech = @'{"combat":2,"magnets":2,"powerstorage":2}' /obj/item/ammo_magazine/box/emp/smallpistol name = "ammunition box (pistol, small, haywire)" @@ -212,12 +212,12 @@ ammo_type = /obj/item/ammo_casing/pistol/small/emp caliber = CALIBER_PISTOL_SMALL max_ammo = 8 - origin_tech = "{'combat':2,'magnets':2,'powerstorage':2}" + origin_tech = @'{"combat":2,"magnets":2,"powerstorage":2}' /obj/item/ammo_magazine/rifle name = "assault rifle magazine" icon_state = "bullup" - origin_tech = "{'combat':2}" + origin_tech = @'{"combat":2}' mag_type = MAGAZINE caliber = CALIBER_RIFLE material = /decl/material/solid/metal/steel @@ -235,7 +235,7 @@ /obj/item/ammo_magazine/rifle/drum name = "machine gun drum magazine" icon_state = "drum" - origin_tech = "{'combat':2}" + origin_tech = @'{"combat":2}' mag_type = MAGAZINE caliber = CALIBER_RIFLE material = /decl/material/solid/metal/steel diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index e22a7c1e942..7966b8e04f9 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -85,7 +85,7 @@ leaves_residue = 0 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'combat':3,'materials':3}" + origin_tech = @'{"combat":3,"materials":3}' /obj/item/ammo_casing/shotgun name = "shotgun slug" @@ -140,7 +140,7 @@ leaves_residue = 0 material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'combat':3,'materials':3}" + origin_tech = @'{"combat":3,"materials":3}' /obj/item/ammo_casing/shotgun/stunshell/emp_act(severity) if(prob(100/severity)) BB = null @@ -164,7 +164,7 @@ projectile_type = /obj/item/projectile/ion material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/metal/uranium = MATTER_AMOUNT_REINFORCEMENT) - origin_tech = "{'combat':4,'materials':3}" + origin_tech = @'{"combat":4,"materials":3}' /obj/item/ammo_casing/shell name = "shell casing" @@ -220,4 +220,4 @@ color = COLOR_BLUE_GRAY bullet_color = COLOR_BLUE_LIGHT material = /decl/material/solid/glass - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) \ No newline at end of file + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/chemdart.dm b/code/modules/projectiles/ammunition/chemdart.dm index 2d0325f2b91..6d9d1bc644c 100644 --- a/code/modules/projectiles/ammunition/chemdart.dm +++ b/code/modules/projectiles/ammunition/chemdart.dm @@ -4,11 +4,10 @@ damage = 5 sharp = 1 embed = 1 //the dart is shot fast enough to pierce space suits, so I guess splintering inside the target can be a thing. Should be rare due to low damage. - var/reagent_amount = 15 life_span = 15 //shorter range - unacidable = 1 - muzzle_type = null + material = /decl/material/solid/glass + var/reagent_amount = 15 /obj/item/projectile/bullet/chemdart/initialize_reagents(populate) create_reagents(reagent_amount) @@ -36,7 +35,7 @@ desc = "A rack of hollow darts." icon_state = "darts" item_state = "rcdammo" - origin_tech = "{'materials':2}" + origin_tech = @'{"materials":2}' mag_type = MAGAZINE caliber = CALIBER_DART ammo_type = /obj/item/ammo_casing/chemdart diff --git a/code/modules/projectiles/ammunition/magnetic.dm b/code/modules/projectiles/ammunition/magnetic.dm index 4ad8d749207..893bde26c0c 100644 --- a/code/modules/projectiles/ammunition/magnetic.dm +++ b/code/modules/projectiles/ammunition/magnetic.dm @@ -8,7 +8,7 @@ var/basetype = /obj/item/magnetic_ammo w_class = ITEM_SIZE_SMALL material = /decl/material/solid/metal/steel - origin_tech = "{'combat':1}" + origin_tech = @'{"combat":1}' var/remaining = 9 /obj/item/magnetic_ammo/examine(mob/user) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ef473b48ffb..74fee267478 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -41,7 +41,7 @@ throw_speed = 4 throw_range = 5 force = 5 - origin_tech = "{'combat':1}" + origin_tech = @'{"combat":1}' attack_verb = list("struck", "hit", "bashed") zoomdevicename = "scope" @@ -123,7 +123,7 @@ autofiring_at = fire_at autofiring_by = fire_by if(!autofiring_timer) - autofiring_timer = addtimer(CALLBACK(src, .proc/handle_autofire, autoturn), burst_delay, (TIMER_STOPPABLE | TIMER_LOOP | TIMER_UNIQUE | TIMER_OVERRIDE)) + autofiring_timer = addtimer(CALLBACK(src, PROC_REF(handle_autofire), autoturn), burst_delay, (TIMER_STOPPABLE | TIMER_LOOP | TIMER_UNIQUE | TIMER_OVERRIDE)) else clear_autofire() @@ -170,11 +170,17 @@ /obj/item/gun/proc/get_safety_indicator() return mutable_appearance(icon, "[get_world_inventory_state()][safety_icon][safety()]") -/obj/item/gun/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) - if(overlay && user_mob.can_wield_item(src) && is_held_twohanded(user_mob) && check_state_in_icon("[overlay.icon_state]-wielded", overlay.icon)) - overlay.icon_state = "[overlay.icon_state]-wielded" +/obj/item/gun/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) + if(overlay && user_mob.can_wield_item(src) && is_held_twohanded(user_mob)) + var/wielded_state = "[overlay.icon_state]-wielded" + if(check_state_in_icon(wielded_state, overlay.icon)) + overlay.icon_state = wielded_state + apply_gun_mob_overlays(user_mob, bodytype, overlay, slot, bodypart) . = ..() +/obj/item/gun/proc/apply_gun_mob_overlays(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) + return + //Checks whether a given mob can use the gun //Any checks that shouldn't result in handle_click_empty() being called if they fail should go here. //Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there. @@ -654,12 +660,6 @@ if(usr == loc) toggle_safety(usr) -/obj/item/gun/CtrlClick(var/mob/user) - if(loc == user) - toggle_safety(user) - return TRUE - . = ..() - /obj/item/gun/proc/safety() return has_safety && safety_state @@ -718,4 +718,16 @@ return FALSE if(get_active_hand() != autofiring || incapacitated()) return FALSE - return TRUE \ No newline at end of file + return TRUE + +/obj/item/gun/get_alt_interactions(mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/toggle_safety) + +/decl/interaction_handler/toggle_safety + name = "Toggle Gun Safety" + expected_target_type = /obj/item/gun + +/decl/interaction_handler/toggle_safety/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/gun/gun = target + gun.toggle_safety(user) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 8db4eb959d4..b8fb610335a 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -10,9 +10,8 @@ var/global/list/registered_cyborg_weapons = list() fire_sound_text = "laser blast" accuracy = 1 - var/obj/item/cell/power_supply // What type of power cell this starts with. Uses accepts_cell_type or variable cell if unset. var/charge_cost = 20 // How much energy is needed to fire. - var/max_shots = 10 // Determines the capacity of the weapon's power cell. Setting power_supply or accepts_cell_type will override this value. + var/max_shots = 10 // Determines the capacity of the weapon's power cell, if the type is not overridded in setup_power_supply(). var/modifystate // Changes the icon_state used for the charge overlay. var/charge_meter = 1 // If set, the icon state will be chosen based on the current charge var/indicator_color // Color used for overlay based charge meters @@ -20,31 +19,24 @@ var/global/list/registered_cyborg_weapons = list() var/use_external_power = 0 // If set, the weapon will look for an external power source to draw from, otherwise it recharges magically var/recharge_time = 4 // How many ticks between recharges. var/charge_tick = 0 // Current charge tick tracker. - var/accepts_cell_type // Specifies a cell type that can be loaded into this weapon. // Which projectile type to create when firing. var/projectile_type = /obj/item/projectile/beam/practice +/obj/item/gun/energy/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + accepted_cell_type = accepted_cell_type || loaded_cell_type || /obj/item/cell/device/variable + loaded_cell_type = loaded_cell_type || accepted_cell_type + power_supply_extension_type = power_supply_extension_type || /datum/extension/loaded_cell/unremovable + return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, max_shots*charge_cost) + /obj/item/gun/energy/switch_firemodes() . = ..() if(.) update_icon() -/obj/item/gun/energy/emp_act(severity) - ..() - update_icon() - -/obj/item/gun/energy/Initialize() - - if(ispath(power_supply)) - power_supply = new power_supply(src) - else if(accepts_cell_type) - power_supply = new accepts_cell_type(src) - else - power_supply = new /obj/item/cell/device/variable(src, max_shots*charge_cost) - +/obj/item/gun/energy/Initialize(var/ml, var/material_key) + setup_power_supply() . = ..() - if(self_recharge) START_PROCESSING(SSobj, src) update_icon() @@ -52,13 +44,10 @@ var/global/list/registered_cyborg_weapons = list() /obj/item/gun/energy/Destroy() if(self_recharge) STOP_PROCESSING(SSobj, src) - QDEL_NULL(power_supply) return ..() -/obj/item/gun/energy/get_cell() - return power_supply - /obj/item/gun/energy/Process() + var/obj/item/cell/power_supply = get_cell() if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the cyborg charge_tick++ if(charge_tick < recharge_time) return 0 @@ -77,6 +66,7 @@ var/global/list/registered_cyborg_weapons = list() return 1 /obj/item/gun/energy/consume_next_projectile() + var/obj/item/cell/power_supply = get_cell() if(!power_supply) return null if(!ispath(projectile_type)) @@ -90,10 +80,14 @@ var/global/list/registered_cyborg_weapons = list() return loc.get_cell() /obj/item/gun/energy/proc/get_shots_remaining() - . = round(power_supply.charge / charge_cost) + var/obj/item/cell/power_supply = get_cell() + if(!power_supply) + return 0 + return round(power_supply.charge / charge_cost) /obj/item/gun/energy/examine(mob/user) . = ..(user) + var/obj/item/cell/power_supply = get_cell() if(!power_supply) to_chat(user, "Seems like it's dead.") return @@ -104,6 +98,7 @@ var/global/list/registered_cyborg_weapons = list() /obj/item/gun/energy/proc/get_charge_ratio() . = 0 + var/obj/item/cell/power_supply = get_cell() if(power_supply) var/ratio = power_supply.percent() //make sure that rounding down will not give us the empty state even if we have charge for a shot left. @@ -119,7 +114,7 @@ var/global/list/registered_cyborg_weapons = list() if(charge_meter) update_charge_meter() -/obj/item/gun/energy/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/gun/energy/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && charge_meter) var/charge_state = get_charge_state(overlay.icon_state) if(charge_state && check_state_in_icon(charge_state, overlay.icon)) @@ -136,52 +131,9 @@ var/global/list/registered_cyborg_weapons = list() if(use_single_icon) add_overlay(mutable_appearance(icon, "[get_world_inventory_state()][get_charge_ratio()]", indicator_color)) return + var/obj/item/cell/power_supply = get_cell() if(power_supply) if(modifystate) icon_state = "[modifystate][get_charge_ratio()]" else icon_state = "[initial(icon_state)][get_charge_ratio()]" - -//For removable cells. -/obj/item/gun/energy/attack_hand(mob/user) - if(!user.is_holding_offhand(src) || isnull(accepts_cell_type) || isnull(power_supply) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) - return ..() - user.put_in_hands(power_supply) - power_supply = null - user.visible_message(SPAN_NOTICE("\The [user] unloads \the [src].")) - playsound(src,'sound/weapons/guns/interaction/smg_magout.ogg' , 50) - update_icon() - return TRUE - -/obj/item/gun/energy/attackby(var/obj/item/A, mob/user) - - if(istype(A, /obj/item/cell)) - - if(isnull(accepts_cell_type)) - to_chat(user, SPAN_WARNING("\The [src] cannot accept a cell.")) - return TRUE - - if(!istype(A, accepts_cell_type)) - var/obj/cell_dummy = accepts_cell_type - to_chat(user, SPAN_WARNING("\The [src]'s cell bracket can only accept \a [initial(cell_dummy.name)].")) - return TRUE - - if(!user.is_holding_offhand(src)) - to_chat(user, SPAN_WARNING("You must hold \the [src] in your hands to load it.")) - return TRUE - - if(istype(power_supply) ) - to_chat(user, SPAN_NOTICE("\The [src] already has \a [power_supply] loaded.")) - return TRUE - - if(!do_after(user, 5, A, can_move = TRUE)) - return TRUE - - if(user.try_unequip(A, src)) - power_supply = A - user.visible_message(SPAN_WARNING("\The [user] loads \the [A] into \the [src]!")) - playsound(src, 'sound/weapons/guns/interaction/energy_magin.ogg', 80) - update_icon() - return TRUE - - return ..() diff --git a/code/modules/projectiles/guns/energy/capacitor.dm b/code/modules/projectiles/guns/energy/capacitor.dm index 0d07d013922..eddeb72c80a 100644 --- a/code/modules/projectiles/guns/energy/capacitor.dm +++ b/code/modules/projectiles/guns/energy/capacitor.dm @@ -47,13 +47,13 @@ var/global/list/laser_wavelengths desc = "An excitingly chunky directed energy weapon that uses a modular capacitor array to charge each shot." icon = 'icons/obj/guns/capacitor_pistol.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':4,'materials':4,'powerstorage':4}" + origin_tech = @'{"combat":4,"materials":4,"powerstorage":4}' w_class = ITEM_SIZE_NORMAL charge_cost = 100 + charge_meter = FALSE accuracy = 2 fire_delay = 10 slot_flags = SLOT_LOWER_BODY - power_supply = /obj/item/cell/high material = /decl/material/solid/metal/steel projectile_type = /obj/item/projectile/beam/variable matter = list( @@ -70,6 +70,12 @@ var/global/list/laser_wavelengths var/decl/laser_wavelength/charging var/decl/laser_wavelength/selected_wavelength +/obj/item/gun/energy/capacitor/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell/high + accepted_cell_type = accepted_cell_type || /obj/item/cell + power_supply_extension_type = power_supply_extension_type || /datum/extension/loaded_cell/secured + return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + /obj/item/gun/energy/capacitor/examine(mob/user, distance) . = ..() if(loc == user || distance <= 1) @@ -103,29 +109,17 @@ var/global/list/laser_wavelengths return ..() if(IS_SCREWDRIVER(W)) + // Unload the cell before the caps. + if(get_cell()) + return ..() if(length(capacitors)) var/obj/item/stock_parts/capacitor/capacitor = capacitors[1] capacitor.charge = 0 user.put_in_hands(capacitor) LAZYREMOVE(capacitors, capacitor) - else if(power_supply) - user.put_in_hands(power_supply) - power_supply = null - else - to_chat(user, SPAN_WARNING("\The [src] does not have a cell or capacitor installed.")) - return TRUE - playsound(loc, 'sound/items/Screwdriver2.ogg', 25) - update_icon() - return TRUE - - if(istype(W, /obj/item/cell)) - if(power_supply) - to_chat(user, SPAN_WARNING("\The [src] already has a cell installed.")) - else if(user.try_unequip(W, src)) - power_supply = W - to_chat(user, SPAN_NOTICE("You fit \the [W] into \the [src].")) + playsound(loc, 'sound/items/Screwdriver2.ogg', 25) update_icon() - return TRUE + return TRUE if(istype(W, /obj/item/stock_parts/capacitor)) if(length(capacitors) >= max_capacitors) @@ -147,7 +141,7 @@ var/global/list/laser_wavelengths charging = FALSE else var/new_wavelength = input("Select the desired laser wavelength.", "Capacitor Laser Wavelength", selected_wavelength) as null|anything in global.laser_wavelengths - if(!charging && new_wavelength != selected_wavelength && (loc == user || user.Adjacent(src)) && !user.incapacitated()) + if(!charging && new_wavelength && new_wavelength != selected_wavelength && (loc == user || user.Adjacent(src)) && !user.incapacitated()) selected_wavelength = new_wavelength to_chat(user, SPAN_NOTICE("You dial \the [src] wavelength to [selected_wavelength.name].")) update_icon() @@ -166,8 +160,9 @@ var/global/list/laser_wavelengths for(var/obj/item/stock_parts/capacitor/capacitor in capacitors) if(capacitor.charge < capacitor.max_charge) charged = FALSE + var/obj/item/cell/power_supply = get_cell() var/use_charge_cost = min(charge_cost * capacitor.rating, round((capacitor.max_charge - capacitor.charge) / capacitor_charge_constant)) - if(power_supply.use(use_charge_cost)) + if(power_supply?.use(use_charge_cost)) capacitor.charge(use_charge_cost * capacitor_charge_constant) update_icon() else @@ -183,6 +178,7 @@ var/global/list/laser_wavelengths var/total_charge_cost = 0 for(var/obj/item/stock_parts/capacitor/capacitor in capacitors) total_charge_cost += capacitor.max_charge + var/obj/item/cell/power_supply = get_cell() . = round(power_supply?.charge / (total_charge_cost / capacitor_charge_constant)) /obj/item/gun/energy/capacitor/on_update_icon() @@ -191,7 +187,7 @@ var/global/list/laser_wavelengths I.color = wiring_color I.appearance_flags |= RESET_COLOR add_overlay(I) - if(power_supply) + if(get_cell()) I = image(icon, "[icon_state]-cell") add_overlay(I) @@ -223,25 +219,24 @@ var/global/list/laser_wavelengths var/mob/M = loc M.update_inhand_overlays() -/obj/item/gun/energy/capacitor/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/gun/energy/capacitor/apply_gun_mob_overlays(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) + ..() if(overlay && (slot == BP_L_HAND || slot == BP_R_HAND || slot == slot_back_str)) var/image/I = image(overlay.icon, "[overlay.icon_state]-wiring") I.color = wiring_color I.appearance_flags |= RESET_COLOR overlay.add_overlay(I) - if(power_supply) + if(get_cell()) I = image(overlay.icon, "[overlay.icon_state]-cell") overlay.add_overlay(I) - if(slot != slot_back_str) - for(var/i = 1 to length(capacitors)) - var/obj/item/stock_parts/capacitor/capacitor = capacitors[i] - if(capacitor.charge > 0) - I = emissive_overlay(overlay.icon, "[overlay.icon_state]-charging-[i]") - I.alpha = clamp(255 * (capacitor.charge/capacitor.max_charge), 0, 255) - I.color = selected_wavelength.color - I.appearance_flags |= RESET_COLOR - overlay.overlays += I - . = ..() + for(var/i = 1 to length(capacitors)) + var/obj/item/stock_parts/capacitor/capacitor = capacitors[i] + if(capacitor.charge > 0) + I = emissive_overlay(overlay.icon, "[overlay.icon_state]-charging-[i]") + I.alpha = clamp(255 * (capacitor.charge/capacitor.max_charge), 0, 255) + I.color = selected_wavelength.color + I.appearance_flags |= RESET_COLOR + overlay.overlays += I /obj/item/gun/energy/capacitor/consume_next_projectile() @@ -270,17 +265,22 @@ var/global/list/laser_wavelengths one_hand_penalty = 6 fire_delay = 20 w_class = ITEM_SIZE_HUGE - power_supply = /obj/item/cell/super + +/obj/item/gun/energy/capacitor/rifle/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + loaded_cell_type = loaded_cell_type || /obj/item/cell/super + return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) /obj/item/gun/energy/capacitor/rifle/linear_fusion name = "linear fusion rifle" desc = "A chunky, angular, carbon-fiber-finish capacitor rifle, shipped complete with a self-charging power cell. The operating instructions seem to be written in backwards Cyrillic." color = COLOR_GRAY40 - power_supply = /obj/item/cell/infinite capacitors = /obj/item/stock_parts/capacitor/super projectile_type = /obj/item/projectile/beam/variable/split wiring_color = COLOR_GOLD +/obj/item/gun/energy/capacitor/rifle/linear_fusion/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/infinite, accepted_cell_type, /datum/extension/loaded_cell/unremovable, charge_value) + /obj/item/gun/energy/capacitor/rifle/linear_fusion/attackby(obj/item/W, mob/user) if(IS_SCREWDRIVER(W)) to_chat(user, SPAN_WARNING("\The [src] is hermetically sealed; you can't get the components out.")) diff --git a/code/modules/projectiles/guns/energy/ebow.dm b/code/modules/projectiles/guns/energy/ebow.dm index 08402cffafe..5a1bcde899a 100644 --- a/code/modules/projectiles/guns/energy/ebow.dm +++ b/code/modules/projectiles/guns/energy/ebow.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/guns/energy_crossbow.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_NORMAL - origin_tech = "{'combat':2,'magnets':2,'esoteric':5}" + origin_tech = @'{"combat":2,"magnets":2,"esoteric":5}' material = /decl/material/solid/metal/steel slot_flags = SLOT_LOWER_BODY silenced = 1 diff --git a/code/modules/projectiles/guns/energy/egun.dm b/code/modules/projectiles/guns/energy/egun.dm index be5d3b33eb3..ba6cfb04214 100644 --- a/code/modules/projectiles/guns/energy/egun.dm +++ b/code/modules/projectiles/guns/energy/egun.dm @@ -9,7 +9,7 @@ fire_delay = 10 // To balance for the fact that it is a pistol and can be used one-handed without penalty projectile_type = /obj/item/projectile/beam/stun - origin_tech = "{'combat':3,'magnets':2}" + origin_tech = @'{"combat":3,"magnets":2}' indicator_color = COLOR_CYAN firemodes = list( @@ -42,5 +42,6 @@ /obj/item/gun/energy/gun/reloadable name = "reloadable energy gun" desc = "Another bestseller of Lawson Arms and the FTU, the LAEP90 Perun is a versatile energy based sidearm, capable of switching between low, medium and high power projectile settings. In other words: stun, shock or kill." - power_supply = null - accepts_cell_type = /obj/item/cell/gun \ No newline at end of file + +/obj/item/gun/energy/gun/reloadable/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/gun, /obj/item/cell/gun, /datum/extension/loaded_cell, charge_value) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 5224730b58b..ee23a4ab706 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -8,7 +8,7 @@ force = 10 one_hand_penalty = 2 bulk = GUN_BULK_RIFLE - origin_tech = "{'combat':3,'magnets':2}" + origin_tech = @'{"combat":3,"magnets":2}' material = /decl/material/solid/metal/steel projectile_type = /obj/item/projectile/beam/midlaser matter = list( @@ -74,7 +74,7 @@ icon_state = "lasercannon" icon = 'icons/obj/guns/laser_cannon.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':4,'materials':3,'powerstorage':3}" + origin_tech = @'{"combat":4,"materials":3,"powerstorage":3}' slot_flags = SLOT_LOWER_BODY|SLOT_BACK one_hand_penalty = 6 //large and heavy w_class = ITEM_SIZE_HUGE @@ -98,9 +98,9 @@ one_hand_penalty = 0 has_safety = FALSE - /obj/item/gun/energy/laser/reloadable name = "reloadable laser carbine" desc = "A G40E carbine, designed to kill with concentrated energy blasts. Uses removable energy cells." - power_supply = null - accepts_cell_type = /obj/item/cell/gun + +/obj/item/gun/energy/laser/reloadable/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/gun, /obj/item/cell/gun, power_supply_extension_type, charge_value) diff --git a/code/modules/projectiles/guns/energy/laser_sniper.dm b/code/modules/projectiles/guns/energy/laser_sniper.dm index bc037c6c4a0..2b8efadc989 100644 --- a/code/modules/projectiles/guns/energy/laser_sniper.dm +++ b/code/modules/projectiles/guns/energy/laser_sniper.dm @@ -4,7 +4,7 @@ desc = "The HI DMR 9E is an older design. A designated marksman rifle capable of shooting powerful ionized beams, this is a weapon to kill from a distance." icon = 'icons/obj/guns/laser_sniper.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':6,'materials':5,'powerstorage':4}" + origin_tech = @'{"combat":6,"materials":5,"powerstorage":4}' projectile_type = /obj/item/projectile/beam/sniper one_hand_penalty = 5 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. slot_flags = SLOT_BACK diff --git a/code/modules/projectiles/guns/energy/lasertag.dm b/code/modules/projectiles/guns/energy/lasertag.dm index 2f029665387..e9857630b0b 100644 --- a/code/modules/projectiles/guns/energy/lasertag.dm +++ b/code/modules/projectiles/guns/energy/lasertag.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/guns/laser_carbine.dmi' icon_state = ICON_STATE_WORLD desc = "Standard issue weapon of the Imperial Guard." - origin_tech = "{'combat':1,'magnets':2}" + origin_tech = @'{"combat":1,"magnets":2}' self_recharge = 1 material = /decl/material/solid/metal/steel projectile_type = /obj/item/projectile/beam/lastertag/blue diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index c594990a7f4..b7ccef79df0 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -2,7 +2,7 @@ name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized reactor." icon = 'icons/obj/guns/adv_egun.dmi' - origin_tech = "{'combat':3,'materials':5,'powerstorage':3}" + origin_tech = @'{"combat":3,"materials":5,"powerstorage":3}' slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_LARGE force = 8 //looks heavier than a pistol diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index cb4878d05f1..0b8a92bd278 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -3,7 +3,7 @@ desc = "The Mk60 EW Halicon is a man portable anti-armor weapon designed to disable mechanical threats. Not the best of its type." icon = 'icons/obj/guns/ion_rifle.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':2,'magnets':4}" + origin_tech = @'{"combat":2,"magnets":4}' w_class = ITEM_SIZE_HUGE force = 10 obj_flags = OBJ_FLAG_CONDUCTIBLE @@ -23,12 +23,18 @@ /obj/item/gun/energy/ionrifle/emp_act(severity) ..(max(severity, 2)) //so it doesn't EMP itself, I guess +/obj/item/gun/energy/ionrifle/mounted + name = "mounted ion gun" + self_recharge = TRUE + use_external_power = TRUE + has_safety = FALSE + /obj/item/gun/energy/decloner name = "biological demolecularisor" desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." icon = 'icons/obj/guns/decloner.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':5,'materials':4,'powerstorage':3}" + origin_tech = @'{"combat":5,"materials":4,"powerstorage":3}' max_shots = 10 projectile_type = /obj/item/projectile/energy/declone combustion = 0 @@ -43,7 +49,7 @@ charge_cost = 10 max_shots = 10 projectile_type = /obj/item/projectile/energy/floramut - origin_tech = "{'materials':2,'biotech':3,'powerstorage':3}" + origin_tech = @'{"materials":2,"biotech":3,"powerstorage":3}' self_recharge = 1 material = /decl/material/solid/metal/steel matter = list( @@ -102,7 +108,7 @@ icon = 'icons/obj/guns/toxgun.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_NORMAL - origin_tech = "{'combat':5,'exoticmatter':4}" + origin_tech = @'{"combat":5,"exoticmatter":4}' projectile_type = /obj/item/projectile/energy/radiation material = /decl/material/solid/metal/steel matter = list( @@ -120,7 +126,7 @@ slot_flags = SLOT_LOWER_BODY|SLOT_BACK w_class = ITEM_SIZE_NORMAL force = 8 - origin_tech = "{'materials':4,'exoticmatter':4,'engineering':6,'combat':3}" + origin_tech = @'{"materials":4,"exoticmatter":4,"engineering":6,"combat":3}' material = /decl/material/solid/metal/steel projectile_type = /obj/item/projectile/beam/plasmacutter max_shots = 10 @@ -146,7 +152,8 @@ has_safety = FALSE /obj/item/gun/energy/plasmacutter/proc/slice(var/mob/M = null) - if(!safety() && power_supply.checked_use(charge_cost)) //consumes a shot per use + var/obj/item/cell/power_supply = get_cell() + if(!safety() && power_supply?.checked_use(charge_cost)) //consumes a shot per use if(M) M.welding_eyecheck()//Welding tool eye check if(check_accidents(M, "[M] loses grip on [src] from its sudden recoil!",SKILL_CONSTRUCTION, 60, SKILL_ADEPT)) @@ -165,10 +172,10 @@ icon = 'icons/obj/guns/incendiary_laser.dmi' icon_state = ICON_STATE_WORLD safety_icon = "safety" - origin_tech = "{'combat':7,'magnets':4,'esoteric':4}" + origin_tech = @'{"combat":7,"magnets":4,"esoteric":4}' material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) projectile_type = /obj/item/projectile/beam/incendiary_laser diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index ca42527292f..75de92c76f3 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -34,7 +34,7 @@ desc = "The Mars Military Industries MA21 Selkie is a weapon that uses a laser pulse to ionise the local atmosphere, creating a disorienting pulse of plasma and deafening shockwave as the wave expands." icon = 'icons/obj/guns/plasma_stun.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':2,'materials':2,'powerstorage':3}" + origin_tech = @'{"combat":2,"materials":2,"powerstorage":3}' fire_delay = 20 max_shots = 4 projectile_type = /obj/item/projectile/energy/plasmastun @@ -47,7 +47,7 @@ icon = 'icons/obj/guns/confuseray.dmi' icon_state = ICON_STATE_WORLD safety_icon = "safety" - origin_tech = "{'combat':2,'materials':2,'powerstorage':2}" + origin_tech = @'{"combat":2,"materials":2,"powerstorage":2}' w_class = ITEM_SIZE_SMALL max_shots = 4 projectile_type = /obj/item/projectile/beam/confuseray diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 7c8e9e1015c..15cd979e5fd 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -10,16 +10,18 @@ /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) charge_cost = 10 - origin_tech = "{'combat':3,'materials':4,'powerstorage':3,'magnets':2}" + origin_tech = @'{"combat":3,"materials":4,"powerstorage":3,"magnets":2}' slot_flags = SLOT_LOWER_BODY|SLOT_BACK one_hand_penalty = 2 projectile_type = /obj/item/projectile/temp - power_supply = /obj/item/cell/high combustion = 0 indicator_color = COLOR_GREEN var/firing_temperature = T20C var/current_temperature = T20C +/obj/item/gun/energy/temperature/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/high, /obj/item/cell, power_supply_extension_type, charge_value) + /obj/item/gun/energy/temperature/Initialize() . = ..() START_PROCESSING(SSobj, src) diff --git a/code/modules/projectiles/guns/energy/xray.dm b/code/modules/projectiles/guns/energy/xray.dm index 6c1bf530b82..cf20a5f1e00 100644 --- a/code/modules/projectiles/guns/energy/xray.dm +++ b/code/modules/projectiles/guns/energy/xray.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/guns/xray.dmi' icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY|SLOT_BACK - origin_tech = "{'combat':5,'materials':3,'magnets':2,'esoteric':2}" + origin_tech = @'{"combat":5,"materials":3,"magnets":2,"esoteric":2}' projectile_type = /obj/item/projectile/beam/xray/midlaser one_hand_penalty = 2 w_class = ITEM_SIZE_LARGE diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index fe3e26eb8af..78299825255 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -11,7 +11,7 @@ sharp = 1 edge = 0 lock_picking_level = 3 - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/arrow/proc/removed() //Helper for metal rods falling apart. return diff --git a/code/modules/projectiles/guns/launcher/foam_gun.dm b/code/modules/projectiles/guns/launcher/foam_gun.dm index 6e82e61e584..2334aabb90e 100644 --- a/code/modules/projectiles/guns/launcher/foam_gun.dm +++ b/code/modules/projectiles/guns/launcher/foam_gun.dm @@ -13,7 +13,7 @@ one_hand_penalty = 0 fire_sound = 'sound/weapons/foamblaster.ogg' fire_sound_text = "a pleasing 'pomp'" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/max_darts = 1 var/list/darts = new/list() @@ -89,7 +89,7 @@ throwforce = 0 throw_range = 3 does_spin = FALSE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/foam_dart/Initialize() mix_up() diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 56e02609c8f..4d9c170277a 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -3,7 +3,7 @@ desc = "A bulky pump-action grenade launcher. Holds up to 6 grenades in a revolving magazine." icon = 'icons/obj/guns/launcher/grenade.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':2,'materials':3}" + origin_tech = @'{"combat":2,"materials":3}' w_class = ITEM_SIZE_HUGE force = 10 diff --git a/code/modules/projectiles/guns/launcher/money_cannon.dm b/code/modules/projectiles/guns/launcher/money_cannon.dm index 964cf71c46d..bb585d1c534 100644 --- a/code/modules/projectiles/guns/launcher/money_cannon.dm +++ b/code/modules/projectiles/guns/launcher/money_cannon.dm @@ -3,7 +3,7 @@ desc = "A blocky, plastic novelty launcher that claims to be able to shoot money at considerable velocities." icon = 'icons/obj/guns/launcher/money.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':1,'materials':1}" + origin_tech = @'{"combat":1,"materials":1}' slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_SMALL release_force = 80 diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 4506d9ed397..85c47da5a63 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -3,7 +3,7 @@ desc = "A large gas-powered cannon." icon = 'icons/obj/guns/launcher/pneumatic.dmi' icon_state = ICON_STATE_WORLD - origin_tech = "{'combat':4,'materials':3}" + origin_tech = @'{"combat":4,"materials":3}' slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_HUGE obj_flags = OBJ_FLAG_CONDUCTIBLE @@ -133,7 +133,7 @@ icon_state = get_world_inventory_state() update_held_icon() -/obj/item/gun/launcher/pneumatic/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/gun/launcher/pneumatic/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && tank) overlay.icon_state += "-tank" . = ..() diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index 9d5e7429ad5..938eba04ffb 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -9,7 +9,7 @@ force = 5.0 obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = 0 - origin_tech = "{'combat':8,'materials':5}" + origin_tech = @'{"combat":8,"materials":5}' fire_sound = 'sound/effects/bang.ogg' combustion = 1 diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 4068e87fd34..7c3d0956a4f 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -17,8 +17,14 @@ . = ..() underlays.Cut() if(syringe) - underlays += image(syringe.icon, src, syringe.icon_state) - underlays += syringe.filling + var/mutable_appearance/MA = syringe.appearance + MA.pixel_x = 0 + MA.pixel_y = 0 + MA.pixel_w = 0 + MA.pixel_z = 0 + MA.layer = FLOAT_LAYER + MA.plane = FLOAT_PLANE + underlays += MA /obj/item/syringe_cartridge/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/chems/syringe) && user.try_unequip(I, src)) diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 8d737b3349f..3fb228c6ccc 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -5,33 +5,35 @@ icon_state = ICON_STATE_WORLD one_hand_penalty = 5 fire_delay = 20 - origin_tech = "{'combat':5,'materials':4,'esoteric':2,'magnets':4}" + origin_tech = @'{"combat":5,"materials":4,"esoteric":2,"magnets":4}' w_class = ITEM_SIZE_LARGE bulk = GUN_BULK_RIFLE combustion = 1 - var/obj/item/cell/cell // Currently installed powercell. - var/obj/item/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. + var/obj/item/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. var/removable_components = TRUE // Whether or not the gun can be dismantled. var/gun_unreliable = 15 // Percentage chance of detonating in your hands. var/obj/item/loaded // Currently loaded object, for retrieval/unloading. - var/load_type = /obj/item/stack/material/rods // Type of stack to load with. - var/load_sheet_max = 1 // Maximum number of "sheets" you can load from a stack. + var/load_type = /obj/item/stack/material/rods // Type of stack to load with. + var/load_sheet_max = 1 // Maximum number of "sheets" you can load from a stack. var/projectile_type = /obj/item/projectile/bullet/magnetic // Actual fire type, since this isn't throw_at rod launcher. var/power_cost = 950 // Cost per fire, should consume almost an entire basic cell. var/power_per_tick // Capacitor charge per process(). Updated based on capacitor rating. +/obj/item/gun/magnetic/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(loaded_cell_type, /obj/item/cell, (removable_components ? /datum/extension/loaded_cell : /datum/extension/loaded_cell/unremovable), charge_value) + /obj/item/gun/magnetic/preloaded - cell = /obj/item/cell/high capacitor = /obj/item/stock_parts/capacitor/adv +/obj/item/gun/magnetic/preloaded/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/high, accepted_cell_type, power_supply_extension_type, charge_value) + /obj/item/gun/magnetic/Initialize() START_PROCESSING(SSobj, src) - - if (ispath(cell)) - cell = new cell() + setup_power_supply() if (ispath(capacitor)) capacitor = new capacitor() capacitor.charge = capacitor.max_charge @@ -45,16 +47,13 @@ /obj/item/gun/magnetic/Destroy() STOP_PROCESSING(SSobj, src) - QDEL_NULL(cell) QDEL_NULL(loaded) QDEL_NULL(capacitor) . = ..() -/obj/item/gun/magnetic/get_cell() - return cell - /obj/item/gun/magnetic/Process() if(capacitor) + var/obj/item/cell/cell = get_cell() if(cell) if(capacitor.charge < capacitor.max_charge && cell.checked_use(power_per_tick)) capacitor.charge(power_per_tick) @@ -65,6 +64,7 @@ /obj/item/gun/magnetic/on_update_icon() . = ..() + var/obj/item/cell/cell = get_cell() if(removable_components) if(cell) add_overlay("[icon_state]_cell") @@ -89,13 +89,10 @@ /obj/item/gun/magnetic/examine(mob/user) . = ..() - if(cell) - to_chat(user, "The installed [cell.name] has a charge level of [round((cell.charge/cell.maxcharge)*100)]%.") - if(capacitor) - to_chat(user, "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%.") - if(!cell || !capacitor) + if(!get_cell() || !capacitor) to_chat(user, "The capacitor charge indicator is blinking [SPAN_RED("red")]. Maybe you should check the cell or capacitor.") else + to_chat(user, "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%.") if(capacitor.charge < power_cost) to_chat(user, "The capacitor charge indicator is [SPAN_ORANGE("amber")].") else @@ -104,18 +101,6 @@ /obj/item/gun/magnetic/attackby(var/obj/item/thing, var/mob/user) if(removable_components) - if(istype(thing, /obj/item/cell)) - if(cell) - to_chat(user, "\The [src] already has \a [cell] installed.") - return - if(!user.try_unequip(thing, src)) - return - cell = thing - playsound(loc, 'sound/machines/click.ogg', 10, 1) - user.visible_message("\The [user] slots \the [cell] into \the [src].") - update_icon() - return - if(IS_SCREWDRIVER(thing)) if(!capacitor) to_chat(user, "\The [src] has no capacitor installed.") @@ -126,7 +111,6 @@ capacitor = null update_icon() return - if(istype(thing, /obj/item/stock_parts/capacitor)) if(capacitor) to_chat(user, "\The [src] already has \a [capacitor] installed.") @@ -193,9 +177,8 @@ if(loaded) removing = loaded loaded = null - else if(cell && removable_components) - removing = cell - cell = null + else if(removable_components && get_cell()) + return ..() if(removing) user.put_in_hands(removing) user.visible_message(SPAN_NOTICE("\The [user] removes \the [removing] from \the [src].")) diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm index 1919ee1ef2f..30bb71cea69 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/guns/railgun.dmi' removable_components = TRUE // Can swap out the capacitor for more shots, or cell for longer usage before recharge load_type = /obj/item/rcd_ammo - origin_tech = "{'combat':5,'materials':4,'magnets':4}" + origin_tech = @'{"combat":5,"materials":4,"magnets":4}' projectile_type = /obj/item/projectile/bullet/magnetic/slug one_hand_penalty = 6 power_cost = 300 @@ -14,13 +14,14 @@ loaded = /obj/item/rcd_ammo/large // ~30 shots combustion = 1 bulk = GUN_BULK_RIFLE + 3 - - cell = /obj/item/cell/hyper capacitor = /obj/item/stock_parts/capacitor/adv // 6-8 shots gun_unreliable = 0 var/slowdown_held = 3 var/slowdown_worn = 2 +/obj/item/gun/magnetic/railgun/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/hyper, accepted_cell_type, power_supply_extension_type, charge_value) + /obj/item/gun/magnetic/railgun/Initialize() LAZYSET(slowdown_per_slot, BP_L_HAND, slowdown_held) LAZYSET(slowdown_per_slot, BP_R_HAND, slowdown_held) @@ -63,7 +64,6 @@ one_hand_penalty = 2 fire_delay = 8 removable_components = FALSE - cell = /obj/item/cell/hyper capacitor = /obj/item/stock_parts/capacitor/adv slot_flags = SLOT_BACK power_cost = 100 diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 8ea0a2a3da4..0954d63ee06 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -2,7 +2,7 @@ name = "gun" desc = "A gun that fires bullets." icon = 'icons/obj/guns/pistol.dmi' - origin_tech = "{'combat':2,'materials':2}" + origin_tech = @'{"combat":2,"materials":2}' w_class = ITEM_SIZE_NORMAL material = /decl/material/solid/metal/steel screen_shake = 1 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 56fe369ff51..a7614db6028 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -6,7 +6,7 @@ safety_icon = "safety" w_class = ITEM_SIZE_NORMAL caliber = CALIBER_PISTOL_SMALL - origin_tech = "{'combat':5,'materials':2}" + origin_tech = @'{"combat":5,"materials":2}' slot_flags = SLOT_LOWER_BODY|SLOT_BACK ammo_type = /obj/item/ammo_casing/pistol/small load_method = MAGAZINE @@ -44,7 +44,7 @@ w_class = ITEM_SIZE_HUGE force = 10 caliber = CALIBER_RIFLE - origin_tech = "{'combat':7,'materials':3}" + origin_tech = @'{"combat":7,"materials":3}' ammo_type = /obj/item/ammo_casing/rifle slot_flags = SLOT_BACK load_method = MAGAZINE @@ -82,7 +82,7 @@ /obj/item/gun/projectile/automatic/assault_rifle/grenade name = "assault rifle" desc = "The Z8 Bulldog is an older model bullpup carbine. This one has an underslung grenade launcher. REALLY makes you feel like a space marine when you hold it." - origin_tech = "{'combat':8,'materials':3}" + origin_tech = @'{"combat":8,"materials":3}' firemodes = list( list(mode_name="semi auto", burst=1, fire_delay=null, use_launcher=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), @@ -137,7 +137,7 @@ w_class = ITEM_SIZE_HUGE force = 10 caliber = CALIBER_RIFLE - origin_tech = "{'combat':9,'materials':3}" + origin_tech = @'{"combat":9,"materials":3}' ammo_type = /obj/item/ammo_casing/rifle load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/rifle/drum diff --git a/code/modules/projectiles/guns/projectile/bolt_action.dm b/code/modules/projectiles/guns/projectile/bolt_action.dm index 52d46d77d45..21f609064ad 100644 --- a/code/modules/projectiles/guns/projectile/bolt_action.dm +++ b/code/modules/projectiles/guns/projectile/bolt_action.dm @@ -6,12 +6,12 @@ w_class = ITEM_SIZE_HUGE force = 5 slot_flags = SLOT_BACK - origin_tech = "{'combat':4,'materials':2}" + origin_tech = @'{"combat":4,"materials":2}' caliber = CALIBER_RIFLE handle_casings = HOLD_CASINGS load_method = SINGLE_CASING max_shells = 1 - ammo_type = /obj/item/ammo_casing/shell + ammo_type = /obj/item/ammo_casing/rifle one_hand_penalty = 2 load_sound = 'sound/weapons/guns/interaction/rifle_load.ogg' fire_delay = 8 @@ -49,6 +49,7 @@ unload_shell() else to_chat(user, "You work the bolt open.") + playsound(src.loc, 'sound/weapons/guns/interaction/rifle_boltback.ogg', 50, 1) else to_chat(user, "You work the bolt closed.") playsound(src.loc, 'sound/weapons/guns/interaction/rifle_boltforward.ogg', 50, 1) @@ -77,7 +78,7 @@ desc = "A portable anti-armour rifle fitted with a scope, the HI PTR-7 Rifle was originally designed to be used against armoured exosuits. It is capable of punching through windows and non-reinforced walls with ease." icon = 'icons/obj/guns/heavysniper.dmi' force = 10 - origin_tech = "{'combat':7,'materials':2,'esoteric':8}" + origin_tech = @'{"combat":7,"materials":2,"esoteric":8}' caliber = CALIBER_ANTI_MATERIEL screen_shake = 2 //extra kickback one_hand_penalty = 6 @@ -85,4 +86,5 @@ bulk = 8 scoped_accuracy = 8 //increased accuracy over the LWAP because only one shot scope_zoom = 2 - fire_delay = 12 \ No newline at end of file + fire_delay = 12 + ammo_type = /obj/item/ammo_casing/shell diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index e273bfd34ee..f5a28572e21 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -41,7 +41,7 @@ else icon_state = get_world_inventory_state() -/obj/item/gun/projectile/dartgun/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/gun/projectile/dartgun/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && (slot in user_mob?.get_held_item_slots()) && ammo_magazine) overlay.icon_state += "-[clamp(length(ammo_magazine.stored_ammo.len), 0, 5)]" . = ..() diff --git a/code/modules/projectiles/guns/projectile/flaregun.dm b/code/modules/projectiles/guns/projectile/flaregun.dm index 7653d5dd68a..0a0cbea61c7 100644 --- a/code/modules/projectiles/guns/projectile/flaregun.dm +++ b/code/modules/projectiles/guns/projectile/flaregun.dm @@ -9,7 +9,7 @@ w_class = ITEM_SIZE_SMALL obj_flags = 0 slot_flags = SLOT_LOWER_BODY | SLOT_HOLSTER - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) caliber = CALIBER_SHOTGUN diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 9917cd8bcca..05f0b25ece0 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -32,7 +32,7 @@ caliber = CALIBER_PISTOL_SMALL silenced = 0 fire_delay = 4 - origin_tech = "{'combat':2,'materials':2,'esoteric':8}" + origin_tech = @'{"combat":2,"materials":2,"esoteric":8}' magazine_type = /obj/item/ammo_magazine/pistol/small allowed_magazines = /obj/item/ammo_magazine/pistol/small diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 4b7ad7b5e72..0358e6eb6b3 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD safety_icon = "safety" caliber = CALIBER_PISTOL_MAGNUM - origin_tech = "{'combat':2,'materials':2}" + origin_tech = @'{"combat":2,"materials":2}' handle_casings = CYCLE_CASINGS max_shells = 6 fire_delay = 12 //Revolvers are naturally slower-firing @@ -48,7 +48,7 @@ name = "cap gun" desc = "Looks almost like the real thing! Ages 8 and up." caliber = CALIBER_CAPS - origin_tech = "{'combat':1,'materials':1}" + origin_tech = @'{"combat":1,"materials":1}' ammo_type = /obj/item/ammo_casing/cap var/cap = TRUE diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 5bf38759b8d..f91b9fc9d49 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -9,7 +9,7 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_BACK caliber = CALIBER_SHOTGUN - origin_tech = "{'combat':4,'materials':2}" + origin_tech = @'{"combat":4,"materials":2}' load_method = SINGLE_CASING ammo_type = /obj/item/ammo_casing/shotgun/beanbag handle_casings = HOLD_CASINGS @@ -64,7 +64,7 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_BACK caliber = CALIBER_SHOTGUN - origin_tech = "{'combat':3,'materials':1}" + origin_tech = @'{"combat":3,"materials":1}' ammo_type = /obj/item/ammo_casing/shotgun/beanbag one_hand_penalty = 2 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b2e83f371ae..8094266a812 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -6,11 +6,11 @@ icon = 'icons/obj/projectiles.dmi' icon_state = "bullet" density = TRUE - unacidable = 1 anchored = TRUE //There's a reason this is here, Mport. God fucking damn it -Agouri. Find&Fix by Pete. The reason this is here is to stop the curving of emitter shots. pass_flags = PASS_FLAG_TABLE mouse_opacity = MOUSE_OPACITY_UNCLICKABLE randpixel = 0 + material = null is_spawnable_type = FALSE var/bumped = 0 //Prevents it from hitting more than one guy at once @@ -306,7 +306,7 @@ on_impact(A) set_density(0) - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) qdel(src) return 1 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index e174f6e1849..81a2a7f94b3 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -11,7 +11,7 @@ damage_flags = DAM_LASER eyeblur = 4 hitscan = 1 - invisibility = 101 //beam projectiles are invisible as they are rendered by the effect engine + invisibility = INVISIBILITY_ABSTRACT //beam projectiles are invisible as they are rendered by the effect engine penetration_modifier = 0.3 distance_falloff = 2.5 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index c431df0db47..b0918be164d 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -144,7 +144,7 @@ /* Miscellaneous */ /obj/item/projectile/bullet/blank - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT damage = 1 embed = 0 @@ -162,7 +162,7 @@ /obj/item/projectile/bullet/pistol/cap name = "cap" - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT fire_sound = null damage_type = PAIN damage_flags = 0 diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 30f3b48d403..a88e4070f8e 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -25,8 +25,8 @@ var/mob/living/silicon/robot/R = new(get_turf(M)) R.set_gender(M.get_gender()) R.job = ASSIGNMENT_ROBOT - R.mmi = new /obj/item/mmi(R) - R.mmi.transfer_identity(M) + R.central_processor = new /obj/item/organ/internal/brain_interface(R) + transfer_key_from_mob_to_mob(M, R) return R if(get_species_by_key(choice)) @@ -53,12 +53,8 @@ for (var/spell/S in M.mind.learned_spells) new_mob.add_spell(new S.type) new_mob.a_intent = "hurt" - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key + transfer_key_from_mob_to_mob(M, new_mob) to_chat(new_mob, "Your form morphs into that of \a [choice].") - qdel(M) else to_chat(M, "Your form morphs into that of \a [choice].") diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm index b03befe664a..1dd13a1aa6d 100644 --- a/code/modules/projectiles/targeting/targeting_mob.dm +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -27,11 +27,3 @@ ..() if(lying) stop_aiming(no_message=1) - -/mob/living/Destroy() - if(aiming) - qdel(aiming) - aiming = null - QDEL_NULL_LIST(aimed_at_by) - return ..() - diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index c9cc33f2a3a..8fd4de31574 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -176,9 +176,9 @@ update_icon() lock_time = world.time + 35 - events_repository.register(/decl/observ/moved, owner, src, /obj/aiming_overlay/proc/update_aiming) - events_repository.register(/decl/observ/moved, aiming_at, src, /obj/aiming_overlay/proc/target_moved) - events_repository.register(/decl/observ/destroyed, aiming_at, src, /obj/aiming_overlay/proc/cancel_aiming) + events_repository.register(/decl/observ/moved, owner, src, TYPE_PROC_REF(/obj/aiming_overlay, update_aiming)) + events_repository.register(/decl/observ/moved, aiming_at, src, TYPE_PROC_REF(/obj/aiming_overlay, target_moved)) + events_repository.register(/decl/observ/destroyed, aiming_at, src, TYPE_PROC_REF(/obj/aiming_overlay, cancel_aiming)) /obj/aiming_overlay/on_update_icon() if(locked) diff --git a/code/modules/radiation/radiation.dm b/code/modules/radiation/radiation.dm index df714006ba9..0feee45d773 100644 --- a/code/modules/radiation/radiation.dm +++ b/code/modules/radiation/radiation.dm @@ -23,12 +23,12 @@ /datum/radiation_source/proc/update_rad_power(var/new_power = null) if(new_power == null || new_power == rad_power) return // No change - else if(new_power <= config.radiation_lower_limit) + else if(new_power <= get_config_value(/decl/config/num/radiation_lower_limit)) qdel(src) // Decayed to nothing else rad_power = new_power if(!flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist + range = min(round(sqrt(rad_power / get_config_value(/decl/config/num/radiation_lower_limit))), 31) // R = rad_power / dist**2 - Solve for dist /turf var/cached_rad_resistance = 0 @@ -39,13 +39,13 @@ if(!(O.rad_resistance_modifier <= 0) && O.density) var/decl/material/M = O.get_material() if(!M) continue - cached_rad_resistance += (M.weight * O.rad_resistance_modifier) / config.radiation_material_resistance_divisor + cached_rad_resistance += (M.weight * O.rad_resistance_modifier) / get_config_value(/decl/config/num/radiation_material_resistance_divisor) // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana SSradiation.resistance_cache[src] = (length(contents) + 1) /turf/simulated/wall/calc_rad_resistance() SSradiation.resistance_cache[src] = (length(contents) + 1) - cached_rad_resistance = (density ? material.weight / config.radiation_material_resistance_divisor : 0) + cached_rad_resistance = (density ? material.weight / get_config_value(/decl/config/num/radiation_material_resistance_divisor) : 0) /obj var/rad_resistance_modifier = 1 // Allow overriding rad resistance diff --git a/code/modules/random_map/_random_map_setup.dm b/code/modules/random_map/_random_map_setup.dm index e89f0cd035d..afcb3288e31 100644 --- a/code/modules/random_map/_random_map_setup.dm +++ b/code/modules/random_map/_random_map_setup.dm @@ -3,30 +3,40 @@ */ #define MIN_SURFACE_COUNT_PER_CHUNK 0.1 -#define MIN_RARE_COUNT_PER_CHUNK 0.05 -#define MIN_DEEP_COUNT_PER_CHUNK 0.025 -#define RESOURCE_HIGH_MAX 4 -#define RESOURCE_HIGH_MIN 2 -#define RESOURCE_MID_MAX 3 -#define RESOURCE_MID_MIN 1 -#define RESOURCE_LOW_MAX 1 -#define RESOURCE_LOW_MIN 0 +#define MIN_RARE_COUNT_PER_CHUNK 0.05 +#define MIN_DEEP_COUNT_PER_CHUNK 0.025 +#define RESOURCE_HIGH_MAX 4 +#define RESOURCE_HIGH_MIN 2 +#define RESOURCE_MID_MAX 3 +#define RESOURCE_MID_MIN 1 +#define RESOURCE_LOW_MAX 1 +#define RESOURCE_LOW_MIN 0 +#define RESOURCE_COMMON_MAX 5 +#define RESOURCE_COMMON_MIN 3 -#define FLOOR_CHAR 0 -#define WALL_CHAR 1 -#define DOOR_CHAR 2 -#define EMPTY_CHAR 3 -#define ROOM_TEMP_CHAR 4 -#define MONSTER_CHAR 5 -#define ARTIFACT_TURF_CHAR 6 -#define ARTIFACT_CHAR 7 -#define CORRIDOR_TURF_CHAR 8 +#define FLOOR_CHAR 0 +#define WALL_CHAR 1 +#define DOOR_CHAR 2 +#define EMPTY_CHAR 3 +#define ROOM_TEMP_CHAR 4 +#define MONSTER_CHAR 5 +#define ARTIFACT_TURF_CHAR 6 +#define ARTIFACT_CHAR 7 +#define CORRIDOR_TURF_CHAR 8 #define TRANSLATE_COORD(X,Y) ((((Y) - 1) * limit_x) + (X)) #define TRANSLATE_AND_VERIFY_COORD(X,Y) TRANSLATE_AND_VERIFY_COORD_MLEN(X,Y,map.len) #define TRANSLATE_AND_VERIFY_COORD_MLEN(X,Y,LEN) \ tmp_cell = TRANSLATE_COORD(X,Y);\ + if (tmp_cell < 1 || tmp_cell > LEN) {\ + tmp_cell = null;\ + } + +#define TRANSLATE_COORD_OTHER_MAP(X,Y,MAP) ((((Y) - 1) * MAP.limit_x) + (X)) +#define TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(X,Y,MAP) TRANSLATE_AND_VERIFY_COORD_OTHER_MAP_MLEN(X, Y, MAP, MAP.map.len) +#define TRANSLATE_AND_VERIFY_COORD_OTHER_MAP_MLEN(X,Y,MAP,LEN) \ + tmp_cell = TRANSLATE_COORD_OTHER_MAP(X,Y,MAP);\ if (tmp_cell < 1 || tmp_cell > LEN) {\ tmp_cell = null;\ } \ No newline at end of file diff --git a/code/modules/random_map/building/building.dm b/code/modules/random_map/building/building.dm index 98a157c4599..5a24fa36708 100644 --- a/code/modules/random_map/building/building.dm +++ b/code/modules/random_map/building/building.dm @@ -6,7 +6,7 @@ /datum/random_map/building/generate_map() for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(!current_cell) continue if(x == 1 || y == 1 || x == limit_x || y == limit_y) @@ -18,7 +18,7 @@ var/list/possible_doors for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(!current_cell) continue if(!(x == 1 || y == 1 || x == limit_x || y == limit_y)) @@ -39,7 +39,10 @@ if(place_door) - possible_doors |= target_map.get_map_cell(tx+x,ty+y) + var/tmp_cell + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(tx+x, ty+y, target_map) + if(tmp_cell) + possible_doors |= tmp_cell if(possible_doors.len) // Place at least one door. diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index 60cadc79e2c..ca2a0af390e 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -47,7 +47,7 @@ // Draw walls/floors/doors. for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(!current_cell) continue @@ -73,7 +73,7 @@ map[current_cell] = SD_FLOOR_TILE // Draw the drop contents. - var/current_cell = get_map_cell(x_midpoint,y_midpoint) + var/current_cell = TRANSLATE_COORD(x_midpoint,y_midpoint) if(current_cell) map[current_cell] = SD_SUPPLY_TILE return 1 @@ -195,7 +195,7 @@ var/antag_type = input("Select an equipment template to use or cancel for nude.", null) as null|anything in all_antag_types if(antag_type) var/decl/special_role/A = all_antag_types[antag_type] - A.equip(spawned_mob) + A.equip_role(spawned_mob) if(alert("Are you SURE you wish to deploy this drop pod? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") == "No") if(spawned_mob) diff --git a/code/modules/random_map/dungeon/room.dm b/code/modules/random_map/dungeon/room.dm index 8c60a977c27..c95dff95a9f 100644 --- a/code/modules/random_map/dungeon/room.dm +++ b/code/modules/random_map/dungeon/room.dm @@ -41,35 +41,45 @@ If its complexity is lower than our theme's then for(var/j = 0, j < height, j++) var/truex = xorigin + x + i - 1 var/truey = yorigin + y + j - 1 - var/cell = map.get_map_cell(x+i,y+j) + var/tmp_cell + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i, y+j, map) + var/cell = tmp_cell room_theme.apply_room_theme(truex,truey,map.map[cell]) if(generate_doors && room_theme.door_type && !(map.map[cell] == WALL_CHAR || map.map[cell] == ARTIFACT_TURF_CHAR) && (i == 0 || i == width-1 || j == 0 || j == height-1)) var/isGood = 1 if(j == 0 || j == height-1) //check horizontally - var/curCell = map.map[map.get_map_cell(x+i-1,y+j)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i-1,y+j, map) + var/curCell = map.map[tmp_cell] if(curCell != WALL_CHAR && curCell != ARTIFACT_TURF_CHAR) isGood = 0 - curCell = map.map[map.get_map_cell(x+i+1,y+j)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i+1,y+j, map) + curCell = map.map[tmp_cell] if(curCell != WALL_CHAR && curCell != ARTIFACT_TURF_CHAR) isGood = 0 - curCell = map.map[map.get_map_cell(x+i,y+j-1)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i,y+j-1, map) + curCell = map.map[tmp_cell] if(curCell == WALL_CHAR || curCell == ARTIFACT_TURF_CHAR) isGood = 0 - curCell = map.map[map.get_map_cell(x+i,y+j+1)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i,y+j+1, map) + curCell = map.map[tmp_cell] if(curCell == WALL_CHAR || curCell == ARTIFACT_TURF_CHAR) isGood = 0 - if(i == 0 || i == width-1) //verticle + if(i == 0 || i == width-1) //vertical isGood = 1 //if it failed above, it might not fail here. - var/curCell = map.map[map.get_map_cell(x+i,y+j-1)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i,y+j-1, map) + var/curCell = map.map[tmp_cell] if(curCell != WALL_CHAR && curCell != ARTIFACT_TURF_CHAR) isGood = 0 - curCell = map.map[map.get_map_cell(x+i,y+j+1)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i,y+j+1, map) + curCell = map.map[tmp_cell] if(curCell != WALL_CHAR && curCell != ARTIFACT_TURF_CHAR) isGood = 0 - curCell = map.map[map.get_map_cell(x+i-1,y+j)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i-1,y+j, map) + curCell = map.map[tmp_cell] if(curCell == WALL_CHAR || curCell == ARTIFACT_TURF_CHAR) isGood = 0 - curCell = map.map[map.get_map_cell(x+i+1,y+j)] + TRANSLATE_AND_VERIFY_COORD_OTHER_MAP(x+i+1,y+j, map) + curCell = map.map[tmp_cell] if(curCell == WALL_CHAR || curCell == ARTIFACT_TURF_CHAR) isGood = 0 if(isGood) diff --git a/code/modules/random_map/dungeon/winding_dungeon.dm b/code/modules/random_map/dungeon/winding_dungeon.dm index dc66d864e75..e301ec2c887 100644 --- a/code/modules/random_map/dungeon/winding_dungeon.dm +++ b/code/modules/random_map/dungeon/winding_dungeon.dm @@ -154,11 +154,11 @@ logging("Winding Dungeon Generation Start") //first generate the border for(var/xx = 1, xx <= limit_x, xx++) - map[get_map_cell(xx,1)] = BORDER_CHAR - map[get_map_cell(xx,limit_y)] = BORDER_CHAR + map[TRANSLATE_COORD(xx,1)] = BORDER_CHAR + map[TRANSLATE_COORD(xx,limit_y)] = BORDER_CHAR for(var/yy = 1, yy < limit_y, yy++) - map[get_map_cell(1,yy)] = BORDER_CHAR - map[get_map_cell(limit_x,yy)] = BORDER_CHAR + map[TRANSLATE_COORD(1,yy)] = BORDER_CHAR + map[TRANSLATE_COORD(limit_x,yy)] = BORDER_CHAR var/num_of_features = limit_x * limit_y * features_multiplier logging("Number of features: [num_of_features]") @@ -197,7 +197,7 @@ logging("open_positions empty. Using randomly chosen coords ([newx],[newy])") //We want to make sure we aren't RIGHT next to another corridor or something. - if(map[get_map_cell(newx,newy+1)] == ARTIFACT_CHAR || map[get_map_cell(newx-1,newy)] == ARTIFACT_CHAR || map[get_map_cell(newx,newy-1)] == ARTIFACT_CHAR || map[get_map_cell(newx+1,newy)] == ARTIFACT_CHAR) + if(LAZYACCESS(map, TRANSLATE_COORD(newx,newy+1)) == ARTIFACT_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx-1,newy)) == ARTIFACT_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx,newy-1)) == ARTIFACT_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx+1,newy)) == ARTIFACT_CHAR) logging("Coords ([newx],[newy]) are too close to an ARTIFACT_CHAR position.") continue @@ -207,9 +207,9 @@ height = rand(room_size_min,room_size_max) isRoom = rand(100) <= chance_of_room - if(map[get_map_cell(newx, newy)] == ARTIFACT_TURF_CHAR || map[get_map_cell(newx, newy)] == CORRIDOR_TURF_CHAR) + if(LAZYACCESS(map, TRANSLATE_COORD(newx, newy)) == ARTIFACT_TURF_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx, newy)) == CORRIDOR_TURF_CHAR) //we are basically checking to see where we're going. Up, right, down or left and finding the bottom left corner. - if(map[get_map_cell(newx,newy+1)] == FLOOR_CHAR || map[get_map_cell(newx,newy+1)] == CORRIDOR_TURF_CHAR) //0 - down + if(LAZYACCESS(map, TRANSLATE_COORD(newx,newy+1)) == FLOOR_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx,newy+1)) == CORRIDOR_TURF_CHAR) //0 - down logging("This feature is DOWN") if(isRoom) //gotta do some math for this one, since the origin is centered. xmod = -width/2 @@ -219,7 +219,7 @@ ymod = -height //a lot of this will seem nonsense but I swear its not doorx = 0 doory = -1 - else if(map[get_map_cell(newx-1,newy)] == FLOOR_CHAR || map[get_map_cell(newx-1,newy)] == CORRIDOR_TURF_CHAR) //1 - right + else if(LAZYACCESS(map, TRANSLATE_COORD(newx-1,newy)) == FLOOR_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx-1,newy)) == CORRIDOR_TURF_CHAR) //1 - right logging("This feature is RIGHT") if(isRoom) ymod = -height/2 @@ -229,7 +229,7 @@ xmod = 1 doorx = 1 doory = 0 - else if(map[get_map_cell(newx,newy-1)] == FLOOR_CHAR || map[get_map_cell(newx,newy-1)] == CORRIDOR_TURF_CHAR) //2 - up + else if(LAZYACCESS(map, TRANSLATE_COORD(newx,newy-1)) == FLOOR_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx,newy-1)) == CORRIDOR_TURF_CHAR) //2 - up logging("This feature is UP") if(isRoom) xmod = -width/2 @@ -239,7 +239,7 @@ ymod = 1 doorx = 0 doory = 1 - else if(map[get_map_cell(newx+1,newy)] == FLOOR_CHAR || map[get_map_cell(newx+1,newy)] == CORRIDOR_TURF_CHAR) // 3 - left + else if(LAZYACCESS(map, TRANSLATE_COORD(newx+1,newy)) == FLOOR_CHAR || LAZYACCESS(map, TRANSLATE_COORD(newx+1,newy)) == CORRIDOR_TURF_CHAR) // 3 - left logging("This feature is LEFT") if(isRoom) ymod = -height/2 @@ -263,16 +263,17 @@ currentFeatures++ if(isRoom) logging("Room created at: [newx+xmod], [newy+ymod].") - map[get_map_cell(newx,newy)] = FLOOR_CHAR - map[get_map_cell(newx+doorx,newy+doory)] = ARTIFACT_CHAR + map[TRANSLATE_COORD(newx,newy)] = FLOOR_CHAR + map[TRANSLATE_COORD(newx+doorx,newy+doory)] = ARTIFACT_CHAR if(rand(0,100) >= chance_of_room_empty) var/room_result = create_room_features(round(newx+xmod),round(newy+ymod),width,height) logging("Attempted room feature creation: [room_result ? "Success" : "Failure"]") else logging("Creating corridor.") - var/door = get_map_cell(newx,newy) - if(map[door] == ARTIFACT_TURF_CHAR) - map[door] = ARTIFACT_CHAR + var/tmp_cell + TRANSLATE_AND_VERIFY_COORD(newx,newy) + if(map[tmp_cell] == ARTIFACT_TURF_CHAR) + map[tmp_cell] = ARTIFACT_CHAR logging("Map completed. Loops: [sanity], [currentFeatures] out of [num_of_features] created.") open_positions.Cut() @@ -287,17 +288,17 @@ if(xtemp < 0 || xtemp > limit_x) logging("We are beyond our x limits") return 0 - if(map[get_map_cell(xtemp,ytemp)] != WALL_CHAR) + if(map[TRANSLATE_COORD(xtemp,ytemp)] != WALL_CHAR) logging("[xtemp],[ytemp] is not equal to WALL_CHAR") return 0 else if(wall_char && (ytemp == truey || ytemp == truey + height - 1 || xtemp == truex || xtemp == truex + width - 1)) - map[get_map_cell(xtemp,ytemp)] = wall_char + map[TRANSLATE_COORD(xtemp,ytemp)] = wall_char if(!("[xtemp]:[ytemp]" in open_positions)) open_positions += "[xtemp]:[ytemp]" logging("Adding \"[xtemp]:[ytemp]\" to open_positions (length: [open_positions.len])") else - map[get_map_cell(xtemp,ytemp)] = char + map[TRANSLATE_COORD(xtemp,ytemp)] = char return 1 /datum/random_map/winding_dungeon/proc/create_room_features(var/rox,var/roy,var/width,var/height) diff --git a/code/modules/random_map/mazes/maze.dm b/code/modules/random_map/mazes/maze.dm index 557adbd6e8e..b9e5cc24b3e 100644 --- a/code/modules/random_map/mazes/maze.dm +++ b/code/modules/random_map/mazes/maze.dm @@ -31,19 +31,28 @@ // Preliminary marking-off... closedlist[next.name] = next - map[get_map_cell(next.x,next.y)] = FLOOR_CHAR + map[TRANSLATE_COORD(next.x,next.y)] = FLOOR_CHAR // Apply the values required and fill gap between this cell and origin point. + var/tmp_cell if(next.ox && next.oy) if(next.ox < next.x) - map[get_map_cell(next.x-1,next.y)] = FLOOR_CHAR + TRANSLATE_AND_VERIFY_COORD(next.x-1, next.y) + if(tmp_cell) + map[tmp_cell] = FLOOR_CHAR else if(next.ox == next.x) if(next.oy < next.y) - map[get_map_cell(next.x,next.y-1)] = FLOOR_CHAR + TRANSLATE_AND_VERIFY_COORD(next.x, next.y-1) + if(tmp_cell) + map[tmp_cell] = FLOOR_CHAR else - map[get_map_cell(next.x,next.y+1)] = FLOOR_CHAR + TRANSLATE_AND_VERIFY_COORD(next.x, next.y+1) + if(tmp_cell) + map[tmp_cell] = FLOOR_CHAR else - map[get_map_cell(next.x+1,next.y)] = FLOOR_CHAR + TRANSLATE_AND_VERIFY_COORD(next.x+1, next.y) + if(tmp_cell) + map[tmp_cell] = FLOOR_CHAR // Grab valid neighbors for use in the open list! add_to_openlist(next.x,next.y+2,next.x,next.y) @@ -60,6 +69,6 @@ if(tx < 1 || ty < 1 || tx > limit_x || ty > limit_y || !isnull(checked_coord_cache["[tx]-[ty]"])) return 0 checked_coord_cache["[tx]-[ty]"] = 1 - map[get_map_cell(tx,ty)] = DOOR_CHAR + map[TRANSLATE_COORD(tx,ty)] = DOOR_CHAR var/datum/maze_cell/new_cell = new(tx,ty,nx,ny) openlist |= new_cell diff --git a/code/modules/random_map/noise/magma.dm b/code/modules/random_map/noise/magma.dm index 0e3ac3c7945..d078ef6cdf1 100644 --- a/code/modules/random_map/noise/magma.dm +++ b/code/modules/random_map/noise/magma.dm @@ -9,25 +9,26 @@ /datum/random_map/noise/volcanism/cleanup() for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(map[current_cell] < 178) continue var/count - var/tmp_cell = get_map_cell(x+1,y+1) + var/tmp_cell + TRANSLATE_AND_VERIFY_COORD(x+1, y+1) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x-1,y-1) + TRANSLATE_AND_VERIFY_COORD(x-1,y-1) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x+1,y-1) + TRANSLATE_AND_VERIFY_COORD(x+1,y-1) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x-1,y+1) + TRANSLATE_AND_VERIFY_COORD(x-1,y+1) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x-1,y) + TRANSLATE_AND_VERIFY_COORD(x-1,y) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x,y-1) + TRANSLATE_AND_VERIFY_COORD(x,y-1) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x+1,y) + TRANSLATE_AND_VERIFY_COORD(x+1,y) if(tmp_cell && map[tmp_cell] >= 178) count++ - tmp_cell = get_map_cell(x,y+1) + TRANSLATE_AND_VERIFY_COORD(x,y+1) if(tmp_cell && map[tmp_cell] >= 178) count++ if(!count) map[current_cell] = 177 diff --git a/code/modules/random_map/noise/noise.dm b/code/modules/random_map/noise/noise.dm index 33cf03f5c7f..c8073c37f17 100644 --- a/code/modules/random_map/noise/noise.dm +++ b/code/modules/random_map/noise/noise.dm @@ -83,7 +83,7 @@ map[TRANSLATE_COORD(x+isize,y)] \ )/2) - map[get_map_cell(x,y+hsize)] = round(( \ + map[TRANSLATE_COORD(x,y+hsize)] = round(( \ map[TRANSLATE_COORD(x,y+isize)] + \ map[TRANSLATE_COORD(x,y)] \ )/2) @@ -137,6 +137,7 @@ total += map[TRANSLATE_COORD(x+1, y)] // x + blur_radius next_map[TRANSLATE_COORD(x, y)] = round(total / 3) // should technically be 2*blur_radius+1 // now do the same in the x axis + map = next_map.Copy() for(var/x = 1 to limit_x) // see comments above var/cellone = map[TRANSLATE_COORD(x, 1)] @@ -154,31 +155,55 @@ map = next_map if(smooth_single_tiles) - var/lonely for(var/x in 1 to limit_x - 1) for(var/y in 1 to limit_y - 1) - var/mapcell = get_map_cell(x,y) - var/list/neighbors = get_neighbors(x, y, TRUE) - lonely = TRUE - for(var/cell in neighbors) - if(get_appropriate_path(map[cell]) == get_appropriate_path(map[mapcell])) - lonely = FALSE - break - if(lonely) - map[mapcell] = map[pick(neighbors)] - + var/mapcell = TRANSLATE_COORD(x,y) + if(has_neighbor_with_path(x, y, get_appropriate_path(map[mapcell]), TRUE)) + continue + map[mapcell] = map[pick(get_neighbors(x, y, TRUE))] + +#define CHECK_NEIGHBOR_FOR_PATH(X, Y) \ + TRANSLATE_AND_VERIFY_COORD(X,Y);\ + if(tmp_cell && (get_appropriate_path(map[tmp_cell]) == path)) {\ + return TRUE;\ + } + +/// Checks if the cell at x,y has a neighbor with the given path. +/// Faster than looping over get_neighbors for the same purpose because it doesn't use list ops. +/datum/random_map/noise/proc/has_neighbor_with_path(x, y, path, include_diagonals) + var/tmp_cell + CHECK_NEIGHBOR_FOR_PATH(x-1,y) + CHECK_NEIGHBOR_FOR_PATH(x+1,y) + CHECK_NEIGHBOR_FOR_PATH(x,y+1) + CHECK_NEIGHBOR_FOR_PATH(x,y-1) + if(include_diagonals) + CHECK_NEIGHBOR_FOR_PATH(x+1,y+1) + CHECK_NEIGHBOR_FOR_PATH(x+1,y-1) + CHECK_NEIGHBOR_FOR_PATH(x-1,y-1) + CHECK_NEIGHBOR_FOR_PATH(x-1,y+1) + return FALSE + +#undef CHECK_NEIGHBOR_FOR_PATH + +#define VERIFY_AND_ADD_CELL(X, Y) \ + TRANSLATE_AND_VERIFY_COORD(X,Y);\ + if(tmp_cell) {\ + . += tmp_cell;\ + } + +/// Gets the neighbors of the cell at x, y, optionally including diagonals. +/// (x,y) and its neighbors can safely be invalid/not validated before calling. /datum/random_map/noise/proc/get_neighbors(x, y, include_diagonals) . = list() - if(!include_diagonals) - var/static/list/ortho_offsets = list(list(-1, 0), list(1, 0), list(0, 1), list(0,-1)) - for(var/list/offset in ortho_offsets) - var/tmp_cell = get_map_cell(x+offset[1],y+offset[2]) - if(tmp_cell) - . += tmp_cell - else - for(var/dx in -1 to 1) - for(var/dy in -1 to 1) - var/tmp_cell = get_map_cell(x+dx,y+dy) - if(tmp_cell) - . += tmp_cell - . -= get_map_cell(x,y) \ No newline at end of file + var/tmp_cell + VERIFY_AND_ADD_CELL(x-1,y) + VERIFY_AND_ADD_CELL(x+1,y) + VERIFY_AND_ADD_CELL(x,y+1) + VERIFY_AND_ADD_CELL(x,y-1) + if(include_diagonals) + VERIFY_AND_ADD_CELL(x+1,y+1) + VERIFY_AND_ADD_CELL(x+1,y-1) + VERIFY_AND_ADD_CELL(x-1,y-1) + VERIFY_AND_ADD_CELL(x-1,y+1) + +#undef VERIFY_AND_ADD_CELL \ No newline at end of file diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index 20e971700e5..826d85817de 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -8,30 +8,30 @@ var/min_deep_ratio = MIN_DEEP_COUNT_PER_CHUNK var/list/surface_metals = list( - /decl/material/solid/metal/iron = list(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX), - /decl/material/solid/metal/aluminium = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), - /decl/material/solid/metal/gold = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), - /decl/material/solid/metal/silver = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), - /decl/material/solid/metal/uranium = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + /decl/material/solid/metal/iron = list(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX), + /decl/material/solid/metal/aluminium = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), + /decl/material/solid/metal/gold = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), + /decl/material/solid/metal/silver = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), + /decl/material/solid/metal/uranium = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) ) var/list/rare_metals = list( - /decl/material/solid/metal/gold = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), - /decl/material/solid/metal/silver = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), - /decl/material/solid/metal/uranium = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), - /decl/material/solid/metal/osmium = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), - /decl/material/solid/rutile = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + /decl/material/solid/metal/gold = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), + /decl/material/solid/metal/silver = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), + /decl/material/solid/metal/uranium = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), + /decl/material/solid/metal/osmium = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), + /decl/material/solid/rutile = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX) ) var/list/deep_metals = list( - /decl/material/solid/metal/uranium = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), - /decl/material/solid/gemstone/diamond = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), - /decl/material/solid/metal/osmium = list(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX), - /decl/material/solid/metallic_hydrogen = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), - /decl/material/solid/rutile = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + /decl/material/solid/metal/uranium = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), + /decl/material/solid/gemstone/diamond = list(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX), + /decl/material/solid/metal/osmium = list(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX), + /decl/material/solid/metallic_hydrogen = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX), + /decl/material/solid/rutile = list(RESOURCE_MID_MIN, RESOURCE_MID_MAX) ) var/list/common_resources = list( - /decl/material/solid/sand = list(3,5), - /decl/material/solid/clay = list(3,5), - /decl/material/solid/graphite = list(3,5) + /decl/material/solid/sand = list(RESOURCE_COMMON_MIN, RESOURCE_COMMON_MAX), + /decl/material/solid/clay = list(RESOURCE_COMMON_MIN, RESOURCE_COMMON_MAX), + /decl/material/solid/graphite = list(RESOURCE_COMMON_MIN, RESOURCE_COMMON_MAX) ) /datum/random_map/noise/ore/New(var/tx, var/ty, var/tz, var/tlx, var/tly, var/do_not_apply, var/do_not_announce, var/used_area) @@ -94,19 +94,19 @@ var/tmp_cell TRANSLATE_AND_VERIFY_COORD(x, y) - - var/spawning - if(tmp_cell < rare_val) - spawning = surface_metals - else if(tmp_cell < deep_val) - spawning = rare_metals - else - spawning = deep_metals - - for(var/val in spawning) - var/list/ranges = spawning[val] - resources[val] = rand(ranges[1], ranges[2]) - set_extension(T, /datum/extension/buried_resources, resources) + if(tmp_cell) + var/spawning + if(tmp_cell < rare_val) + spawning = surface_metals + else if(tmp_cell < deep_val) + spawning = rare_metals + else + spawning = deep_metals + + for(var/val in spawning) + var/list/ranges = spawning[val] + resources[val] = rand(ranges[1], ranges[2]) + set_extension(T, /datum/extension/buried_resources, resources) /datum/random_map/noise/ore/get_map_char(var/value) if(value < rare_val) diff --git a/code/modules/random_map/noise/seafloor.dm b/code/modules/random_map/noise/seafloor.dm index ce3f584a20d..4283970e757 100644 --- a/code/modules/random_map/noise/seafloor.dm +++ b/code/modules/random_map/noise/seafloor.dm @@ -10,19 +10,13 @@ /datum/random_map/noise/seafloor/replace_space/get_appropriate_path(var/value) return /turf/exterior/seafloor/flooded -/turf/exterior/mud/flooded - flooded = TRUE - -/turf/exterior/mud/dark/flooded - flooded = TRUE - /datum/random_map/noise/seafloor/get_appropriate_path(var/value) var/val = min(9,max(0,round((value/cell_range)*10))) switch(val) if(6) - return /turf/exterior/mud/flooded + return /turf/exterior/clay/flooded if(7 to 9) - return /turf/exterior/mud/dark/flooded + return /turf/exterior/mud/flooded /datum/random_map/noise/seafloor/get_additional_spawns(var/value, var/turf/T) var/val = min(9,max(0,round((value/cell_range)*10))) diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index c0b3ce9fa9a..1919398f116 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -72,13 +72,6 @@ var/global/list/map_count = list() else admin_notice(SPAN_DANGER("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map."), R_DEBUG) -/datum/random_map/proc/get_map_cell(var/x,var/y) - if(!map) - set_map_size() - . = ((y-1)*limit_x)+x - if((. < 1) || (. > map.len)) - return null - /datum/random_map/proc/get_map_char(var/value) switch(value) if(WALL_CHAR) @@ -106,7 +99,7 @@ var/global/list/map_count = list() var/dat = "+------+
    " for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(current_cell) dat += get_map_char(map[current_cell]) dat += "
    " @@ -119,7 +112,7 @@ var/global/list/map_count = list() /datum/random_map/proc/seed_map() for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(prob(initial_wall_cell)) map[current_cell] = WALL_CHAR else @@ -128,7 +121,7 @@ var/global/list/map_count = list() /datum/random_map/proc/clear_map() for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - map[get_map_cell(x,y)] = 0 + map[TRANSLATE_COORD(x,y)] = 0 /datum/random_map/proc/generate() seed_map() @@ -165,7 +158,7 @@ var/global/list/map_count = list() apply_to_turf(x,y) /datum/random_map/proc/apply_to_turf(var/x,var/y) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(!current_cell) return 0 var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) @@ -201,14 +194,17 @@ var/global/list/map_count = list() ty-- // doesn't push it off-kilter by one. for(var/x = 1, x <= limit_x, x++) for(var/y = 1, y <= limit_y, y++) - var/current_cell = get_map_cell(x,y) + var/current_cell = TRANSLATE_COORD(x,y) if(!current_cell) continue if(tx+x > target_map.limit_x) continue if(ty+y > target_map.limit_y) continue - target_map.map[target_map.get_map_cell(tx+x,ty+y)] = map[current_cell] + var/tmp_cell + TRANSLATE_AND_VERIFY_COORD_MLEN(tx+x, ty+y, target_map.map.len) + if(tmp_cell) + target_map.map[tmp_cell] = map[current_cell] handle_post_overlay_on(target_map,tx,ty) diff --git a/code/modules/reagents/Chemistry-Grinder.dm b/code/modules/reagents/Chemistry-Grinder.dm index af0ebfe26b3..4a99f1941d6 100644 --- a/code/modules/reagents/Chemistry-Grinder.dm +++ b/code/modules/reagents/Chemistry-Grinder.dm @@ -192,7 +192,7 @@ update_icon() // Reset the machine. - addtimer(CALLBACK(src, .proc/end_grind, user), 6 SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(end_grind), user), 6 SECONDS, TIMER_UNIQUE) var/skill_factor = CLAMP01(1 + 0.3*(user.get_skill_value(skill_to_check) - SKILL_EXPERT)/(SKILL_EXPERT - SKILL_MIN)) // Process. diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index b81a7ddc576..6316e81d0e3 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -39,7 +39,9 @@ var/global/obj/temp_reagents_holder = new clone.cached_color = cached_color return clone -/datum/reagents/proc/get_reaction_loc() +/datum/reagents/proc/get_reaction_loc(chemical_reaction_flags) + if((chemical_reaction_flags & CHEM_REACTION_FLAG_OVERFLOW_CONTAINER) && ATOM_IS_OPEN_CONTAINER(my_atom)) + return get_turf(my_atom) return my_atom /datum/reagents/proc/get_primary_reagent_name(var/codex = FALSE) // Returns the name of the reagent with the biggest volume. @@ -51,7 +53,7 @@ var/global/obj/temp_reagents_holder = new . = reagent.name /datum/reagents/proc/get_primary_reagent_decl() - . = primary_reagent && GET_DECL(primary_reagent) + . = GET_DECL(primary_reagent) /datum/reagents/proc/update_total() // Updates volume. total_volume = 0 @@ -73,7 +75,7 @@ var/global/obj/temp_reagents_holder = new var/atom/location = get_reaction_loc() var/check_flags = location?.atom_flags || 0 - if(check_flags & ATOM_FLAG_NO_REACT) + if((check_flags & ATOM_FLAG_NO_REACT) && (check_flags & ATOM_FLAG_NO_PHASE_CHANGE) && (check_flags & ATOM_FLAG_NO_DISSOLVE)) return 0 var/reaction_occured = FALSE @@ -126,41 +128,42 @@ var/global/obj/temp_reagents_holder = new if(replace_sound) playsound(location, replace_sound, 80, 1) - else // Otherwise, collect all possible reactions. + else if(!(check_flags & ATOM_FLAG_NO_REACT)) // Otherwise, collect all possible reactions. eligible_reactions |= SSmaterials.chemical_reactions_by_id[R.type] - var/list/active_reactions = list() - - for(var/decl/chemical_reaction/C in eligible_reactions) - if(C.can_happen(src)) - active_reactions[C] = 1 // The number is going to be 1/(fraction of remaining reagents we are allowed to use), computed below - reaction_occured = 1 - - var/list/used_reagents = list() - // if two reactions share a reagent, each is allocated half of it, so we compute this here - for(var/decl/chemical_reaction/C in active_reactions) - var/list/adding = C.get_used_reagents() - for(var/R in adding) - LAZYADD(used_reagents[R], C) - - for(var/R in used_reagents) - var/counter = length(used_reagents[R]) - if(counter <= 1) - continue // Only used by one reaction, so nothing we need to do. - for(var/decl/chemical_reaction/C in used_reagents[R]) - active_reactions[C] = max(counter, active_reactions[C]) - counter-- //so the next reaction we execute uses more of the remaining reagents - // Note: this is not guaranteed to maximize the size of the reactions we do (if one reaction is limited by reagent A, we may be over-allocating reagent B to it) - // However, we are guaranteed to fully use up the most profligate reagent if possible. - // Further reactions may occur on the next tick, when this runs again. - - for(var/thing in active_reactions) - var/decl/chemical_reaction/C = thing - C.process(src, active_reactions[C]) - - for(var/thing in active_reactions) - var/decl/chemical_reaction/C = thing - C.post_reaction(src) + if(!(check_flags & ATOM_FLAG_NO_REACT)) + var/list/active_reactions = list() + + for(var/decl/chemical_reaction/C in eligible_reactions) + if(C.can_happen(src)) + active_reactions[C] = 1 // The number is going to be 1/(fraction of remaining reagents we are allowed to use), computed below + reaction_occured = 1 + + var/list/used_reagents = list() + // if two reactions share a reagent, each is allocated half of it, so we compute this here + for(var/decl/chemical_reaction/C in active_reactions) + var/list/adding = C.get_used_reagents() + for(var/R in adding) + LAZYADD(used_reagents[R], C) + + for(var/R in used_reagents) + var/counter = length(used_reagents[R]) + if(counter <= 1) + continue // Only used by one reaction, so nothing we need to do. + for(var/decl/chemical_reaction/C in used_reagents[R]) + active_reactions[C] = max(counter, active_reactions[C]) + counter-- //so the next reaction we execute uses more of the remaining reagents + // Note: this is not guaranteed to maximize the size of the reactions we do (if one reaction is limited by reagent A, we may be over-allocating reagent B to it) + // However, we are guaranteed to fully use up the most profligate reagent if possible. + // Further reactions may occur on the next tick, when this runs again. + + for(var/thing in active_reactions) + var/decl/chemical_reaction/C = thing + C.process(src, active_reactions[C]) + + for(var/thing in active_reactions) + var/decl/chemical_reaction/C = thing + C.post_reaction(src) update_total() @@ -458,7 +461,7 @@ var/global/obj/temp_reagents_holder = new if (!target || !target.reagents || !target.simulated) return - amount = min(amount, REAGENT_VOLUME(src, type)) + amount = max(0, min(amount, REAGENT_VOLUME(src, type), REAGENTS_FREE_SPACE(target.reagents) / multiplier)) if(!amount) return @@ -473,7 +476,7 @@ var/global/obj/temp_reagents_holder = new if (!target) return - amount = min(amount, REAGENT_VOLUME(src, type)) + amount = max(0, min(amount, REAGENT_VOLUME(src, type), REAGENTS_FREE_SPACE(target) / multiplier)) if(!amount) return diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index d3a7228bd38..c56c0a0dc81 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -59,7 +59,7 @@ blood_splatter(T, src, 1) else if(isalien(W)) var/obj/effect/decal/cleanable/blood/B = blood_splatter(T, holder.my_atom, 1) - if(B) + if(!QDELETED(B)) B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" /decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) diff --git a/code/modules/reagents/chems/chems_cleaner.dm b/code/modules/reagents/chems/chems_cleaner.dm index 2b977a8380b..5bd2e9454e5 100644 --- a/code/modules/reagents/chems/chems_cleaner.dm +++ b/code/modules/reagents/chems/chems_cleaner.dm @@ -9,3 +9,31 @@ turf_touch_threshold = 0.1 uid = "chem_cleaner" exoplanet_rarity_gas = MAT_RARITY_EXOTIC + +/decl/material/liquid/contaminant_cleaner + name = "akaline detergent" + lore_text = "A highly akaline hydrazine based detergent. Able to clean contaminants, but may release ammonia gas if used in open air." + taste_description = "bleach" + vapor_products = list(/decl/material/gas/ammonia = 0.5) + color = "#213799" + touch_met = 5 + toxicity = 5 + scent = "clean linen" + scent_descriptor = SCENT_DESC_FRAGRANCE + value = 0.25 + dirtiness = DIRTINESS_DECONTAMINATE + decontamination_dose = 5 + turf_touch_threshold = 0.1 + uid = "chem_contaminant_cleaner" + exoplanet_rarity_gas = MAT_RARITY_EXOTIC + +/decl/material/liquid/cleaner/soap + name = "soap" + lore_text = "A soft solid compound used to clean things. Usually derived from oil or fat." + taste_description = "waxy blandness" + color = COLOR_BEIGE + uid = "chem_soap" + melting_point = 323 + ignition_point = 353 + boiling_point = 373 + accelerant_value = 0.3 diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index 8866c5377dc..465931dd12a 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -33,7 +33,7 @@ /decl/material/liquid/glowsap/on_leaving_metabolism(datum/reagents/metabolism/holder) if(ishuman(holder?.my_atom)) var/mob/living/carbon/human/H = holder.my_atom - addtimer(CALLBACK(H, /mob/living/carbon/human/proc/update_eyes), 5 SECONDS) + addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, update_eyes)), 5 SECONDS) . = ..() /decl/material/liquid/glowsap/affect_overdose(var/mob/living/M) diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 9f14d313f25..4009ab27374 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -4,7 +4,8 @@ taste_description = "pure alcohol" color = "#404030" touch_met = 5 - fuel_value = 0.75 + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT solvent_power = MAT_SOLVENT_MODERATE uid = "chem_ethanol" diff --git a/code/modules/reagents/chems/chems_fuel.dm b/code/modules/reagents/chems/chems_fuel.dm index 9b86de1e4fb..f631468ba4a 100644 --- a/code/modules/reagents/chems/chems_fuel.dm +++ b/code/modules/reagents/chems/chems_fuel.dm @@ -4,7 +4,8 @@ taste_description = "gross metal" color = "#660000" touch_met = 5 - fuel_value = 1 + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT + 0.2 burn_product = /decl/material/gas/carbon_monoxide gas_flags = XGM_GAS_FUEL exoplanet_rarity_plant = MAT_RARITY_UNCOMMON @@ -45,5 +46,5 @@ metabolism = REM * 0.2 touch_met = 5 value = 1.2 - fuel_value = 1.2 + accelerant_value = FUEL_VALUE_ACCELERANT + 0.5 uid = "chem_hydrazine" diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 79add600924..1e04eee2dd2 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -10,9 +10,16 @@ uid = "chem_nutriment" exoplanet_rarity_gas = MAT_RARITY_NOWHERE // Please, no more animal protein or glowsap or corn oil atmosphere. + // Technically a room-temperature solid, but saves + // repathing it to /solid all over the codebase. + melting_point = 323 + ignition_point = 353 + boiling_point = 373 + accelerant_value = 0.65 + var/nutriment_factor = 10 // Per unit var/hydration_factor = 0 // Per unit - var/injectable = 0 + var/injectable = FALSE /decl/material/liquid/nutriment/mix_data(var/datum/reagents/reagents, var/list/newdata, var/newamount) @@ -102,6 +109,8 @@ taste_description = "egg" color = "#ffffaa" uid = "chem_nutriment_egg" + melting_point = 273 + boiling_point = 373 //vegetamarian alternative that is safe for vegans to ingest//rewired it from its intended nutriment/protein/egg/softtofu because it would not actually work, going with plan B, more recipes. @@ -120,6 +129,8 @@ color = "#ffff00" fruit_descriptor = "rich" uid = "chem_nutriment_honey" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/flour name = "flour" @@ -145,6 +156,8 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_nutriment_batter" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/batter/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) ..() @@ -257,6 +270,8 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_nutriment_soysauce" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/ketchup name = "ketchup" @@ -267,6 +282,8 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_nutriment_ketchup" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/banana_cream name = "banana cream" @@ -276,6 +293,8 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_nutriment_bananacream" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/barbecue name = "barbecue sauce" @@ -286,6 +305,8 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_nutriment_bbqsauce" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/garlicsauce name = "garlic sauce" @@ -296,6 +317,8 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_nutriment_garlicsauce" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/rice name = "rice" @@ -326,6 +349,8 @@ color = "#801e28" fruit_descriptor = "sweet" uid = "chem_nutriment_cherryjelly" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/cornoil name = "corn oil" @@ -336,6 +361,8 @@ color = "#302000" slipperiness = 8 uid = "chem_nutriment_cornoil" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/sprinkles name = "sprinkles" @@ -369,6 +396,8 @@ color = "#e8dfd0" taste_mult = 3 uid = "chem_nutriment_vinegar" + melting_point = 273 + boiling_point = 373 /decl/material/liquid/nutriment/mayo name = "mayonnaise" diff --git a/code/modules/reagents/chems/chems_pigments.dm b/code/modules/reagents/chems/chems_pigments.dm index 1a64670f9ad..dafbb8f7870 100644 --- a/code/modules/reagents/chems/chems_pigments.dm +++ b/code/modules/reagents/chems/chems_pigments.dm @@ -63,6 +63,35 @@ color = "#aaaaaa" uid = "chem_pigment_white" +/decl/material/liquid/paint_stripper + name = "paint stripper" + uid = "liquid_paint_remover" + lore_text = "A highly toxic compound used as an effective paint stripper." + taste_description = "bleach and acid" + color = "#a0a0a0" + metabolism = REM * 0.2 + value = 0.1 + solvent_power = MAT_SOLVENT_MODERATE + toxicity = 10 + +/decl/material/liquid/paint_stripper/proc/remove_paint(var/atom/painting, var/datum/reagents/holder) + if(istype(painting) && istype(holder)) + var/keep_alpha = painting.alpha + painting.reset_color() + painting.set_alpha(keep_alpha) + +/decl/material/liquid/paint_stripper/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) + if(istype(T) && !isspaceturf(T)) + remove_paint(T, holder) + +/decl/material/liquid/paint_stripper/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) + if(istype(O)) + remove_paint(O, holder) + +/decl/material/liquid/paint_stripper/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) + if(istype(M)) + remove_paint(M, holder) + /decl/material/liquid/paint name = "paint" lore_text = "This paint will stick to almost any object." @@ -76,8 +105,8 @@ /decl/material/liquid/paint/proc/apply_paint(var/atom/painting, var/datum/reagents/holder) if(istype(painting) && istype(holder)) var/keep_alpha = painting.alpha - painting.color = holder.get_color() - painting.alpha = keep_alpha + painting.set_color(holder.get_color()) + painting.set_alpha(keep_alpha) /decl/material/liquid/paint/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) if(istype(T) && !isspaceturf(T)) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index f8774477f22..d34a0361704 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -6,9 +6,9 @@ w_class = ITEM_SIZE_NORMAL volume = CARTRIDGE_VOLUME_LARGE amount_per_transfer_from_this = 50 + material = /decl/material/solid/stone/ceramic // Large, but inaccurate. Use a chem dispenser or beaker for accuracy. possible_transfer_amounts = @"[50,100]" - unacidable = 1 /obj/item/chems/chem_disp_cartridge/initialize_reagents(populate = TRUE) . = ..() @@ -63,7 +63,7 @@ return TRUE if(standard_pour_into(user, target)) return TRUE - if(standard_feed_mob(user, target)) + if(handle_eaten_by_mob(user, target) != EATEN_INVALID) return TRUE if(user.a_intent == I_HURT) if(standard_splash_mob(user,target)) diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index ef9070fd880..1a5287a0035 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -130,8 +130,8 @@ events_repository.unregister(/decl/observ/destroyed, container, src) container = new_container if(container) - events_repository.register(/decl/observ/moved, container, src, .proc/check_container_status) - events_repository.register(/decl/observ/destroyed, container, src, .proc/check_container_status) + events_repository.register(/decl/observ/moved, container, src, PROC_REF(check_container_status)) + events_repository.register(/decl/observ/destroyed, container, src, PROC_REF(check_container_status)) update_icon() SSnano.update_uis(src) // update all UIs attached to src diff --git a/code/modules/reagents/reactions/_reaction.dm b/code/modules/reagents/reactions/_reaction.dm index 16756785735..6e245b6f6ea 100644 --- a/code/modules/reagents/reactions/_reaction.dm +++ b/code/modules/reagents/reactions/_reaction.dm @@ -15,6 +15,9 @@ var/log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. var/lore_text var/mechanics_text + var/reaction_category + /// Flags used when reaction processing. + var/chemical_reaction_flags = 0 /decl/chemical_reaction/proc/can_happen(var/datum/reagents/holder) //check that all the required reagents are present @@ -29,7 +32,7 @@ if(holder.has_any_reagent(inhibitors)) return 0 - var/atom/location = holder.get_reaction_loc() + var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) var/temperature = location?.temperature || T20C if(temperature < minimum_temperature || temperature > maximum_temperature) return 0 @@ -37,7 +40,7 @@ return 1 /decl/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) - var/atom/location = holder.get_reaction_loc() + var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(thermal_product && location && ATOM_SHOULD_TEMPERATURE_ENQUEUE(location)) ADJUST_ATOM_TEMPERATURE(location, thermal_product) @@ -47,7 +50,7 @@ for(var/reagent in required_reagents) . += reagent -/decl/chemical_reaction/proc/get_reaction_flags(var/datum/reagents/holder) +/decl/chemical_reaction/proc/get_alternate_reaction_indicator(var/datum/reagents/holder) return 0 /decl/chemical_reaction/proc/process(var/datum/reagents/holder, var/limit) @@ -59,7 +62,7 @@ if(reaction_volume > A) reaction_volume = A - var/reaction_flags = get_reaction_flags(holder) + var/alt_reaction_indicator = get_alternate_reaction_indicator(holder) for(var/reactant in required_reagents) holder.remove_reagent(reactant, reaction_volume * required_reagents[reactant], safety = 1) @@ -69,11 +72,11 @@ if(result) holder.add_reagent(result, amt_produced, data, safety = 1) - on_reaction(holder, amt_produced, reaction_flags) + on_reaction(holder, amt_produced, alt_reaction_indicator) //called after processing reactions, if they occurred /decl/chemical_reaction/proc/post_reaction(var/datum/reagents/holder) - var/atom/container = holder.get_reaction_loc() + var/atom/container = holder.get_reaction_loc(chemical_reaction_flags) if(mix_message && container && !ismob(container)) var/turf/T = get_turf(container) if(istype(T)) diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 3993ba177bc..6fbf57294cc 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -1,5 +1,6 @@ /decl/chemical_reaction/recipe abstract_type = /decl/chemical_reaction/recipe + reaction_category = REACTION_TYPE_RECIPE /decl/chemical_reaction/recipe/moonshine name = "Moonshine" diff --git a/code/modules/reagents/reactions/reaction_alloys.dm b/code/modules/reagents/reactions/reaction_alloys.dm index 056c84f260b..61bd616d6a8 100644 --- a/code/modules/reagents/reactions/reaction_alloys.dm +++ b/code/modules/reagents/reactions/reaction_alloys.dm @@ -3,6 +3,7 @@ maximum_temperature = INFINITY reaction_sound = null mix_message = null + reaction_category = REACTION_TYPE_ALLOYING abstract_type = /decl/chemical_reaction/alloy /decl/chemical_reaction/alloy/borosilicate diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm new file mode 100644 index 00000000000..25fe15e5b28 --- /dev/null +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -0,0 +1,123 @@ +/decl/chemical_reaction/compound + abstract_type = /decl/chemical_reaction/compound + reaction_category = REACTION_TYPE_COMPOUND + +/decl/chemical_reaction/compound/surfactant + name = "Azosurfactant" + result = /decl/material/liquid/surfactant + required_reagents = list(/decl/material/liquid/fuel/hydrazine = 2, /decl/material/solid/carbon = 2, /decl/material/liquid/acid = 1) + result_amount = 5 + mix_message = "The solution begins to foam gently." + +/decl/chemical_reaction/compound/space_cleaner + name = "Space cleaner" + result = /decl/material/liquid/cleaner + required_reagents = list(/decl/material/gas/ammonia = 1, /decl/material/liquid/water = 1) + mix_message = "The solution becomes slick and soapy." + result_amount = 2 + +/decl/chemical_reaction/compound/plantbgone + name = "Plant-B-Gone" + result = /decl/material/liquid/weedkiller + required_reagents = list( + /decl/material/liquid/bromide = 1, + /decl/material/liquid/water = 4 + ) + result_amount = 5 + +/decl/chemical_reaction/compound/foaming_agent + name = "Foaming Agent" + result = /decl/material/liquid/foaming_agent + required_reagents = list(/decl/material/solid/lithium = 1, /decl/material/liquid/fuel/hydrazine = 1) + result_amount = 1 + mix_message = "The solution begins to foam vigorously." + +/decl/chemical_reaction/compound/sodiumchloride + name = "Sodium Chloride" + result = /decl/material/solid/sodiumchloride + required_reagents = list(/decl/material/solid/sodium = 1, /decl/material/liquid/acid/hydrochloric = 1) + result_amount = 2 + +/decl/chemical_reaction/compound/hair_remover + name = "Hair Remover" + result = /decl/material/liquid/hair_remover + required_reagents = list(/decl/material/solid/metal/radium = 1, /decl/material/solid/potassium = 1, /decl/material/liquid/acid/hydrochloric = 1) + result_amount = 3 + mix_message = "The solution thins out and emits an acrid smell." + +/decl/chemical_reaction/compound/methyl_bromide + name = "Methyl Bromide" + required_reagents = list( + /decl/material/liquid/bromide = 1, + /decl/material/liquid/ethanol = 1, + /decl/material/liquid/fuel/hydrazine = 1 + ) + result_amount = 3 + result = /decl/material/gas/methyl_bromide + mix_message = "The solution begins to bubble, emitting a dark vapor." + +/decl/chemical_reaction/compound/luminol + name = "Luminol" + result = /decl/material/liquid/luminol + required_reagents = list(/decl/material/liquid/fuel/hydrazine = 2, /decl/material/solid/carbon = 2, /decl/material/gas/ammonia = 2) + result_amount = 6 + mix_message = "The solution begins to gleam with a fey inner light." + +/decl/chemical_reaction/compound/anfo + name = "Fertilizer ANFO" + result = /decl/material/liquid/anfo + required_reagents = list( + /decl/material/liquid/fertilizer = 20, + /decl/material/liquid/fuel = 10 + ) + result_amount = 15 + mix_message = "The solution gives off the eye-watering reek of spilled fertilizer and petroleum." + +/decl/chemical_reaction/compound/anfo4 + name = "Chemlab ANFO" + result = /decl/material/liquid/anfo + required_reagents = list( + /decl/material/gas/ammonia = 10, + /decl/material/liquid/fuel = 5 + ) + result_amount = 15 + mix_message = "The solution gives off the eye-watering reek of spilled fertilizer and petroleum." + +/decl/chemical_reaction/compound/anfo_plus + name = "ANFO+" + result = /decl/material/liquid/anfo/plus + required_reagents = list( + /decl/material/liquid/anfo = 15, + /decl/material/solid/metal/aluminium = 5 + ) + result_amount = 20 + mix_message = "The solution gives off the eye-watering reek of spilled fertilizer and petroleum." + +/decl/chemical_reaction/compound/crystal_agent + name = "Crystallizing Agent" + result = /decl/material/liquid/crystal_agent + required_reagents = list(/decl/material/solid/silicon = 1, /decl/material/solid/metal/tungsten = 1, /decl/material/liquid/acid/polyacid = 1) + minimum_temperature = 150 CELSIUS + maximum_temperature = 200 CELSIUS + result_amount = 3 + +/decl/chemical_reaction/compound/paint + name = "Paint" + result = /decl/material/liquid/paint + required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/liquid/water = 3) + result_amount = 5 + mix_message = "The solution thickens and takes on a glossy sheen." + +/decl/chemical_reaction/compound/paint_stripper + name = "Paint Stripper" + //TODO: some way to mix chlorine and methane to make proper paint stripper. + required_reagents = list(/decl/material/liquid/acetone = 2, /decl/material/liquid/acid = 2) + result = /decl/material/liquid/paint_stripper + result_amount = 4 + mix_message = "The mixture thins and clears." + +/decl/chemical_reaction/compound/contaminant_cleaner + name = "Akaline Detergent" + result = /decl/material/liquid/contaminant_cleaner + required_reagents = list(/decl/material/solid/sodium = 1, /decl/material/liquid/surfactant = 1) + result_amount = 2 diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index 03eac2e230b..c45f33878db 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -1,10 +1,14 @@ -/decl/chemical_reaction/antitoxins +/decl/chemical_reaction/drug + abstract_type = /decl/chemical_reaction/drug + reaction_category = REACTION_TYPE_PHARMACEUTICAL + +/decl/chemical_reaction/drug/antitoxins name = "Antitoxins" result = /decl/material/liquid/antitoxins required_reagents = list(/decl/material/solid/silicon = 1, /decl/material/solid/potassium = 1, /decl/material/gas/ammonia = 1) result_amount = 3 -/decl/chemical_reaction/painkillers +/decl/chemical_reaction/drug/painkillers name = "Mild Painkillers" result = /decl/material/liquid/painkillers required_reagents = list( @@ -14,7 +18,7 @@ ) result_amount = 3 -/decl/chemical_reaction/strong_painkillers +/decl/chemical_reaction/drug/strong_painkillers name = "Strong Painkillers" result = /decl/material/liquid/painkillers/strong required_reagents = list( @@ -24,19 +28,19 @@ ) result_amount = 3 -/decl/chemical_reaction/antiseptic +/decl/chemical_reaction/drug/antiseptic name = "Antiseptic" result = /decl/material/liquid/antiseptic required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 -/decl/chemical_reaction/mutagenics +/decl/chemical_reaction/drug/mutagenics name = "Unstable mutagen" result = /decl/material/liquid/mutagenics required_reagents = list(/decl/material/solid/metal/radium = 1, /decl/material/solid/phosphorus = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 -/decl/chemical_reaction/psychoactives +/decl/chemical_reaction/drug/psychoactives name = "Psychoactives" result = /decl/material/liquid/psychoactives required_reagents = list(/decl/material/liquid/mercury = 1, /decl/material/liquid/nutriment/sugar = 1, /decl/material/solid/lithium = 1) @@ -44,39 +48,39 @@ minimum_temperature = 50 CELSIUS maximum_temperature = (50 CELSIUS) + 100 -/decl/chemical_reaction/lube +/decl/chemical_reaction/drug/lube name = "Lubricant" result = /decl/material/liquid/lube required_reagents = list(/decl/material/liquid/water = 1, /decl/material/solid/silicon = 1, /decl/material/liquid/acetone = 1) result_amount = 3 mix_message = "The solution becomes thick and slimy." -/decl/chemical_reaction/pacid +/decl/chemical_reaction/drug/pacid name = "Polytrinic acid" result = /decl/material/liquid/acid/polyacid required_reagents = list(/decl/material/liquid/acid = 1, /decl/material/liquid/acid/hydrochloric = 1, /decl/material/solid/potassium = 1) result_amount = 3 -/decl/chemical_reaction/antirads +/decl/chemical_reaction/drug/antirads name = "Anti-Radiation Medication" result = /decl/material/liquid/antirads required_reagents = list(/decl/material/solid/metal/radium = 1, /decl/material/liquid/antitoxins = 1) result_amount = 2 -/decl/chemical_reaction/narcotics +/decl/chemical_reaction/drug/narcotics name = "Narcotics" result = /decl/material/liquid/narcotics required_reagents = list(/decl/material/liquid/mercury = 1, /decl/material/liquid/acetone = 1, /decl/material/liquid/nutriment/sugar = 1) result_amount = 2 -/decl/chemical_reaction/burn_meds +/decl/chemical_reaction/drug/burn_meds name = "Anti-Burn Medication" result = /decl/material/liquid/burn_meds required_reagents = list(/decl/material/solid/silicon = 1, /decl/material/solid/carbon = 1) result_amount = 2 log_is_important = 1 -/decl/chemical_reaction/presyncopics +/decl/chemical_reaction/drug/presyncopics name = "Presyncopics" result = /decl/material/liquid/presyncopics required_reagents = list(/decl/material/solid/potassium = 1, /decl/material/liquid/acetone = 1, /decl/material/liquid/nutriment/sugar = 1) @@ -84,44 +88,44 @@ maximum_temperature = 60 CELSIUS result_amount = 3 -/decl/chemical_reaction/regenerator +/decl/chemical_reaction/drug/regenerator name = "Regenerative Serum" result = /decl/material/liquid/regenerator required_reagents = list(/decl/material/liquid/stabilizer = 1, /decl/material/liquid/antitoxins = 1) result_amount = 2 -/decl/chemical_reaction/neuroannealer +/decl/chemical_reaction/drug/neuroannealer name = "Neuroannealer" result = /decl/material/liquid/neuroannealer required_reagents = list(/decl/material/liquid/acid/hydrochloric = 1, /decl/material/gas/ammonia = 1, /decl/material/liquid/antitoxins = 1) result_amount = 2 -/decl/chemical_reaction/oxy_meds +/decl/chemical_reaction/drug/oxy_meds name = "Oxygen Deprivation Medication" result = /decl/material/liquid/oxy_meds required_reagents = list(/decl/material/liquid/acetone = 1, /decl/material/liquid/water = 1, /decl/material/solid/sulfur = 1) result_amount = 1 -/decl/chemical_reaction/brute_meds +/decl/chemical_reaction/drug/brute_meds name = "Anti-Trauma Medication" result = /decl/material/liquid/brute_meds required_reagents = list(/decl/material/liquid/stabilizer = 1, /decl/material/solid/carbon = 1) inhibitors = list(/decl/material/liquid/nutriment/sugar = 1) // Messes up with adrenaline result_amount = 2 -/decl/chemical_reaction/amphetamines +/decl/chemical_reaction/drug/amphetamines name = "Amphetamines" result = /decl/material/liquid/amphetamines required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/solid/phosphorus = 1, /decl/material/solid/sulfur = 1) result_amount = 3 -/decl/chemical_reaction/retrovirals +/decl/chemical_reaction/drug/retrovirals name = "Retrovirals" result = /decl/material/liquid/retrovirals required_reagents = list(/decl/material/liquid/antirads = 1, /decl/material/solid/carbon = 1) result_amount = 2 -/decl/chemical_reaction/nanitefluid +/decl/chemical_reaction/compound/nanitefluid name = "Nanite Fluid" result = /decl/material/liquid/nanitefluid required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/solid/metal/aluminium = 1, /decl/material/liquid/lube = 1) @@ -131,19 +135,19 @@ maximum_temperature = -25 CELSIUS mix_message = "The solution becomes a metallic slime." -/decl/chemical_reaction/antibiotics +/decl/chemical_reaction/drug/antibiotics name = "Antibiotics" result = /decl/material/liquid/antibiotics required_reagents = list(/decl/material/liquid/presyncopics = 1, /decl/material/liquid/stabilizer = 1) result_amount = 2 -/decl/chemical_reaction/eyedrops +/decl/chemical_reaction/drug/eyedrops name = "Eye Drops" result = /decl/material/liquid/eyedrops required_reagents = list(/decl/material/solid/carbon = 1, /decl/material/liquid/fuel/hydrazine = 1, /decl/material/liquid/antitoxins = 1) result_amount = 2 -/decl/chemical_reaction/sedatives +/decl/chemical_reaction/drug/sedatives name = "Sedatives" result = /decl/material/liquid/sedatives required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/nutriment/sugar = 4 @@ -153,13 +157,13 @@ ) // Messes with the smoke result_amount = 5 -/decl/chemical_reaction/paralytics +/decl/chemical_reaction/drug/paralytics name = "Paralytics" result = /decl/material/liquid/paralytics required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) result_amount = 1 -/decl/chemical_reaction/zombiepowder +/decl/chemical_reaction/drug/zombiepowder name = "Zombie Powder" result = /decl/material/liquid/zombiepowder required_reagents = list(/decl/material/liquid/carpotoxin = 5, /decl/material/liquid/sedatives = 5, /decl/material/solid/metal/copper = 5) @@ -168,7 +172,7 @@ maximum_temperature = 99 CELSIUS mix_message = "The solution boils off to form a fine powder." -/decl/chemical_reaction/hallucinogenics +/decl/chemical_reaction/drug/hallucinogenics name = "Hallucinogenics" result = /decl/material/liquid/hallucinogenics required_reagents = list(/decl/material/solid/silicon = 1, /decl/material/liquid/fuel/hydrazine = 1, /decl/material/liquid/antitoxins = 1) @@ -177,85 +181,31 @@ minimum_temperature = 75 CELSIUS maximum_temperature = (75 CELSIUS) + 25 -/decl/chemical_reaction/surfactant - name = "Azosurfactant" - result = /decl/material/liquid/surfactant - required_reagents = list(/decl/material/liquid/fuel/hydrazine = 2, /decl/material/solid/carbon = 2, /decl/material/liquid/acid = 1) - result_amount = 5 - mix_message = "The solution begins to foam gently." - -/decl/chemical_reaction/space_cleaner - name = "Space cleaner" - result = /decl/material/liquid/cleaner - required_reagents = list(/decl/material/gas/ammonia = 1, /decl/material/liquid/water = 1) - mix_message = "The solution becomes slick and soapy." - result_amount = 2 - -/decl/chemical_reaction/plantbgone - name = "Plant-B-Gone" - result = /decl/material/liquid/weedkiller - required_reagents = list( - /decl/material/liquid/bromide = 1, - /decl/material/liquid/water = 4 - ) - result_amount = 5 - -/decl/chemical_reaction/foaming_agent - name = "Foaming Agent" - result = /decl/material/liquid/foaming_agent - required_reagents = list(/decl/material/solid/lithium = 1, /decl/material/liquid/fuel/hydrazine = 1) - result_amount = 1 - mix_message = "The solution begins to foam vigorously." - -/decl/chemical_reaction/sodiumchloride - name = "Sodium Chloride" - result = /decl/material/solid/sodiumchloride - required_reagents = list(/decl/material/solid/sodium = 1, /decl/material/liquid/acid/hydrochloric = 1) - result_amount = 2 - -/decl/chemical_reaction/stimulants +/decl/chemical_reaction/drug/stimulants name = "Stimulants" result = /decl/material/liquid/stimulants required_reagents = list(/decl/material/liquid/hallucinogenics = 1, /decl/material/solid/lithium = 1) result_amount = 3 -/decl/chemical_reaction/antidepressants +/decl/chemical_reaction/drug/antidepressants name = "Antidepressants" result = /decl/material/liquid/antidepressants required_reagents = list(/decl/material/liquid/hallucinogenics = 1, /decl/material/solid/carbon = 1) result_amount = 3 -/decl/chemical_reaction/hair_remover - name = "Hair Remover" - result = /decl/material/liquid/hair_remover - required_reagents = list(/decl/material/solid/metal/radium = 1, /decl/material/solid/potassium = 1, /decl/material/liquid/acid/hydrochloric = 1) - result_amount = 3 - mix_message = "The solution thins out and emits an acrid smell." - -/decl/chemical_reaction/methyl_bromide - name = "Methyl Bromide" - required_reagents = list( - /decl/material/liquid/bromide = 1, - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/fuel/hydrazine = 1 - ) - result_amount = 3 - result = /decl/material/gas/methyl_bromide - mix_message = "The solution begins to bubble, emitting a dark vapor." - -/decl/chemical_reaction/adrenaline +/decl/chemical_reaction/drug/adrenaline name = "Adrenaline" result = /decl/material/liquid/adrenaline required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/amphetamines = 1, /decl/material/liquid/oxy_meds = 1) result_amount = 3 -/decl/chemical_reaction/stabilizer +/decl/chemical_reaction/drug/stabilizer name = "Stabilizer" result = /decl/material/liquid/stabilizer required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/solid/carbon = 1, /decl/material/liquid/acetone = 1) result_amount = 3 -/decl/chemical_reaction/gleam +/decl/chemical_reaction/drug/gleam name = "Gleam" result = /decl/material/liquid/glowsap/gleam result_amount = 2 @@ -270,14 +220,14 @@ /decl/material/liquid/glowsap = 2 ) -/decl/chemical_reaction/immunobooster +/decl/chemical_reaction/drug/immunobooster name = "Immunobooster" result = /decl/material/liquid/immunobooster required_reagents = list(/decl/material/liquid/presyncopics = 1, /decl/material/liquid/antitoxins = 1) minimum_temperature = 40 CELSIUS result_amount = 2 -/decl/chemical_reaction/clotting_agent +/decl/chemical_reaction/drug/clotting_agent name = "Clotting Agent" result = /decl/material/liquid/clotting_agent required_reagents = list( @@ -286,3 +236,10 @@ /decl/material/liquid/carpotoxin = 1 ) result_amount = 2 + +/decl/chemical_reaction/drug/nanoblood + name = "Nanoblood" + result = /decl/material/liquid/nanoblood + required_reagents = list(/decl/material/liquid/nanitefluid = 1, /decl/material/solid/metal/iron = 1, /decl/material/liquid/blood = 1) + result_amount = 3 + mix_message = "The solution thickens slowly into a glossy liquid." diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index 1bc2f9aa9ec..f32859c611c 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -2,6 +2,7 @@ result = null abstract_type = /decl/chemical_reaction/grenade_reaction result_amount = 1 + chemical_reaction_flags = CHEM_REACTION_FLAG_OVERFLOW_CONTAINER /decl/chemical_reaction/grenade_reaction/explosion_potassium name = "Explosion" @@ -11,10 +12,10 @@ /decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/atom/location = holder.get_reaction_loc() + var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), location, 0, 0) + e.set_up(round(created_volume/3, 1), location, 0, 0) if(isliving(location)) e.amount *= 0.5 var/mob/living/L = location @@ -32,7 +33,7 @@ /decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/turf/location = get_turf(holder.get_reaction_loc()) + var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) spark_at(location, amount=2, cardinal_only = TRUE) for(var/mob/living/carbon/M in viewers(world.view, location)) @@ -58,7 +59,7 @@ /decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/turf/location = holder.get_reaction_loc() + var/turf/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. @@ -79,7 +80,7 @@ /decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/turf/location = get_turf(holder.get_reaction_loc()) + var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(istype(location)) location.assume_gas(/decl/material/gas/hydrogen, created_volume, FLAMMABLE_GAS_FLASHPOINT + 10) spark_at(location, amount=1, cardinal_only = TRUE) @@ -93,7 +94,7 @@ /decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem S.attach(location) @@ -112,7 +113,7 @@ /decl/chemical_reaction/grenade_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/turf/location = get_turf(holder.get_reaction_loc()) + var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) location.visible_message(SPAN_WARNING("The solution spews out foam!"), range = 5) var/datum/effect/effect/system/foam_spread/s = new() @@ -129,7 +130,7 @@ /decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/atom/location = holder.get_reaction_loc() + var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) if(istype(location, /obj/item/sealant_tank)) var/obj/item/sealant_tank/foam = location @@ -151,7 +152,7 @@ /decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/turf/location = get_turf(holder.get_reaction_loc()) + var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) location.visible_message(SPAN_WARNING("The solution spews out a metallic foam!"), range = 5) var/datum/effect/effect/system/foam_spread/s = new() diff --git a/code/modules/reagents/reactions/reaction_other.dm b/code/modules/reagents/reactions/reaction_other.dm index 680e3564aa1..cd4dcb2ae3d 100644 --- a/code/modules/reagents/reactions/reaction_other.dm +++ b/code/modules/reagents/reactions/reaction_other.dm @@ -6,72 +6,13 @@ var/strength = 3 /decl/chemical_reaction/soap_key/can_happen(var/datum/reagents/holder) - if(istype(holder.get_reaction_loc(), /obj/item/soap)) + if(istype(holder.get_reaction_loc(chemical_reaction_flags), /obj/item/soap)) return ..() return 0 /decl/chemical_reaction/soap_key/on_reaction(var/datum/reagents/holder) - var/obj/item/soap/S = holder.get_reaction_loc() + var/obj/item/soap/S = holder.get_reaction_loc(chemical_reaction_flags) if(istype(S) && S.key_data) - var/obj/item/key/soap/key = new(get_turf(S), S.key_data) + var/obj/item/key/soap/key = new(get_turf(S), null, S.key_data) key.uses = strength ..() - -/decl/chemical_reaction/luminol - name = "Luminol" - result = /decl/material/liquid/luminol - required_reagents = list(/decl/material/liquid/fuel/hydrazine = 2, /decl/material/solid/carbon = 2, /decl/material/gas/ammonia = 2) - result_amount = 6 - mix_message = "The solution begins to gleam with a fey inner light." - -/decl/chemical_reaction/nanoblood - name = "Nanoblood" - result = /decl/material/liquid/nanoblood - required_reagents = list(/decl/material/liquid/nanitefluid = 1, /decl/material/solid/metal/iron = 1, /decl/material/liquid/blood = 1) - result_amount = 3 - mix_message = "The solution thickens slowly into a glossy liquid." - -/decl/chemical_reaction/anfo - name = "Fertilizer ANFO" - result = /decl/material/liquid/anfo - required_reagents = list( - /decl/material/liquid/fertilizer = 20, - /decl/material/liquid/fuel = 10 - ) - result_amount = 15 - mix_message = "The solution gives off the eye-watering reek of spilled fertilizer and petroleum." - -/decl/chemical_reaction/anfo4 - name = "Chemlab ANFO" - result = /decl/material/liquid/anfo - required_reagents = list( - /decl/material/gas/ammonia = 10, - /decl/material/liquid/fuel = 5 - ) - result_amount = 15 - mix_message = "The solution gives off the eye-watering reek of spilled fertilizer and petroleum." - -/decl/chemical_reaction/anfo_plus - name = "ANFO+" - result = /decl/material/liquid/anfo/plus - required_reagents = list( - /decl/material/liquid/anfo = 15, - /decl/material/solid/metal/aluminium = 5 - ) - result_amount = 20 - mix_message = "The solution gives off the eye-watering reek of spilled fertilizer and petroleum." - -/decl/chemical_reaction/crystal_agent - name = "Crystallizing Agent" - result = /decl/material/liquid/crystal_agent - required_reagents = list(/decl/material/solid/silicon = 1, /decl/material/solid/metal/tungsten = 1, /decl/material/liquid/acid/polyacid = 1) - minimum_temperature = 150 CELSIUS - maximum_temperature = 200 CELSIUS - result_amount = 3 - -/decl/chemical_reaction/paint - name = "Paint" - result = /decl/material/liquid/paint - required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/liquid/water = 3) - result_amount = 5 - mix_message = "The solution thickens and takes on a glossy sheen." diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index 7bc273ca6a5..6a63aa7f0c5 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -6,7 +6,7 @@ /decl/chemical_reaction/recipe/food/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(obj_result && isturf(location)) for(var/i = 1, i <= created_volume, i++) new obj_result(location) diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 511219aa387..51eb037fe30 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -4,6 +4,7 @@ result_amount = 1 mix_message = "The solution hardens and begins to crystallize." abstract_type = /decl/chemical_reaction/synthesis + reaction_category = REACTION_TYPE_SYNTHESIS /decl/chemical_reaction/synthesis/fiberglass name = "Fiberglass" @@ -14,13 +15,13 @@ /decl/chemical_reaction/synthesis/fiberglass/Initialize() required_reagents = list( /decl/material/solid/glass = CEILING(REAGENT_UNITS_PER_MATERIAL_SHEET/2), - /decl/material/solid/plastic = CEILING(REAGENT_UNITS_PER_MATERIAL_SHEET/2) + /decl/material/solid/organic/plastic = CEILING(REAGENT_UNITS_PER_MATERIAL_SHEET/2) ) . = ..() /decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags) ..() - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) created_volume = CEILING(created_volume) if(created_volume > 0) @@ -47,7 +48,7 @@ return TRUE /decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, reaction_flags) - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() for(var/rtype in holder.reagent_volumes) @@ -81,7 +82,7 @@ return TRUE /decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, reaction_flags) - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() for(var/rtype in holder.reagent_volumes) @@ -101,9 +102,9 @@ /decl/chemical_reaction/synthesis/plastication/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) - SSmaterials.create_object(/decl/material/solid/plastic, location, created_volume) + SSmaterials.create_object(/decl/material/solid/organic/plastic, location, created_volume) /decl/chemical_reaction/synthesis/resin_pack name = "Resin Globule" @@ -116,7 +117,7 @@ /decl/chemical_reaction/synthesis/resin_pack/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) ..() - var/turf/T = get_turf(holder.get_reaction_loc()) + var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(istype(T)) var/create_stacks = FLOOR(created_volume) if(create_stacks > 0) diff --git a/code/modules/reagents/reagent_container_edibility.dm b/code/modules/reagents/reagent_container_edibility.dm new file mode 100644 index 00000000000..07c9eca5dc1 --- /dev/null +++ b/code/modules/reagents/reagent_container_edibility.dm @@ -0,0 +1,8 @@ +/obj/item/chems/get_edible_material_amount(var/mob/eater) + return reagents?.total_volume + +/obj/item/chems/get_food_default_transfer_amount(mob/eater) + return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) + +/obj/item/chems/get_food_consumption_method(mob/eater) + return EATING_METHOD_DRINK diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index ac3fe9a1b7a..d835cd8a53b 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -4,8 +4,9 @@ icon = 'icons/obj/items/chem/container.dmi' icon_state = null w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW + abstract_type = /obj/item/chems var/base_name var/base_desc @@ -24,6 +25,14 @@ if(!possible_transfer_amounts) src.verbs -= /obj/item/chems/verb/set_amount_per_transfer_from_this +/obj/item/chems/set_custom_name(var/new_name) + base_name = new_name + update_container_name() + +/obj/item/chems/set_custom_desc(var/new_desc) + base_desc = new_desc + update_container_desc() + /obj/item/chems/proc/cannot_interact(mob/user) if(!CanPhysicallyInteract(user)) to_chat(usr, SPAN_WARNING("You're in no condition to do that!")) @@ -41,7 +50,7 @@ /obj/item/chems/on_update_icon() . = ..() if(detail_state) - add_overlay(overlay_image(icon, "[icon_state][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) + add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) /obj/item/chems/proc/update_container_name() var/newname = get_base_name() @@ -68,6 +77,7 @@ desc = new_desc_list.Join("\n") /obj/item/chems/on_reagent_change() + ..() update_container_name() update_container_desc() update_icon() @@ -143,69 +153,6 @@ reagents.splash(target, reagents.total_volume) return 1 -/obj/item/chems/proc/self_feed_message(var/mob/user) - to_chat(user, SPAN_NOTICE("You eat \the [src]")) - -/obj/item/chems/proc/other_feed_message_start(var/mob/user, var/mob/target) - user.visible_message(SPAN_NOTICE("[user] is trying to feed [target] \the [src]!")) - -/obj/item/chems/proc/other_feed_message_finish(var/mob/user, var/mob/target) - user.visible_message(SPAN_NOTICE("[user] has fed [target] \the [src]!")) - -/obj/item/chems/proc/feed_sound(var/mob/user) - return - -/obj/item/chems/proc/standard_feed_mob(var/mob/user, var/mob/target) // This goes into attack - if(!istype(target)) - return 0 - - if(!reagents || !reagents.total_volume) - to_chat(user, SPAN_NOTICE("\The [src] is empty.")) - return 1 - - // only carbons can eat - if(iscarbon(target)) - if(target == user) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(!H.check_has_mouth()) - to_chat(user, "Where do you intend to put \the [src]? You don't have a mouth!") - return - var/obj/item/blocked = H.check_mouth_coverage() - if(blocked) - to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) - return - - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //puts a limit on how fast people can eat/drink things - self_feed_message(user) - reagents.trans_to_mob(user, issmall(user) ? CEILING(amount_per_transfer_from_this/2) : amount_per_transfer_from_this, CHEM_INGEST) - feed_sound(user) - add_trace_DNA(user) - return 1 - - - else - if(!user.can_force_feed(target, src)) - return - - other_feed_message_start(user, target) - - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(!do_mob(user, target)) - return - - other_feed_message_finish(user, target) - - var/contained = REAGENT_LIST(src) - admin_attack_log(user, target, "Fed the victim with [name] (Reagents: [contained])", "Was fed [src] (Reagents: [contained])", "used [src] (Reagents: [contained]) to feed") - - reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_INGEST) - feed_sound(user) - add_trace_DNA(target) - return 1 - - return 0 - /obj/item/chems/proc/standard_pour_into(var/mob/user, var/atom/target) // This goes into afterattack and yes, it's atom-level if(!target.reagents) return 0 diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index edb8766faeb..5aaca6207b0 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -4,7 +4,7 @@ desc = "A beaker." icon = 'icons/obj/items/chem/beakers/beaker.dmi' icon_state = ICON_STATE_WORLD - center_of_mass = @"{'x':15,'y':10}" + center_of_mass = @'{"x":15,"y":10}' material = /decl/material/solid/glass material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME material_force_multiplier = 0.25 @@ -69,7 +69,7 @@ name = "large beaker" desc = "A large beaker." icon = 'icons/obj/items/chem/beakers/large.dmi' - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' volume = 120 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,120]" @@ -80,12 +80,11 @@ name = "mixing bowl" desc = "A large mixing bowl." icon = 'icons/obj/items/chem/mixingbowl.dmi' - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' volume = 180 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,180]" atom_flags = ATOM_FLAG_OPEN_CONTAINER - unacidable = 0 material = /decl/material/solid/metal/steel material_force_multiplier = 0.2 @@ -93,21 +92,21 @@ name = "cryostasis beaker" desc = "A cryostasis beaker that allows for chemical storage without reactions." icon = 'icons/obj/items/chem/beakers/stasis.dmi' - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' volume = 60 amount_per_transfer_from_this = 10 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_CHEM_CHANGE presentation_flags = PRESENTATION_FLAG_NAME material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_NONE - origin_tech = "{'materials':2}" + origin_tech = @'{"materials":2}' lid_color = COLOR_PALE_BLUE_GRAY /obj/item/chems/glass/beaker/advanced name = "advanced beaker" desc = "An advanced beaker, powered by experimental technology." icon = 'icons/obj/items/chem/beakers/advanced.dmi' - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,120,150,200,250,300]" @@ -118,14 +117,14 @@ /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'exoticmatter':2,'materials':6}" + origin_tech = @'{"exoticmatter":2,"materials":6}' lid_color = COLOR_CYAN_BLUE /obj/item/chems/glass/beaker/vial name = "vial" desc = "A small glass vial." icon = 'icons/obj/items/chem/vial.dmi' - center_of_mass = @"{'x':15,'y':8}" + center_of_mass = @'{"x":15,"y":8}' volume = 30 w_class = ITEM_SIZE_TINY //half the volume of a bottle, half the size amount_per_transfer_from_this = 10 @@ -141,21 +140,25 @@ name = "insulated beaker" desc = "A glass beaker surrounded with black insulation." icon = 'icons/obj/items/chem/beakers/insulated.dmi' - center_of_mass = @"{'x':15,'y':8}" - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + center_of_mass = @'{"x":15,"y":8}' + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) possible_transfer_amounts = @"[5,10,15,30]" - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER presentation_flags = PRESENTATION_FLAG_NAME temperature_coefficient = 1 material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_NONE lid_color = COLOR_GRAY40 +// Hack around reagent temp changes. +/obj/item/chems/glass/beaker/insulated/ProcessAtomTemperature() + return PROCESS_KILL + /obj/item/chems/glass/beaker/insulated/large name = "large insulated beaker" icon = 'icons/obj/items/chem/beakers/insulated_large.dmi' - center_of_mass = @"{'x':16,'y':10}" - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + center_of_mass = @'{"x":16,"y":10}' + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) volume = 120 /obj/item/chems/glass/beaker/sulphuric/populate_reagents() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index eb1ac9ca366..84026bdcafa 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -2,7 +2,7 @@ name = "blood packs box" desc = "This box contains blood packs." icon_state = "sterile" - + /obj/item/storage/box/bloodpacks/WillContain() return list(/obj/item/chems/ivbag = 7) @@ -25,7 +25,7 @@ . = ..() /obj/item/chems/ivbag/on_reagent_change() - update_icon() + ..() if(reagents.total_volume > volume/2) w_class = ITEM_SIZE_SMALL else @@ -38,7 +38,7 @@ add_overlay(overlay_image(icon, "[round(percent,25)]", reagents.get_color())) add_overlay(attached? "dongle" : "top") -/obj/item/chems/ivbag/handle_mouse_drop(atom/over, mob/user) +/obj/item/chems/ivbag/handle_mouse_drop(atom/over, mob/user, params) if(ismob(loc)) if(attached) visible_message(SPAN_NOTICE("\The [attached] is taken off \the [src].")) @@ -48,7 +48,7 @@ START_PROCESSING(SSobj, src) update_icon() return TRUE - . = ..() + return ..() /obj/item/chems/ivbag/Process() if(!ismob(loc)) @@ -73,36 +73,43 @@ reagents.trans_to_mob(attached, amount_per_transfer_from_this, CHEM_INJECT) update_icon() -/obj/item/chems/ivbag/nanoblood/populate_reagents() - reagents.add_reagent(/decl/material/liquid/nanoblood, reagents.maximum_volume) - /obj/item/chems/ivbag/blood name = "blood pack" - var/blood_type = null + var/blood_fill_type = /decl/material/liquid/blood -/obj/item/chems/ivbag/blood/Initialize() - . = ..() - if(blood_type) - name = "blood pack ([blood_type])" +/obj/item/chems/ivbag/blood/proc/get_initial_blood_data() + return list( + "donor" = null, + "blood_DNA" = null, + "blood_type" = label_text, + "trace_chem" = null + ) /obj/item/chems/ivbag/blood/populate_reagents() - if(blood_type) - reagents.add_reagent(/decl/material/liquid/blood, reagents.maximum_volume, list("donor" = null, "blood_DNA" = null, "blood_type" = blood_type, "trace_chem" = null)) + if(blood_fill_type) + reagents.add_reagent(blood_fill_type, reagents.maximum_volume, get_initial_blood_data()) + +/obj/item/chems/ivbag/blood/nanoblood + label_text = "synthetic" + blood_fill_type = /decl/material/liquid/nanoblood + +/obj/item/chems/ivbag/blood/nanoblood/get_initial_blood_data() + return null -/obj/item/chems/ivbag/blood/APlus - blood_type = "A+" +/obj/item/chems/ivbag/blood/aplus + label_text = "A+" -/obj/item/chems/ivbag/blood/AMinus - blood_type = "A-" +/obj/item/chems/ivbag/blood/aminus + label_text = "A-" -/obj/item/chems/ivbag/blood/BPlus - blood_type = "B+" +/obj/item/chems/ivbag/blood/bplus + label_text = "B+" -/obj/item/chems/ivbag/blood/BMinus - blood_type = "B-" +/obj/item/chems/ivbag/blood/bminus + label_text = "B-" -/obj/item/chems/ivbag/blood/OPlus - blood_type = "O+" +/obj/item/chems/ivbag/blood/oplus + label_text = "O+" -/obj/item/chems/ivbag/blood/OMinus - blood_type = "O-" +/obj/item/chems/ivbag/blood/ominus + label_text = "O-" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d79319ae95e..510ebe26a50 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -1,9 +1,7 @@ /obj/item/chems/borghypo name = "cyborg hypospray" desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment." - icon = 'icons/obj/syringe.dmi' - item_state = "hypo" - icon_state = "borghypo" + icon = 'icons/obj/hypospray_borg.dmi' amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = null diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 2fefdb0b15e..a62ac52b58f 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -12,23 +12,24 @@ icon_state = "emptycondiment" atom_flags = ATOM_FLAG_OPEN_CONTAINER possible_transfer_amounts = @"[1,5,10]" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' randpixel = 6 volume = 50 + var/obj/item/chems/condiment/is_special_bottle var/static/list/special_bottles = list( - /decl/material/liquid/nutriment/ketchup = /obj/item/chems/condiment/ketchup, + /decl/material/liquid/nutriment/ketchup = /obj/item/chems/condiment/ketchup, /decl/material/liquid/nutriment/barbecue = /obj/item/chems/condiment/barbecue, - /decl/material/liquid/capsaicin = /obj/item/chems/condiment/capsaicin, - /decl/material/liquid/enzyme = /obj/item/chems/condiment/enzyme, + /decl/material/liquid/capsaicin = /obj/item/chems/condiment/capsaicin, + /decl/material/liquid/enzyme = /obj/item/chems/condiment/enzyme, /decl/material/liquid/nutriment/soysauce = /obj/item/chems/condiment/small/soysauce, - /decl/material/liquid/frostoil = /obj/item/chems/condiment/frostoil, - /decl/material/solid/sodiumchloride = /obj/item/chems/condiment/small/saltshaker, - /decl/material/solid/blackpepper = /obj/item/chems/condiment/small/peppermill, - /decl/material/liquid/nutriment/cornoil = /obj/item/chems/condiment/cornoil, - /decl/material/liquid/nutriment/sugar = /obj/item/chems/condiment/sugar, - /decl/material/liquid/nutriment/mayo = /obj/item/chems/condiment/mayo, - /decl/material/liquid/nutriment/vinegar = /obj/item/chems/condiment/vinegar - ) + /decl/material/liquid/frostoil = /obj/item/chems/condiment/frostoil, + /decl/material/solid/sodiumchloride = /obj/item/chems/condiment/small/saltshaker, + /decl/material/solid/blackpepper = /obj/item/chems/condiment/small/peppermill, + /decl/material/liquid/nutriment/cornoil = /obj/item/chems/condiment/cornoil, + /decl/material/liquid/nutriment/sugar = /obj/item/chems/condiment/sugar, + /decl/material/liquid/nutriment/mayo = /obj/item/chems/condiment/mayo, + /decl/material/liquid/nutriment/vinegar = /obj/item/chems/condiment/vinegar + ) /obj/item/chems/condiment/attackby(var/obj/item/W, var/mob/user) if(IS_PEN(W)) @@ -48,13 +49,6 @@ on_reagent_change() return -/obj/item/chems/condiment/attack_self(var/mob/user) - return - -/obj/item/chems/condiment/attack(var/mob/M, var/mob/user, var/def_zone) - if(standard_feed_mob(user, M)) - return - /obj/item/chems/condiment/afterattack(var/obj/target, var/mob/user, var/proximity) if(!proximity) return @@ -78,31 +72,31 @@ else ..() -/obj/item/chems/condiment/feed_sound(var/mob/user) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) - -/obj/item/chems/condiment/self_feed_message(var/mob/user) - to_chat(user, SPAN_NOTICE("You swallow some of contents of \the [src].")) +/obj/item/chems/condiment/proc/update_center_of_mass() + center_of_mass = is_special_bottle ? initial(is_special_bottle.center_of_mass) : initial(center_of_mass) /obj/item/chems/condiment/on_reagent_change() - var/reagent = reagents.primary_reagent - if(reagent in special_bottles) - var/obj/item/chems/condiment/special_bottle = special_bottles[reagent] - name = initial(special_bottle.name) - desc = initial(special_bottle.desc) - icon_state = initial(special_bottle.icon_state) - center_of_mass = initial(special_bottle.center_of_mass) - else - name = initial(name) - desc = initial(desc) - center_of_mass = initial(center_of_mass) - if(LAZYLEN(reagents.reagent_volumes)) - icon_state = "mixedcondiments" - else - icon_state = "emptycondiment" + is_special_bottle = reagents?.total_volume && special_bottles[reagents?.primary_reagent] + ..() + update_center_of_mass() + +/obj/item/chems/condiment/update_container_name() + name = is_special_bottle ? initial(is_special_bottle.name) : initial(name) if(label_text) name = addtext(name," ([label_text])") +/obj/item/chems/condiment/update_container_desc() + desc = is_special_bottle ? initial(is_special_bottle.desc) : initial(desc) + +/obj/item/chems/condiment/on_update_icon() + ..() + if(is_special_bottle) + icon_state = initial(is_special_bottle.icon_state) + else if(LAZYLEN(reagents?.reagent_volumes)) + icon_state = "mixedcondiments" + else + icon_state = "emptycondiment" + /obj/item/chems/condiment/enzyme name = "universal enzyme" desc = "Used in cooking various dishes." @@ -180,14 +174,23 @@ amount_per_transfer_from_this = 1 volume = 20 -/obj/item/chems/condiment/small/on_reagent_change() +/obj/item/chems/condiment/small/update_center_of_mass() + return + +/obj/item/chems/condiment/small/update_container_name() + return + +/obj/item/chems/condiment/small/update_container_desc() + return + +/obj/item/chems/condiment/small/on_update_icon() return /obj/item/chems/condiment/small/saltshaker name = "salt shaker" desc = "Salt. From space oceans, presumably." icon_state = "saltshakersmall" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' /obj/item/chems/condiment/small/saltshaker/populate_reagents() reagents.add_reagent(/decl/material/solid/sodiumchloride, reagents.maximum_volume) @@ -196,7 +199,7 @@ name = "pepper mill" desc = "Often used to flavor food or make people sneeze." icon_state = "peppermillsmall" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/condiment/small/peppermill/populate_reagents() reagents.add_reagent(/decl/material/solid/blackpepper, reagents.maximum_volume) @@ -205,7 +208,7 @@ name = "sugar" desc = "Sweetness in a bottle" icon_state = "sugarsmall" - center_of_mass = @"{'x':17,'y':9}" + center_of_mass = @'{"x":17,"y":9}' /obj/item/chems/condiment/small/sugar/populate_reagents() reagents.add_reagent(/decl/material/liquid/nutriment/sugar, reagents.maximum_volume) @@ -219,9 +222,6 @@ /obj/item/chems/condiment/small/mint/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/syrup/mint, reagents.maximum_volume) -/obj/item/chems/condiment/small/mint/on_reagent_change() - return - /obj/item/chems/condiment/small/soysauce name = "soy sauce" desc = "A dark, salty, savoury flavoring." @@ -412,7 +412,13 @@ /obj/item/chems/condiment/flour/populate_reagents() reagents.add_reagent(/decl/material/liquid/nutriment/flour, reagents.maximum_volume) -/obj/item/chems/condiment/flour/on_reagent_change() +/obj/item/chems/condiment/flour/update_container_name() + return + +/obj/item/chems/condiment/flour/update_container_desc() + return + +/obj/item/chems/condiment/flour/on_update_icon() return /obj/item/chems/condiment/large @@ -432,5 +438,11 @@ /obj/item/chems/condiment/large/salt/populate_reagents() reagents.add_reagent(/decl/material/solid/sodiumchloride, reagents.maximum_volume) -/obj/item/chems/condiment/large/salt/on_reagent_change() +/obj/item/chems/condiment/large/salt/update_container_name() + return + +/obj/item/chems/condiment/large/salt/update_container_desc() + return + +/obj/item/chems/condiment/large/salt/on_update_icon() return diff --git a/code/modules/reagents/reagent_containers/condiment_edibility.dm b/code/modules/reagents/reagent_containers/condiment_edibility.dm new file mode 100644 index 00000000000..a5c98156efe --- /dev/null +++ b/code/modules/reagents/reagent_containers/condiment_edibility.dm @@ -0,0 +1,15 @@ +/obj/item/chems/condiment/show_feed_message_start(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You begin trying to eat some of \the [target].")) + else + user.visible_message(SPAN_NOTICE("\The [user] is trying to feed some of the contents of \the [src] to \the [target]!")) + +/obj/item/chems/condiment/show_feed_message_end(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You swallow some of the contents of \the [src].")) + else + user.visible_message(SPAN_NOTICE("\The [user] feeds some of the contents of \the [src] to \the [target]!")) diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index bfa2cc737ca..7b6123b4325 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -26,7 +26,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" var/filling_overlayed //if filling should go on top of the icon (e.g. opaque cups) var/static/list/filling_icons_cache = list() - center_of_mass =@"{'x':16,'y':9}" + center_of_mass =@'{"x":16,"y":9}' amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[5,10,15,30]" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/extras.dm b/code/modules/reagents/reagent_containers/drinkingglass/extras.dm index 3a11eeafd07..5ebb74b12c5 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/extras.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/extras.dm @@ -50,7 +50,7 @@ var/glass_desc w_class = ITEM_SIZE_TINY icon = 'icons/obj/drink_glasses/extras.dmi' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/glass_extra/stick name = "stick" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm b/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm index b66c69e011e..30450700147 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm @@ -8,7 +8,7 @@ filling_states = @"[20,40,60,80,100]" volume = 30 possible_transfer_amounts = @"[5,10,15,30]" - rim_pos = @"{'y':23,'x_left':13,'x_right':20}" + rim_pos = @'{"y":23,"x_left":13,"x_right":20}' /obj/item/chems/drinks/glass2/rocks name = "rocks glass" @@ -20,7 +20,7 @@ filling_states = @"[25,50,75,100]" volume = 20 possible_transfer_amounts = @"[5,10,20]" - rim_pos = @"{'y':21,'x_left':10,'x_right':23}" + rim_pos = @'{"y":21,"x_left":10,"x_right":23}' /obj/item/chems/drinks/glass2/shake name = "sherry glass" @@ -32,7 +32,7 @@ filling_states = @"[25,50,75,100]" volume = 30 possible_transfer_amounts = @"[5,10,15,30]" - rim_pos = @"{'y':25,'x_left':13,'x_right':21}" + rim_pos = @'{"y":25,"x_left":13,"x_right":21}' /obj/item/chems/drinks/glass2/cocktail name = "cocktail glass" @@ -44,7 +44,7 @@ filling_states = @"[33,66,100]" volume = 15 possible_transfer_amounts = @"[5,10,15]" - rim_pos = @"{'y':22,'x_left':13,'x_right':21}" + rim_pos = @'{"y":22,"x_left":13,"x_right":21}' /obj/item/chems/drinks/glass2/shot name = "shot glass" @@ -57,7 +57,7 @@ volume = 5 material = /decl/material/solid/glass possible_transfer_amounts = @"[1,2,5]" - rim_pos = @"{'y':17,'x_left':13,'x_right':21}" + rim_pos = @'{"y":17,"x_left":13,"x_right":21}' /obj/item/chems/drinks/glass2/pint name = "pint glass" @@ -69,7 +69,7 @@ volume = 60 material = /decl/material/solid/glass possible_transfer_amounts = @"[5,10,15,30,60]" - rim_pos = @"{'y':25,'x_left':12,'x_right':21}" + rim_pos = @'{"y":25,"x_left":12,"x_right":21}' /obj/item/chems/drinks/glass2/mug name = "glass mug" @@ -81,7 +81,7 @@ filling_states = @"[25,50,75,100]" volume = 40 possible_transfer_amounts = @"[5,10,20,40]" - rim_pos = @"{'y':22,'x_left':12,'x_right':20}" + rim_pos = @'{"y":22,"x_left":12,"x_right":20}' /obj/item/chems/drinks/glass2/wine name = "wine glass" @@ -93,7 +93,7 @@ filling_states = @"[20,40,60,80,100]" volume = 25 possible_transfer_amounts = @"[5,10,15,25]" - rim_pos = @"{'y':25,'x_left':12,'x_right':21}" + rim_pos = @'{"y":25,"x_left":12,"x_right":21}' /obj/item/chems/drinks/glass2/flute name = "flute glass" @@ -105,7 +105,7 @@ volume = 25 filling_states = @"[20,40,60,80,100]" possible_transfer_amounts = @"[5,10,15,25]" - rim_pos = @"{'y':24,'x_left':13,'x_right':19}" + rim_pos = @'{"y":24,"x_left":13,"x_right":19}' /obj/item/chems/drinks/glass2/carafe name = "pitcher" @@ -118,8 +118,8 @@ volume = 120 material = /decl/material/solid/glass possible_transfer_amounts = @"[5,10,15,30,60,120]" - rim_pos = @"{'y':26,'x_left':12,'x_right':21}" - center_of_mass = @"{'x':16,'y':7}" + rim_pos = @'{"y":26,"x_left":12,"x_right":21}' + center_of_mass = @'{"x":16,"y":7}' /obj/item/chems/drinks/glass2/coffeecup name = "coffee cup" @@ -128,12 +128,12 @@ icon_state = "coffeecup" item_state = "coffee" volume = 30 - center_of_mass = @"{'x':15,'y':13}" + center_of_mass = @'{"x":15,"y":13}' filling_states = @"[40,80,100]" base_name = "cup" base_icon = "coffeecup" overlay_base_icon = "coffeecup" // so that subtypes work properly - rim_pos = @"{'y':22,'x_left':12,'x_right':20}" + rim_pos = @'{"y":22,"x_left":12,"x_right":20}' filling_overlayed = TRUE /obj/item/chems/drinks/glass2/coffeecup/black @@ -217,7 +217,7 @@ icon = 'icons/obj/drink_glasses/coffecup_tall.dmi' icon_state = "coffeecup_tall" volume = 60 - center_of_mass = @"{'x':15,'y':19}" + center_of_mass = @'{"x":15,"y":19}' filling_states = @"[50,70,90,100]" base_name = "tall cup" base_icon = "coffeecup_tall" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm b/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm index e180625b9ea..9bd2c837869 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm @@ -7,7 +7,7 @@ base_icon = "fitness-cup" icon = 'icons/obj/drink_glasses/fitness.dmi' volume = 100 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic filling_states = @"[10,20,30,40,50,60,70,80,90,100]" possible_transfer_amounts = @"[5,10,15,25]" rim_pos = null // no fruit slices @@ -25,6 +25,18 @@ /obj/item/chems/drinks/glass2/fitnessflask/proteinshake name = "protein shake" +// This exists to let the name auto-set properly. +/decl/cocktail/proteinshake + name = "protein shake" + description = "A revolting slurry of protein and water, fortified with iron." + hidden_from_codex = TRUE + ratios = list( + /decl/material/liquid/nutriment = 2, + /decl/material/liquid/nutriment/protein = 1, + /decl/material/liquid/water = 3, + /decl/material/solid/metal/iron + ) + /obj/item/chems/drinks/glass2/fitnessflask/proteinshake/populate_reagents() reagents.add_reagent(/decl/material/liquid/nutriment, 30) reagents.add_reagent(/decl/material/solid/metal/iron, 10) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index a1b24257e0a..f837578a959 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -12,6 +12,7 @@ amount_per_transfer_from_this = 5 randpixel = 6 volume = 50 + abstract_type = /obj/item/chems/drinks var/filling_states // List of percentages full that have icons var/base_icon = null // Base icon name for fill states @@ -31,52 +32,33 @@ attack(user, user) /obj/item/chems/drinks/proc/open(mob/user) - playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1) - to_chat(user, SPAN_NOTICE("You open \the [src] with an audible pop!")) - atom_flags |= ATOM_FLAG_OPEN_CONTAINER - -/obj/item/chems/drinks/attack(mob/M, mob/user, def_zone) - if(force && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.a_intent == I_HURT) - return ..() - if(standard_feed_mob(user, M)) - return - return 0 + if(!ATOM_IS_OPEN_CONTAINER(src)) + playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1) + to_chat(user, SPAN_NOTICE("You open \the [src] with an audible pop!")) + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + return TRUE + return FALSE -/obj/item/chems/drinks/afterattack(obj/target, mob/user, proximity) - if(!proximity) return +/obj/item/chems/drinks/proc/do_open_check(mob/user) + if(!ATOM_IS_OPEN_CONTAINER(src)) + to_chat(user, SPAN_NOTICE("You need to open \the [src]!")) + return FALSE + return TRUE +/obj/item/chems/drinks/afterattack(obj/target, mob/user, proximity) + if(!proximity) + return if(standard_dispenser_refill(user, target)) return if(standard_pour_into(user, target)) return return ..() -/obj/item/chems/drinks/standard_feed_mob(var/mob/user, var/mob/target) - if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, "You need to open \the [src]!") - return 1 - return ..() - /obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) - if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, "You need to open \the [src]!") - return 1 - return ..() + return do_open_check(user) && ..() /obj/item/chems/drinks/standard_pour_into(var/mob/user, var/atom/target) - if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, "You need to open \the [src]!") - return 1 - return ..() - -/obj/item/chems/drinks/self_feed_message(var/mob/user) - to_chat(user, "You swallow a gulp from \the [src].") - if(user.has_personal_goal(/datum/goal/achievement/specific_object/drink)) - for(var/R in reagents.reagent_volumes) - user.update_personal_goal(/datum/goal/achievement/specific_object/drink, R) - -/obj/item/chems/drinks/feed_sound(var/mob/user) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) + return do_open_check(user) && ..() /obj/item/chems/drinks/examine(mob/user, distance) . = ..() @@ -137,7 +119,7 @@ desc = "It's milk. White and nutritious goodness!" icon_state = "milk" item_state = "carton" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' /obj/item/chems/drinks/milk/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/milk, reagents.maximum_volume) @@ -147,7 +129,7 @@ desc = "It's soy milk. White and nutritious goodness!" icon_state = "soymilk" item_state = "carton" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' /obj/item/chems/drinks/soymilk/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/milk/soymilk, reagents.maximum_volume) @@ -171,7 +153,7 @@ name = "\improper Robust Coffee" desc = "Careful, the beverage you're about to enjoy is extremely hot." icon_state = "coffee" - center_of_mass = @"{'x':15,'y':10}" + center_of_mass = @'{"x":15,"y":10}' /obj/item/chems/drinks/coffee/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/coffee, reagents.maximum_volume) @@ -180,7 +162,7 @@ name = "cup of ice" desc = "Careful, cold ice, do not chew." icon_state = "coffee" - center_of_mass = @"{'x':15,'y':10}" + center_of_mass = @'{"x":15,"y":10}' /obj/item/chems/drinks/ice/populate_reagents() reagents.add_reagent(/decl/material/solid/ice, reagents.maximum_volume) @@ -190,7 +172,7 @@ desc = "A tall plastic cup of creamy hot chocolate." icon_state = "coffee" item_state = "coffee" - center_of_mass = @"{'x':15,'y':13}" + center_of_mass = @'{"x":15,"y":13}' /obj/item/chems/drinks/h_chocolate/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/hot_coco, reagents.maximum_volume) @@ -200,7 +182,7 @@ gender = PLURAL desc = "Just add 10ml water, self heats! A taste that reminds you of your school years." icon_state = "ramen" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' /obj/item/chems/drinks/dry_ramen/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/dry_ramen, reagents.maximum_volume) @@ -211,7 +193,7 @@ icon_state = "water_cup_e" possible_transfer_amounts = null volume = 10 - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/sillycup/on_update_icon() . = ..() @@ -233,7 +215,7 @@ item_state = "teapot" amount_per_transfer_from_this = 10 volume = 120 - center_of_mass = @"{'x':17,'y':7}" + center_of_mass = @'{"x":17,"y":7}' material = /decl/material/solid/stone/ceramic /obj/item/chems/drinks/pitcher @@ -242,7 +224,7 @@ icon_state = "pitcher" volume = 120 amount_per_transfer_from_this = 10 - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' filling_states = @"[15,30,50,70,85,100]" base_icon = "pitcher" material = /decl/material/solid/metal/stainlesssteel @@ -252,7 +234,7 @@ desc = "A metal flask belonging to the captain." icon_state = "flask" volume = 60 - center_of_mass = @"{'x':17,'y':7}" + center_of_mass = @'{"x":17,"y":7}' /obj/item/chems/drinks/flask/shiny name = "shiny flask" @@ -269,21 +251,21 @@ desc = "A metal flask with a leather band and golden badge belonging to the detective." icon_state = "detflask" volume = 60 - center_of_mass = @"{'x':17,'y':8}" + center_of_mass = @'{"x":17,"y":8}' /obj/item/chems/drinks/flask/barflask name = "flask" desc = "For those who can't be bothered to hang out at the bar to drink." icon_state = "barflask" volume = 60 - center_of_mass = @"{'x':17,'y':7}" + center_of_mass = @'{"x":17,"y":7}' /obj/item/chems/drinks/flask/vacuumflask name = "vacuum flask" desc = "Keeping your drinks at the perfect temperature since 1892." icon_state = "vacuumflask" volume = 60 - center_of_mass = @"{'x':15,'y':4}" + center_of_mass = @'{"x":15,"y":4}' //tea and tea accessories /obj/item/chems/drinks/tea @@ -291,7 +273,7 @@ desc = "A tall plastic cup full of the concept and ideal of tea." icon_state = "coffee" item_state = "coffee" - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' filling_states = @"[100]" base_name = "cup" base_icon = "cup" diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index ae1d63217b1..24e64b4340c 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -8,21 +8,19 @@ volume = 100 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. force = 5 - + material = /decl/material/solid/glass drop_sound = 'sound/foley/bottledrop1.ogg' pickup_sound = 'sound/foley/bottlepickup1.ogg' + abstract_type = /obj/item/chems/drinks/bottle var/smash_duration = 5 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) - var/isGlass = TRUE //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it var/obj/item/chems/glass/rag/rag = null var/rag_underlay = "rag" var/stop_spin_bottle = FALSE //Gotta stop the rotation. /obj/item/chems/drinks/bottle/Initialize() . = ..() - if(isGlass) - unacidable = TRUE - else + if(material?.type != /decl/material/solid/glass) verbs -= .verb/spin_bottle /obj/item/chems/drinks/bottle/Destroy() @@ -31,18 +29,21 @@ rag = null return ..() -/obj/item/chems/drinks/bottle/on_reagent_change() +/obj/item/chems/drinks/bottle/update_container_name() + return + +/obj/item/chems/drinks/bottle/update_container_desc() return //when thrown on impact, bottles smash and spill their contents /obj/item/chems/drinks/bottle/throw_impact(atom/hit_atom, var/datum/thrownthing/TT) ..() - if(isGlass && TT.thrower && TT.thrower.a_intent != I_HELP) + if(material?.is_brittle() && TT.thrower && TT.thrower.a_intent != I_HELP) if(TT.speed > throw_speed || smash_check(TT.dist_travelled)) //not as reliable as smashing directly smash(loc, hit_atom) /obj/item/chems/drinks/bottle/proc/smash_check(var/distance) - if(!isGlass) + if(!material?.is_brittle()) return 0 if(rag && rag.on_fire) // Molotovs should be somewhat reliable, they're a pain to make. return TRUE @@ -97,13 +98,14 @@ return B /obj/item/chems/drinks/bottle/attackby(obj/item/W, mob/user) - if(!rag && istype(W, /obj/item/chems/glass/rag)) - insert_rag(W, user) - return - if(rag && W.isflamesource()) + if(!rag) + if(istype(W, /obj/item/chems/glass/rag)) + insert_rag(W, user) + return TRUE + else if(W.isflamesource()) rag.attackby(W, user) - return - ..() + return TRUE + return ..() /obj/item/chems/drinks/bottle/attack_self(mob/user) if(rag) @@ -112,7 +114,7 @@ ..() /obj/item/chems/drinks/bottle/proc/insert_rag(obj/item/chems/glass/rag/R, mob/user) - if(!isGlass || rag) return + if(!material?.type != /decl/material/solid/glass || rag) return if(user.try_unequip(R)) to_chat(user, SPAN_NOTICE("You stuff [R] into [src].")) @@ -247,7 +249,7 @@ name = "Griffeater Gin" desc = "A bottle of high quality gin, produced in the New London Space Station." icon_state = "ginbottle" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/gin/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/gin, reagents.maximum_volume) @@ -256,7 +258,7 @@ name = "Uncle Git's Special Reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" - center_of_mass = @"{'x':16,'y':3}" + center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/whiskey/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) @@ -265,7 +267,7 @@ name = "aged whiskey" desc = "This rich, smooth, hideously expensive beverage was aged for decades." icon_state = "whiskeybottle2" - center_of_mass = @"{'x':16,'y':3}" + center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/agedwhiskey/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/aged_whiskey, reagents.maximum_volume) @@ -274,7 +276,7 @@ name = "Tunguska Triple Distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Indies around the galaxy." icon_state = "vodkabottle" - center_of_mass = @"{'x':17,'y':3}" + center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vodka/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume) @@ -283,7 +285,7 @@ name = "Caccavo Guaranteed Quality tequila" desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" icon_state = "tequilabottle" - center_of_mass = @"{'x':16,'y':3}" + center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/tequila/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume) @@ -292,7 +294,7 @@ name = "Wrapp Artiste Patron" desc = "Silver laced tequila, served in space night clubs across the galaxy." icon_state = "patronbottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/patron/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume - 5) @@ -302,7 +304,7 @@ name = "Captain Pete's Cuban Spiced Rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/bottle/rum/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/rum, reagents.maximum_volume) @@ -311,7 +313,7 @@ name = "Flask of Holy Water" desc = "A flask of the chaplain's holy water." icon_state = "holyflask" - center_of_mass = @"{'x':17,'y':10}" + center_of_mass = @'{"x":17,"y":10}' /obj/item/chems/drinks/bottle/holywater/populate_reagents() reagents.add_reagent(/decl/material/liquid/water, reagents.maximum_volume, list("holy" = TRUE)) @@ -320,7 +322,7 @@ name = "Goldeneye Vermouth" desc = "Sweet, sweet dryness~" icon_state = "vermouthbottle" - center_of_mass = @"{'x':17,'y':3}" + center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vermouth/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/vermouth, reagents.maximum_volume) @@ -329,7 +331,7 @@ name = "Robert Robust's Coffee Liqueur" desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK!" icon_state = "kahluabottle" - center_of_mass = @"{'x':17,'y':3}" + center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/kahlua/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/coffee, reagents.maximum_volume) @@ -338,7 +340,7 @@ name = "College Girl Goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" - center_of_mass = @"{'x':15,'y':3}" + center_of_mass = @'{"x":15,"y":3}' /obj/item/chems/drinks/bottle/goldschlager/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume - 5) @@ -348,7 +350,7 @@ name = "Chateau De Baton Premium Cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/cognac/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/cognac, reagents.maximum_volume) @@ -357,7 +359,7 @@ name = "Doublebeard Bearded Special Wine" desc = "A faint aura of unease and asspainery surrounds the bottle." icon_state = "winebottle" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/wine/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) @@ -366,7 +368,7 @@ name = "Jailbreaker Verte" desc = "One sip of this and you just know you're gonna have a good time." icon_state = "absinthebottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/absinthe/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/absinthe, reagents.maximum_volume) @@ -375,7 +377,7 @@ name = "Emeraldine Melon Liquor" desc = "A bottle of 46 proof Emeraldine Melon Liquor. Sweet and light." icon_state = "alco-green" //Placeholder. - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/melonliquor/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/melonliquor, reagents.maximum_volume) @@ -384,7 +386,7 @@ name = "Miss Blue Curacao" desc = "A fruity, exceptionally azure drink. Does not allow the imbiber to use the fifth magic." icon_state = "alco-blue" //Placeholder. - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/bluecuracao/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/bluecuracao, reagents.maximum_volume) @@ -393,7 +395,7 @@ name = "Liqueur d'Herbe" desc = "A bottle of the seventh-finest herbal liquor sold under a generic name in the galaxy. The back label has a load of guff about the monks who traditionally made this particular variety." icon_state = "herbal" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/herbal/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/herbal, reagents.maximum_volume) @@ -402,7 +404,7 @@ name = "Briar Rose Grenadine Syrup" desc = "Sweet and tangy, a bar syrup used to add color or flavor to drinks." icon_state = "grenadinebottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/grenadine/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/grenadine, reagents.maximum_volume) @@ -411,7 +413,7 @@ name = "\improper Space Cola" desc = "Cola. in space." icon_state = "colabottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/cola/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/cola, reagents.maximum_volume) @@ -420,7 +422,7 @@ name = "\improper Space-Up" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up_bottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/space_up/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/lemonade, reagents.maximum_volume) @@ -429,7 +431,7 @@ name = "\improper Space Mountain Wind" desc = "Blows right through you like a space wind." icon_state = "space_mountain_wind_bottle" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/space_mountain_wind/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/citrussoda, reagents.maximum_volume) @@ -438,7 +440,7 @@ name = "Warlock's Velvet" desc = "What a delightful packaging for a surely high quality wine! The vintage must be amazing!" icon_state = "pwinebottle" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/pwine/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/pwine, reagents.maximum_volume) @@ -447,7 +449,7 @@ name = "Takeo Sadow's Combined Sake" desc = "A bottle of the highest-grade sake allowed for import." icon_state = "sake" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/sake/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/sake, reagents.maximum_volume) @@ -456,7 +458,7 @@ name = "Murcelano Vinyard's Premium Champagne" desc = "The regal drink of celebrities and royalty." icon_state = "champagne" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/champagne/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/champagne, reagents.maximum_volume) @@ -465,7 +467,7 @@ name = "Kaisermeister Deluxe" desc = "Jagermeister. This drink just demands a party." icon_state = "herbal" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/jagermeister/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/jagermeister, reagents.maximum_volume) @@ -475,7 +477,7 @@ name = "Four Stripes Quadruple Distilled" desc = "Premium distilled vodka imported directly from the Gilgamesh Colonial Confederation." icon_state = "premiumvodka" - center_of_mass = @"{'x':17,'y':3}" + center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/premiumvodka/populate_reagents() var/namepick = pick("Four Stripes","Gilgamesh","Novaya Zemlya","Indie","STS-35") @@ -487,7 +489,7 @@ name = "Uve De Blanc" desc = "You feel pretentious just looking at it." icon_state = "premiumwine" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/premiumwine/populate_reagents() var/namepick = pick("Calumont","Sciacchemont","Recioto","Torcalota") @@ -503,8 +505,11 @@ desc = "Full of vitamins and deliciousness!" icon_state = "orangejuice" item_state = "carton" - center_of_mass = @"{'x':16,'y':7}" - isGlass = 0 + center_of_mass = @'{"x":16,"y":7}' + material = /decl/material/solid/organic/cardboard + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY + ) drop_sound = 'sound/foley/drop1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -516,8 +521,11 @@ desc = "It's cream. Made from milk. What else did you think you'd find in there?" icon_state = "cream" item_state = "carton" - center_of_mass = @"{'x':16,'y':8}" - isGlass = 0 + center_of_mass = @'{"x":16,"y":8}' + material = /decl/material/solid/organic/cardboard + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY + ) drop_sound = 'sound/foley/drop1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -529,8 +537,11 @@ desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." icon_state = "tomatojuice" item_state = "carton" - center_of_mass = @"{'x':16,'y':8}" - isGlass = 0 + center_of_mass = @'{"x":16,"y":8}' + material = /decl/material/solid/organic/cardboard + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY + ) drop_sound = 'sound/foley/drop1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -542,8 +553,11 @@ desc = "Sweet-sour goodness." icon_state = "limejuice" item_state = "carton" - center_of_mass = @"{'x':16,'y':8}" - isGlass = 0 + center_of_mass = @'{"x":16,"y":8}' + material = /decl/material/solid/organic/cardboard + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY + ) drop_sound = 'sound/foley/drop1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -561,7 +575,7 @@ name = "space beer" desc = "Contains only water, malt and hops." icon_state = "beer" - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/bottle/small/beer/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) @@ -571,7 +585,7 @@ desc = "A true dorf's drink of choice." icon_state = "alebottle" item_state = "beer" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/bottle/small/ale/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) @@ -580,7 +594,7 @@ name = "Ginger Beer" desc = "A delicious non-alcoholic beverage enjoyed across Sol space." icon_state = "gingerbeer" - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/bottle/small/gingerbeer/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/gingerbeer, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/drinks/cans.dm b/code/modules/reagents/reagent_containers/drinks/cans.dm index db4eb1bc2e5..882c46962fd 100644 --- a/code/modules/reagents/reagent_containers/drinks/cans.dm +++ b/code/modules/reagents/reagent_containers/drinks/cans.dm @@ -4,7 +4,10 @@ atom_flags = 0 //starts closed material = /decl/material/solid/metal/aluminium -/obj/item/chems/drinks/cans/on_reagent_change() +/obj/item/chems/drinks/cans/update_container_name() + return + +/obj/item/chems/drinks/cans/update_container_desc() return //DRINKS @@ -13,7 +16,7 @@ name = "\improper Space Cola" desc = "Cola. in space." icon_state = "cola" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/cola/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/cola, reagents.maximum_volume) @@ -22,8 +25,8 @@ name = "bottled water" desc = "Pure drinking water, imported from the Martian poles." icon_state = "waterbottle" - center_of_mass = @"{'x':15,'y':8}" - material = /decl/material/solid/plastic + center_of_mass = @'{"x":15,"y":8}' + material = /decl/material/solid/organic/plastic /obj/item/chems/drinks/cans/waterbottle/populate_reagents() reagents.add_reagent(/decl/material/liquid/water, reagents.maximum_volume) @@ -37,7 +40,7 @@ name = "\improper Space Mountain Wind" desc = "Blows right through you like a space wind." icon_state = "space_mountain_wind" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/space_mountain_wind/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/citrussoda, reagents.maximum_volume) @@ -46,7 +49,7 @@ name = "\improper Thirteen Loko" desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly." icon_state = "thirteen_loko" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/cans/thirteenloko/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/thirteenloko, reagents.maximum_volume) @@ -55,7 +58,7 @@ name = "\improper Dr. Gibb" desc = "A delicious mixture of 42 different flavors." icon_state = "dr_gibb" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/dr_gibb/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/cherrycola, reagents.maximum_volume) @@ -64,7 +67,7 @@ name = "\improper Star-Kist" desc = "Can you taste a bit of tuna...?" icon_state = "starkist" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/starkist/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/orangecola, reagents.maximum_volume) @@ -73,7 +76,7 @@ name = "\improper Space-Up" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/space_up/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/lemonade, reagents.maximum_volume) @@ -82,7 +85,7 @@ name = "\improper Lemon-Lime" desc = "You wanted ORANGE. It gave you Lemon Lime." icon_state = "lemon-lime" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/lemon_lime/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/lemon_lime, reagents.maximum_volume) @@ -91,7 +94,7 @@ name = "\improper Vrisk Serket Iced Tea" desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?" icon_state = "ice_tea_can" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/iced_tea/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/tea/black, reagents.maximum_volume - 5) @@ -101,7 +104,7 @@ name = "\improper Grapel Juice" desc = "500 pages of rules of how to appropriately enter into a combat with this juice!" icon_state = "purple_can" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/grape_juice/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/juice/grape, reagents.maximum_volume) @@ -110,7 +113,7 @@ name = "\improper T-Borg's Tonic Water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/tonic/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/tonic, reagents.maximum_volume) @@ -119,7 +122,7 @@ name = "soda water" desc = "A can of soda water. Still water's more refreshing cousin." icon_state = "sodawater" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/sodawater/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/sodawater, reagents.maximum_volume) @@ -128,7 +131,7 @@ name = "Beast Energy" desc = "100% pure energy, and 150% pure liver disease." icon_state = "beastenergy" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/cans/beastenergy/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/beastenergy, reagents.maximum_volume) @@ -139,7 +142,7 @@ name = "\improper Red Army Twist!" desc = "A taste of what keeps our glorious nation running! Served as Space Commissariat Stahlin prefers it! Luke warm." icon_state = "syndi_cola_x" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/syndicolax/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/juice/potato, reagents.maximum_volume) @@ -148,7 +151,7 @@ name = "\improper Arstotzka Bru" desc = "Just what any bureaucrat needs to get through the day. Keep stamping those papers!" icon_state = "art_bru" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/artbru/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/juice/turnip, reagents.maximum_volume) @@ -157,7 +160,7 @@ name = "\improper TerraCola" desc = "A can of the only soft drink state approved for the benefit of the people. Served at room temperature regardless of ambient temperatures thanks to innovative Terran insulation technology." icon_state = "syndi_cola" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/syndicola/populate_reagents() reagents.add_reagent(/decl/material/liquid/water, reagents.maximum_volume - 5) @@ -166,7 +169,7 @@ /obj/item/chems/drinks/glass2/square/boda name = "boda" desc = "A tall glass of refreshing Boda!" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/glass2/square/boda/populate_reagents() reagents.add_reagent(/decl/material/liquid/drink/sodawater, reagents.maximum_volume) @@ -174,7 +177,7 @@ /obj/item/chems/drinks/glass2/square/bodaplus name = "tri kopeiki sirop boda" desc = "A tall glass of even more refreshing Boda! Now with Sok!" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/glass2/square/bodaplus/populate_reagents() var/reag = pick(list( @@ -198,7 +201,7 @@ name = "\improper Space Beer" desc = "Now in a can!" icon_state = "beercan" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/speer/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/beer/good, reagents.maximum_volume) @@ -207,7 +210,7 @@ name = "\improper Magm-Ale" desc = "Now in a can!" icon_state = "alecan" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/ale/populate_reagents() reagents.add_reagent(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/drinks/champagne.dm b/code/modules/reagents/reagent_containers/drinks/champagne.dm index a0cffe9359c..48c8e30cb8c 100644 --- a/code/modules/reagents/reagent_containers/drinks/champagne.dm +++ b/code/modules/reagents/reagent_containers/drinks/champagne.dm @@ -23,7 +23,7 @@ desc = "Sparkling wine made from exquisite grape varieties by the method of secondary fermentation in a bottle. Bubbling." icon = 'icons/obj/food.dmi' icon_state = "champagne" - center_of_mass = @"{'x':12,'y':5}" + center_of_mass = @'{"x":12,"y":5}' atom_flags = 0 //starts closed var/opening diff --git a/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm b/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm index 68655dc9ca6..c2517e3b519 100644 --- a/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm +++ b/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm @@ -5,7 +5,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60]" //Professional bartender should be able to transfer as much as needed volume = 120 - center_of_mass = @"{'x':17,'y':10}" + center_of_mass = @'{"x":17,"y":10}' atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT /obj/item/chems/drinks/shaker/attack_self(mob/user) @@ -29,7 +29,7 @@ if(reagents && reagents.total_volume) atom_flags &= ~ATOM_FLAG_NO_REACT HANDLE_REACTIONS(reagents) - addtimer(CALLBACK(src, .proc/stop_react), SSmaterials.wait) + addtimer(CALLBACK(src, PROC_REF(stop_react)), SSmaterials.wait) /obj/item/chems/drinks/shaker/proc/stop_react() atom_flags |= ATOM_FLAG_NO_REACT \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/drinks/jar.dm b/code/modules/reagents/reagent_containers/drinks/jar.dm index b66730f7709..aedbbade98d 100644 --- a/code/modules/reagents/reagent_containers/drinks/jar.dm +++ b/code/modules/reagents/reagent_containers/drinks/jar.dm @@ -7,17 +7,25 @@ desc = "A jar. You're not sure what it's supposed to hold." icon_state = "jar" item_state = "beaker" - center_of_mass = @"{'x':15,'y':8}" - unacidable = 1 + center_of_mass = @'{"x":15,"y":8}' + material = /decl/material/solid/glass drop_sound = 'sound/foley/bottledrop1.ogg' pickup_sound = 'sound/foley/bottlepickup1.ogg' -/obj/item/chems/drinks/jar/on_reagent_change() - if(LAZYLEN(reagents.reagent_volumes)) - icon_state ="jar_what" +/obj/item/chems/drinks/jar/update_container_name() + if(LAZYLEN(reagents?.reagent_volumes)) SetName("jar of something") - desc = "You can't really tell what this is." else - icon_state = initial(icon_state) SetName(initial(name)) + +/obj/item/chems/drinks/jar/update_container_desc() + if(LAZYLEN(reagents?.reagent_volumes)) + desc = "You can't really tell what this is." + else desc = "A jar. You're not sure what it's supposed to hold." + +/obj/item/chems/drinks/jar/on_update_icon() + if(LAZYLEN(reagents?.reagent_volumes)) + icon_state = "jar_what" + else + icon_state = initial(icon_state) diff --git a/code/modules/reagents/reagent_containers/drinks/juicebox.dm b/code/modules/reagents/reagent_containers/drinks/juicebox.dm index 1187aec2b44..5fc23e36c85 100644 --- a/code/modules/reagents/reagent_containers/drinks/juicebox.dm +++ b/code/modules/reagents/reagent_containers/drinks/juicebox.dm @@ -6,8 +6,10 @@ volume = 30 amount_per_transfer_from_this = 5 atom_flags = 0 - material = /decl/material/solid/cardboard - + material = /decl/material/solid/organic/cardboard + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY + ) color = "#ff0000" var/primary_color = "#ff0000" var/secondary_color = null diff --git a/code/modules/reagents/reagent_containers/drinks_edibility.dm b/code/modules/reagents/reagent_containers/drinks_edibility.dm new file mode 100644 index 00000000000..7e7969d9acb --- /dev/null +++ b/code/modules/reagents/reagent_containers/drinks_edibility.dm @@ -0,0 +1,15 @@ +/obj/item/chems/drinks/handle_eaten_by_mob(var/mob/user, var/mob/target) + if(!do_open_check(user)) + return EATEN_UNABLE + . = ..() + if(. == EATEN_SUCCESS) + target = target || user + if(target?.has_personal_goal(/datum/goal/achievement/specific_object/drink)) + for(var/R in reagents.reagent_volumes) + target.update_personal_goal(/datum/goal/achievement/specific_object/drink, R) + +/obj/item/chems/drinks/show_feed_message_end(var/mob/user, var/mob/target) + if(user == target) + to_chat(user, SPAN_NOTICE("You swallow a gulp from \the [src].")) + else + user.visible_message(SPAN_NOTICE("\The [user] feeds \the [src] to \the [target]!")) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 89f6abead24..3c522e538f1 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -46,7 +46,7 @@ if(safe_thing && (safe_thing.body_parts_covered & SLOT_EYES)) trans = reagents.splash(safe_thing, amount_per_transfer_from_this, max_spill=30) user.visible_message( - SPAN_DANGER("\The [user] tries to squirt something into [target]'s eyes, but fails!"), + SPAN_DANGER("\The [user] tries to squirt something into [target]'s eyes, but fails!"), SPAN_DANGER("You squirt [trans] unit\s at \the [target]'s eyes, but fail!") ) return @@ -78,9 +78,11 @@ to_chat(user, SPAN_NOTICE("You fill the dropper with [trans] units of the solution.")) +/obj/item/chems/dropper/update_container_name() + return -/obj/item/chems/dropper/on_reagent_change() - update_icon() +/obj/item/chems/dropper/update_container_desc() + return /obj/item/chems/dropper/on_update_icon() . = ..() diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index 9a339e245b7..844312f6ea9 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -15,10 +15,13 @@ icon_state = null randpixel = 6 atom_flags = ATOM_FLAG_OPEN_CONTAINER + item_flags = null + material = /decl/material/liquid/nutriment possible_transfer_amounts = null volume = 50 - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' w_class = ITEM_SIZE_SMALL + abstract_type = /obj/item/chems/food var/cooked_food = FALSE // Indicates the food should give a positive stress effect on eating. This is set to true if the food is created by a recipe. var/bitesize = 1 @@ -36,6 +39,9 @@ var/list/attack_products //Items you can craft together. Like bomb making, but with food and less screwdrivers. // Uses format list(ingredient = result_type). The ingredient can be a typepath or a kitchen_tag string (used for mobs or plants) +/obj/item/chems/food/can_be_injected_by(var/atom/injector) + return TRUE + /obj/item/chems/food/standard_pour_into(mob/user, atom/target) return FALSE @@ -49,71 +55,12 @@ .=..() amount_per_transfer_from_this = bitesize - //Placeholder for effect that trigger on eating that aren't tied to reagents. -/obj/item/chems/food/proc/On_Consume(var/mob/M) - if(isliving(M) && cooked_food) - var/mob/living/eater = M - eater.add_stressor(/datum/stressor/ate_cooked_food, 15 MINUTES) - if(!reagents.total_volume) - M.visible_message("[M] finishes eating \the [src].","You finish eating \the [src].") - M.drop_item() - M.update_personal_goal(/datum/goal/achievement/specific_object/food, type) - if(trash) - if(ispath(trash,/obj/item)) - var/obj/item/TrashItem = new trash(get_turf(M)) - M.put_in_hands(TrashItem) - else if(istype(trash,/obj/item)) - M.put_in_hands(trash) - qdel(src) - return - /obj/item/chems/food/attack_self(mob/user) attack(user, user) /obj/item/chems/food/dragged_onto(var/mob/user) attack(user, user) -/obj/item/chems/food/self_feed_message(mob/user) - if(!iscarbon(user)) - return ..() - var/mob/living/carbon/C = user - var/fullness = C.get_fullness() - if (fullness <= 50) - to_chat(C, SPAN_WARNING("You hungrily chew out a piece of [src] and gobble it!")) - if (fullness > 50 && fullness <= 150) - to_chat(C, SPAN_NOTICE("You hungrily begin to eat [src].")) - if (fullness > 150 && fullness <= 350) - to_chat(C, SPAN_NOTICE("You take a bite of [src].")) - if (fullness > 350 && fullness <= 550) - to_chat(C, SPAN_NOTICE("You unwillingly chew a bit of [src].")) - -/obj/item/chems/food/feed_sound(mob/user) - if(eat_sound) - playsound(user, pick(eat_sound), rand(10, 50), 1) - -/obj/item/chems/food/standard_feed_mob(mob/user, mob/target) - . = ..() - if(.) - bitecount++ - On_Consume(target) - -/obj/item/chems/food/attack(mob/M, mob/user, def_zone) - if(!reagents || !reagents.total_volume) - to_chat(user, "None of [src] left!") - qdel(src) - return 0 - if(iscarbon(M)) - //TODO: replace with standard_feed_mob() call. - var/mob/living/carbon/C = M - var/fullness = C.get_fullness() - if (fullness > 550) - var/message = C == user ? "You cannot force any more of [src] to go down your throat." : "[user] cannot force anymore of [src] down [M]'s throat." - to_chat(user, SPAN_WARNING(message)) - return 0 - if(standard_feed_mob(user, M)) - return 1 - return 0 - /obj/item/chems/food/examine(mob/user, distance) . = ..() if(distance > 1) @@ -247,19 +194,6 @@ something.dropInto(loc) . = ..() -/obj/item/chems/food/attack_animal(var/mob/user) - if(!isanimal(user) && !isalien(user)) - return - user.visible_message("[user] nibbles away at \the [src].","You nibble away at \the [src].") - bitecount++ - if(reagents && user.reagents) - reagents.trans_to_mob(user, bitesize, CHEM_INGEST) - spawn(5) - if(!src && !user.client) - user.custom_emote(1,"[pick("burps", "cries for more", "burps twice", "looks at the area where the food was")]") - qdel(src) - On_Consume(user) - /obj/item/chems/food/proc/update_food_appearance_from(var/obj/item/donor, var/food_color, var/copy_donor_appearance = TRUE) filling_color = food_color if(copy_donor_appearance) diff --git a/code/modules/reagents/reagent_containers/food/baked_goods.dm b/code/modules/reagents/reagent_containers/food/baked_goods.dm index af486d26432..86e146a19b3 100644 --- a/code/modules/reagents/reagent_containers/food/baked_goods.dm +++ b/code/modules/reagents/reagent_containers/food/baked_goods.dm @@ -7,7 +7,7 @@ desc = "A delicious and spongy little cake." icon_state = "muffin" filling_color = "#e0cf9b" - center_of_mass = @"{'x':17,'y':4}" + center_of_mass = @'{"x":17,"y":4}' nutriment_desc = list("sweetness" = 3, "muffin" = 3) nutriment_amt = 6 bitesize = 2 @@ -18,7 +18,7 @@ icon_state = "pie" trash = /obj/item/trash/plate filling_color = "#fbffb8" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("pie" = 3, "cream" = 2) nutriment_amt = 4 bitesize = 3 @@ -38,7 +38,7 @@ desc = "No black birds, this is a good sign." icon_state = "berryclafoutis" trash = /obj/item/trash/plate - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("sweetness" = 2, "pie" = 3) nutriment_amt = 4 bitesize = 3 @@ -53,7 +53,7 @@ icon_state = "waffles" trash = /obj/item/trash/waffles filling_color = "#e6deb5" - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' nutriment_desc = list("waffle" = 8) nutriment_amt = 8 bitesize = 2 @@ -64,7 +64,7 @@ icon_state = "rofflewaffles" trash = /obj/item/trash/waffles filling_color = "#ff00f7" - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' nutriment_desc = list("waffle" = 7, "sweetness" = 1) nutriment_amt = 8 bitesize = 4 @@ -78,7 +78,7 @@ desc = "Pancakes without blueberries, still delicious." icon_state = "pancakes" trash = /obj/item/trash/plate - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' nutriment_desc = list("pancake" = 8) nutriment_amt = 8 bitesize = 2 @@ -88,7 +88,7 @@ desc = "Pancakes with blueberries, delicious." icon_state = "pancakes" trash = /obj/item/trash/plate - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' nutriment_desc = list("pancake" = 8) nutriment_amt = 8 bitesize = 2 @@ -99,7 +99,7 @@ icon_state = "eggplantparm" trash = /obj/item/trash/plate filling_color = "#4d2f5e" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("cheese" = 3, "eggplant" = 3) nutriment_amt = 6 bitesize = 2 @@ -110,7 +110,7 @@ icon_state = "soylent_green" trash = /obj/item/trash/waffles filling_color = "#b8e6b5" - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' bitesize = 2 /obj/item/chems/food/soylentgreen/populate_reagents() @@ -123,7 +123,7 @@ icon_state = "soylent_yellow" trash = /obj/item/trash/waffles filling_color = "#e6fa61" - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' nutriment_desc = list("some sort of protein" = 10)//seasoned vERY well. nutriment_amt = 10 bitesize = 2 @@ -134,7 +134,7 @@ desc = "An old barber recipe, very delicious!" trash = /obj/item/trash/plate filling_color = "#948051" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 2 /obj/item/chems/food/meatpie/populate_reagents() @@ -147,7 +147,7 @@ desc = "A delicious tofu pie." trash = /obj/item/trash/plate filling_color = "#fffee0" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("tofu" = 2, "pie" = 8) nutriment_amt = 10 bitesize = 2 @@ -157,7 +157,7 @@ desc = "Sweet and tasty poison pie." icon_state = "amanita_pie" filling_color = "#ffcccc" - center_of_mass = @"{'x':17,'y':9}" + center_of_mass = @'{"x":17,"y":9}' nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) nutriment_amt = 5 bitesize = 3 @@ -172,7 +172,7 @@ desc = "I bet you love stuff made out of plump helmets!" icon_state = "plump_pie" filling_color = "#b8279b" - center_of_mass = @"{'x':17,'y':9}" + center_of_mass = @'{"x":17,"y":9}' nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) nutriment_amt = 8 bitesize = 2 @@ -190,7 +190,7 @@ desc = "A delicious meatpie. Probably heretical." trash = /obj/item/trash/plate filling_color = "#43de18" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 2 /obj/item/chems/food/xemeatpie/populate_reagents() @@ -203,7 +203,7 @@ icon_state = "poppypretzel" bitesize = 2 filling_color = "#916e36" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("poppy seeds" = 2, "pretzel" = 3) nutriment_amt = 5 bitesize = 2 @@ -213,7 +213,7 @@ desc = "A pie containing sweet sweet love... or apple." icon_state = "applepie" filling_color = "#e0edc5" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) nutriment_amt = 4 bitesize = 3 @@ -223,7 +223,7 @@ desc = "Taste so good, make a grown man cry." icon_state = "cherrypie" filling_color = "#ff525a" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) nutriment_amt = 4 bitesize = 3 @@ -233,7 +233,7 @@ desc = "A true prophecy in each cookie!" icon_state = "fortune_cookie" filling_color = "#e8e79e" - center_of_mass = @"{'x':15,'y':14}" + center_of_mass = @'{"x":15,"y":14}' nutriment_desc = list("fortune cookie" = 2) nutriment_amt = 3 bitesize = 2 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/bread.dm b/code/modules/reagents/reagent_containers/food/bread.dm index e5c4f56f02f..0c2bb401969 100644 --- a/code/modules/reagents/reagent_containers/food/bread.dm +++ b/code/modules/reagents/reagent_containers/food/bread.dm @@ -8,7 +8,7 @@ icon_state = "sandwich" trash = /obj/item/trash/plate filling_color = "#d9be29" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' nutriment_desc = list("bread" = 3, "cheese" = 3) nutriment_amt = 3 nutriment_type = /decl/material/liquid/nutriment/bread @@ -24,7 +24,7 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#d9be29" - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' nutriment_desc = list("toasted bread" = 3, "cheese" = 3) nutriment_amt = 3 nutriment_type = /decl/material/liquid/nutriment/bread @@ -55,7 +55,7 @@ desc = "Good for pretend sword fights." icon_state = "baguette" filling_color = "#e3d796" - center_of_mass = @"{'x':18,'y':12}" + center_of_mass = @'{"x":18,"y":12}' nutriment_desc = list("long bread" = 6) nutriment_amt = 6 bitesize = 3 @@ -72,7 +72,7 @@ icon_state = "jellytoast" trash = /obj/item/trash/plate filling_color = "#b572ab" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_desc = list("toasted bread" = 2) nutriment_amt = 1 bitesize = 3 @@ -88,7 +88,7 @@ icon_state = "jellysandwich" trash = /obj/item/trash/plate filling_color = "#9e3a78" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_desc = list("bread" = 2) nutriment_amt = 2 bitesize = 3 @@ -103,7 +103,7 @@ desc = "It is very bitter and winy." icon_state = "twobread" filling_color = "#dbcc9a" - center_of_mass = @"{'x':15,'y':12}" + center_of_mass = @'{"x":15,"y":12}' nutriment_desc = list("sourness" = 2, "bread" = 2) nutriment_amt = 2 bitesize = 3 @@ -114,7 +114,7 @@ desc = "Is such a thing even possible?" icon_state = "threebread" filling_color = "#dbcc9a" - center_of_mass = @"{'x':15,'y':12}" + center_of_mass = @'{"x":15,"y":12}' nutriment_desc = list("sourness" = 2, "bread" = 3) nutriment_amt = 3 bitesize = 4 @@ -126,7 +126,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "flatbread" bitesize = 2 - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' nutriment_desc = list("bread" = 3) nutriment_amt = 3 nutriment_type = /decl/material/liquid/nutriment/bread \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/burgers.dm b/code/modules/reagents/reagent_containers/food/burgers.dm index 66ea44517c4..448e056b26c 100644 --- a/code/modules/reagents/reagent_containers/food/burgers.dm +++ b/code/modules/reagents/reagent_containers/food/burgers.dm @@ -7,9 +7,9 @@ desc = "A strange looking burger. It looks almost sentient." icon_state = "brainburger" filling_color = "#f2b6ea" - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' bitesize = 2 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/brainburger/populate_reagents() . = ..() @@ -21,21 +21,21 @@ desc = "Spooky! It doesn't look very filling." icon_state = "ghostburger" filling_color = "#fff2ff" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("buns" = 3, "spookiness" = 3) nutriment_amt = 2 bitesize = 2 /obj/item/chems/food/human filling_color = "#d63c3c" - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat var/hname = "" /obj/item/chems/food/human/burger name = "-burger" desc = "A bloody burger." icon_state = "hburger" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' bitesize = 2 /obj/item/chems/food/human/burger/populate_reagents() @@ -46,7 +46,7 @@ name = "cheeseburger" desc = "The cheese adds a good flavor." icon_state = "cheeseburger" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("cheese" = 2, "bun" = 2) nutriment_amt = 2 @@ -60,7 +60,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "burger" filling_color = "#d63c3c" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("bun" = 2) nutriment_amt = 3 bitesize = 2 @@ -75,7 +75,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "hamburger" filling_color = "#d63c3c" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("bun" = 2) nutriment_amt = 3 bitesize = 2 @@ -89,7 +89,7 @@ desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp." icon_state = "fishburger" filling_color = "#ffdefe" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' bitesize = 3 /obj/item/chems/food/fishburger/populate_reagents() @@ -101,7 +101,7 @@ desc = "What.. is that meat?" icon_state = "tofuburger" filling_color = "#fffee0" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("bun" = 2, "pseudo-soy meat" = 3) nutriment_amt = 6 bitesize = 2 @@ -111,7 +111,7 @@ desc = "The lettuce is the only organic component. Beep." icon_state = "roburger" filling_color = COLOR_GRAY80 - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("bun" = 2, "metal" = 3) nutriment_amt = 2 bitesize = 2 @@ -127,9 +127,9 @@ icon_state = "roburger" filling_color = COLOR_GRAY80 volume = 100 - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' bitesize = 0.1 - + /obj/item/chems/food/roburgerbig/populate_reagents() . = ..() reagents.add_reagent(/decl/material/liquid/nanitefluid, reagents.maximum_volume) @@ -139,7 +139,7 @@ desc = "Smells caustic. Tastes like heresy." icon_state = "xburger" filling_color = "#43de18" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' bitesize = 2 /obj/item/chems/food/xenoburger/populate_reagents() @@ -151,7 +151,7 @@ desc = "This tastes funny..." icon_state = "clownburger" filling_color = "#ff00ff" - center_of_mass = @"{'x':17,'y':12}" + center_of_mass = @'{"x":17,"y":12}' nutriment_desc = list("bun" = 2, "clown shoe" = 3) nutriment_amt = 6 bitesize = 2 @@ -161,7 +161,7 @@ desc = "Its taste defies language." icon_state = "mimeburger" filling_color = "#ffffff" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("bun" = 2, "mime paint" = 3) nutriment_amt = 6 bitesize = 2 @@ -180,7 +180,7 @@ desc = "Forget the Luna Burger! THIS is the future!" icon_state = "bigbiteburger" filling_color = "#e3d681" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("buns" = 4) nutriment_amt = 4 bitesize = 3 @@ -194,7 +194,7 @@ desc = "Culinary delight..?" icon_state = "jellyburger" filling_color = "#b572ab" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("buns" = 5) nutriment_amt = 5 bitesize = 2 @@ -208,7 +208,7 @@ desc = "This is a mountain of a burger. FOOD!" icon_state = "superbiteburger" filling_color = "#cca26a" - center_of_mass = @"{'x':16,'y':3}" + center_of_mass = @'{"x":16,"y":3}' nutriment_desc = list("buns" = 25) nutriment_amt = 25 bitesize = 10 @@ -224,9 +224,9 @@ desc = "Unrelated to dogs, maybe." icon_state = "hotdog" bitesize = 2 - center_of_mass = @"{'x':16,'y':17}" + center_of_mass = @'{"x":16,"y":17}' nutriment_type = /decl/material/liquid/nutriment/bread - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/hotdog/populate_reagents() . = ..() @@ -237,8 +237,8 @@ desc = "Going literal." icon_state = "hotcorgi" bitesize = 6 - center_of_mass = @"{'x':16,'y':17}" - material = /decl/material/solid/meat + center_of_mass = @'{"x":16,"y":17}' + material = /decl/material/solid/organic/meat /obj/item/chems/food/classichotdog/populate_reagents() . = ..() diff --git a/code/modules/reagents/reagent_containers/food/can_edibility.dm b/code/modules/reagents/reagent_containers/food/can_edibility.dm new file mode 100644 index 00000000000..4a1742cb5b4 --- /dev/null +++ b/code/modules/reagents/reagent_containers/food/can_edibility.dm @@ -0,0 +1,5 @@ +/obj/item/chems/food/can/handle_eaten_by_mob(mob/user, mob/target) + if(!ATOM_IS_OPEN_CONTAINER(src)) + to_chat(user, SPAN_NOTICE("You need to open \the [src] first!")) + return EATEN_UNABLE + return ..() diff --git a/code/modules/reagents/reagent_containers/food/canned.dm b/code/modules/reagents/reagent_containers/food/canned.dm index 2bb9e7693f2..6dca1acb589 100644 --- a/code/modules/reagents/reagent_containers/food/canned.dm +++ b/code/modules/reagents/reagent_containers/food/canned.dm @@ -6,7 +6,7 @@ /obj/item/chems/food/can name = "empty can" icon = 'icons/obj/food_canned.dmi' - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' atom_flags = 0 bitesize = 3 @@ -28,22 +28,6 @@ atom_flags |= ATOM_FLAG_OPEN_CONTAINER sealed = FALSE -/obj/item/chems/food/can/attack(mob/M, mob/user, def_zone) - if(force && !(obj_flags & ITEM_FLAG_NO_BLUDGEON) && user.a_intent == I_HURT) - return ..() - - if(standard_feed_mob(user, M)) - update_icon(src) - return TRUE - - return FALSE - -/obj/item/chems/food/can/standard_feed_mob(mob/user, mob/target) - if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, SPAN_NOTICE("You need to open \the [src] first!")) - return TRUE - return ..() - /obj/item/chems/food/can/attack_self(mob/user) if(!ATOM_IS_OPEN_CONTAINER(src) && !open_complexity) to_chat(user, SPAN_NOTICE("You unseal \the [src] with a crack of metal.")) @@ -112,9 +96,6 @@ . = ..() reagents.add_reagent(/decl/material/liquid/drink/juice/tomato, 12) -/obj/item/chems/food/can/tomato/feed_sound(var/mob/user) - playsound(user, 'sound/items/drink.ogg', rand(10, 50), 1) - /obj/item/chems/food/can/spinach name = "spinach" icon_state = "spinach" diff --git a/code/modules/reagents/reagent_containers/food/dough.dm b/code/modules/reagents/reagent_containers/food/dough.dm index aae9bd46371..088197f79f1 100644 --- a/code/modules/reagents/reagent_containers/food/dough.dm +++ b/code/modules/reagents/reagent_containers/food/dough.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "dough" bitesize = 2 - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("dough" = 3) nutriment_amt = 3 nutriment_type = /decl/material/liquid/nutriment/bread @@ -25,7 +25,7 @@ icon_state = "flat dough" slice_path = /obj/item/chems/food/doughslice slices_num = 3 - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' /obj/item/chems/food/sliceable/flatdough/populate_reagents() . = ..() @@ -40,7 +40,7 @@ slice_path = /obj/item/chems/food/spagetti slices_num = 1 bitesize = 2 - center_of_mass = @"{'x':17,'y':19}" + center_of_mass = @'{"x":17,"y":19}' nutriment_desc = list("dough" = 1) nutriment_amt = 1 nutriment_type = /decl/material/liquid/nutriment/bread @@ -51,7 +51,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "bun" bitesize = 2 - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' nutriment_desc = list("bun" = 4) nutriment_amt = 4 nutriment_type = /decl/material/liquid/nutriment/bread @@ -76,7 +76,7 @@ desc = "A small bread monkey fashioned from two burger buns." icon_state = "bunbun" bitesize = 2 - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_desc = list("bun" = 8) nutriment_amt = 8 nutriment_type = /decl/material/liquid/nutriment/bread \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/eggs.dm b/code/modules/reagents/reagent_containers/food/eggs.dm index 9ab1eccd49a..5b005bf426c 100644 --- a/code/modules/reagents/reagent_containers/food/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/eggs.dm @@ -8,7 +8,7 @@ icon_state = "egg" filling_color = "#fdffd1" volume = 10 - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_amt = 3 nutriment_type = /decl/material/liquid/nutriment/protein/egg @@ -79,7 +79,7 @@ desc = "A fried egg, with a touch of salt and pepper." icon_state = "friedegg" filling_color = "#ffdf78" - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' bitesize = 1 /obj/item/chems/food/friedegg/populate_reagents() @@ -104,7 +104,7 @@ icon_state = "omelette" trash = /obj/item/trash/plate filling_color = "#fff9a8" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 1 /obj/item/chems/food/omelette/populate_reagents() @@ -117,9 +117,9 @@ icon_state = "chawanmushi" trash = /obj/item/trash/snack_bowl filling_color = "#f0f2e4" - center_of_mass = @"{'x':17,'y':10}" + center_of_mass = @'{"x":17,"y":10}' bitesize = 1 - + /obj/item/chems/food/chawanmushi/populate_reagents() . = ..() reagents.add_reagent(/decl/material/liquid/nutriment/protein, 5) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/fish.dm b/code/modules/reagents/reagent_containers/food/fish.dm index 8483e49630b..507228f9e50 100644 --- a/code/modules/reagents/reagent_containers/food/fish.dm +++ b/code/modules/reagents/reagent_containers/food/fish.dm @@ -3,7 +3,7 @@ desc = "A fillet of fish." icon_state = "fishfillet" filling_color = "#ffdefe" - center_of_mass = @"{'x':17,'y':13}" + center_of_mass = @'{"x":17,"y":13}' bitesize = 6 nutriment_amt = 6 nutriment_type = /decl/material/liquid/nutriment/protein @@ -69,7 +69,7 @@ icon = 'icons/obj/molluscs.dmi' icon_state = "mollusc_shell" desc = "The cracked shell of an unfortunate mollusc." - material = /decl/material/solid/bone + material = /decl/material/solid/organic/bone /obj/item/trash/mollusc_shell/clam name = "clamshell" @@ -87,7 +87,7 @@ w_class = ITEM_SIZE_TINY material = /decl/material/liquid/nutriment/slime_meat matter = list( - /decl/material/solid/bone/fish = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/organic/bone/fish = MATTER_AMOUNT_SECONDARY, ) var/meat_type = /obj/item/chems/food/fish/mollusc var/shell_type = /obj/item/trash/mollusc_shell diff --git a/code/modules/reagents/reagent_containers/food/fried.dm b/code/modules/reagents/reagent_containers/food/fried.dm index 2aca1e326e8..1ae9afafba3 100644 --- a/code/modules/reagents/reagent_containers/food/fried.dm +++ b/code/modules/reagents/reagent_containers/food/fried.dm @@ -10,7 +10,7 @@ icon_state = "onionrings" trash = /obj/item/trash/plate filling_color = "#eddd00" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("fried onions" = 5) nutriment_amt = 5 bitesize = 2 @@ -21,7 +21,7 @@ icon_state = "fries" trash = /obj/item/trash/plate filling_color = "#eddd00" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("fresh fries" = 4) nutriment_amt = 4 bitesize = 2 @@ -32,7 +32,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawsticks" bitesize = 2 - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' nutriment_desc = list("raw potato" = 3) nutriment_amt = 3 @@ -42,7 +42,7 @@ icon_state = "cheesyfries" trash = /obj/item/trash/plate filling_color = "#eddd00" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("fresh fries" = 3, "cheese" = 3) nutriment_amt = 4 bitesize = 2 diff --git a/code/modules/reagents/reagent_containers/food/junkfood.dm b/code/modules/reagents/reagent_containers/food/junkfood.dm index b1f3c03833b..35987ff7079 100644 --- a/code/modules/reagents/reagent_containers/food/junkfood.dm +++ b/code/modules/reagents/reagent_containers/food/junkfood.dm @@ -4,9 +4,9 @@ desc = "For when you desperately want meat and you don't care what kind. Has the same texture as old leather boots." trash = /obj/item/trash/sosjerky filling_color = "#631212" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' bitesize = 2 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/sosjerky/populate_reagents() . = ..() @@ -18,7 +18,7 @@ desc = "Pouring water on these will not turn them back into grapes, unfortunately." trash = /obj/item/trash/raisins filling_color = "#343834" - center_of_mass = @"{'x':15,'y':4}" + center_of_mass = @'{"x":15,"y":4}' nutriment_desc = list("raisins" = 6) nutriment_amt = 6 @@ -27,7 +27,7 @@ icon_state = "space_twinkie" desc = "So full of preservatives, it's guaranteed to survive longer then you will." filling_color = "#ffe591" - center_of_mass = @"{'x':15,'y':11}" + center_of_mass = @'{"x":15,"y":11}' bitesize = 2 /obj/item/chems/food/spacetwinkie/populate_reagents() @@ -40,7 +40,7 @@ desc = "Bite sized cheese flavoured snacks that will leave your fingers coated in cheese dust." trash = /obj/item/trash/cheesie filling_color = "#ffa305" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("cheese" = 5, "chips" = 2) nutriment_amt = 4 bitesize = 2 @@ -50,7 +50,7 @@ icon_state = "syndi_cakes" desc = "Made using extremely unethical labour, ingredients and marketing methods." filling_color = "#ff5d05" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("sweetness" = 3, "cake" = 1) nutriment_amt = 4 trash = /obj/item/trash/syndi_cakes @@ -68,7 +68,7 @@ desc = "Pistachios. There is absolutely nothing remarkable about these." trash = /obj/item/trash/pistachios filling_color = "#825d26" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("nuts" = 1) nutriment_amt = 3 bitesize = 0.5 @@ -79,7 +79,7 @@ desc = "A favorite among birds." trash = /obj/item/trash/semki filling_color = "#68645d" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("sunflower seeds" = 1) nutriment_amt = 6 bitesize = 0.5 @@ -90,7 +90,7 @@ desc = "Space cepholapod tentacles, carefully removed from the squid then dried into strips of delicious rubbery goodness!" trash = /obj/item/trash/squid filling_color = "#c0a9d7" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("fish" = 1, "salt" = 1) nutriment_amt = 2 bitesize = 1 @@ -105,7 +105,7 @@ desc = "Fried bread cubes. Good in salad but I guess you can just eat them as is." trash = /obj/item/trash/croutons filling_color = "#c6b17f" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("bread" = 1, "salt" = 1) nutriment_amt = 3 bitesize = 1 @@ -117,7 +117,7 @@ desc = "Pig fat. Salted. Just as good as it sounds." trash = /obj/item/trash/salo filling_color = "#e0bcbc" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("fat" = 1, "salt" = 1) nutriment_amt = 2 bitesize = 2 @@ -132,7 +132,7 @@ desc = "Dried salted beer snack fish." trash = /obj/item/trash/driedfish filling_color = "#c8a5bb" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("fish" = 1, "salt" = 1) nutriment_amt = 2 bitesize = 1 @@ -147,7 +147,7 @@ icon_state = "liquidfood" trash = /obj/item/trash/liquidfood filling_color = "#a8a8a8" - center_of_mass = @"{'x':16,'y':15}" + center_of_mass = @'{"x":16,"y":15}' nutriment_desc = list("chalk" = 6) nutriment_amt = 20 bitesize = 4 @@ -161,9 +161,9 @@ desc = "Fried, salted lean meat compressed into a cube. Not very appetizing." icon_state = "meatcube" filling_color = "#7a3d11" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 3 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/meatcube/populate_reagents() . = ..() @@ -175,7 +175,7 @@ icon_state = "tastybread" trash = /obj/item/trash/tastybread filling_color = "#a66829" - center_of_mass = @"{'x':17,'y':16}" + center_of_mass = @'{"x":17,"y":16}' nutriment_desc = list("bread" = 2, "sweetness" = 3) nutriment_amt = 6 nutriment_type = /decl/material/liquid/nutriment/bread @@ -187,7 +187,7 @@ icon_state = "candy" trash = /obj/item/trash/candy filling_color = "#7d5f46" - center_of_mass = @"{'x':15,'y':15}" + center_of_mass = @'{"x":15,"y":15}' nutriment_amt = 1 nutriment_desc = list("candy" = 1) bitesize = 2 @@ -226,7 +226,7 @@ desc = "It's a handful of candy corn. Not actually candied corn." icon_state = "candy_corn" filling_color = "#fffcb0" - center_of_mass = @"{'x':14,'y':10}" + center_of_mass = @'{"x":14,"y":10}' nutriment_amt = 4 nutriment_desc = list("candy corn" = 4) bitesize = 2 @@ -242,7 +242,7 @@ icon_state = "chips" trash = /obj/item/trash/chips filling_color = "#e8c31e" - center_of_mass = @"{'x':15,'y':15}" + center_of_mass = @'{"x":15,"y":15}' nutriment_amt = 3 nutriment_desc = list("salt" = 1, "chips" = 2) bitesize = 1 @@ -253,7 +253,7 @@ desc = "COOKIE!!!" icon_state = "cookie" filling_color = "#dbc94f" - center_of_mass = @"{'x':17,'y':18}" + center_of_mass = @'{"x":17,"y":18}' nutriment_amt = 5 nutriment_desc = list("sweetness" = 3, "cookie" = 2) w_class = ITEM_SIZE_TINY @@ -265,7 +265,7 @@ desc = "Such sweet, fattening food." icon_state = "chocolatebar" filling_color = "#7d5f46" - center_of_mass = @"{'x':15,'y':15}" + center_of_mass = @'{"x":15,"y":15}' nutriment_amt = 2 nutriment_desc = list("chocolate" = 5) bitesize = 2 @@ -280,7 +280,7 @@ desc = "Such sweet, fattening food." icon_state = "chocolateegg" filling_color = "#7d5f46" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_amt = 3 nutriment_desc = list("chocolate" = 5) bitesize = 2 @@ -295,7 +295,7 @@ desc = "Goes great with Robust Coffee." icon_state = "donut1" filling_color = "#d9c386" - center_of_mass = @"{'x':19,'y':16}" + center_of_mass = @'{"x":19,"y":16}' nutriment_desc = list("sweetness", "donut") nutriment_amt = 3 bitesize = 3 @@ -342,7 +342,7 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ed1169" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_amt = 3 bitesize = 5 nutriment_type = /decl/material/liquid/nutriment/bread @@ -359,7 +359,7 @@ desc = "Now with 20% less lawsuit enabling regolith!" trash = /obj/item/trash/cakewrap filling_color = "#ffffff" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("sweet" = 4, "vanilla" = 1) nutriment_amt = 5 bitesize = 2 @@ -387,7 +387,7 @@ desc = "Contains over 9000% of your daily recommended intake of salt." trash = /obj/item/trash/tidegobs filling_color = "#2556b0" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("salt" = 4, "ocean" = 1, "seagull" = 1) nutriment_amt = 5 bitesize = 2 @@ -398,7 +398,7 @@ desc = "A day ration of salt, styrofoam and possibly sawdust." trash = /obj/item/trash/saturno filling_color = "#dca319" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("salt" = 4, "peanut" = 2, "wood?" = 1) nutriment_amt = 5 bitesize = 2 @@ -409,7 +409,7 @@ desc = "Some kind of gel, maybe?" trash = /obj/item/trash/jupiter filling_color = "#dc1919" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("jelly?" = 5) nutriment_amt = 5 bitesize = 2 @@ -420,7 +420,7 @@ desc = "Baseless tasteless nutrient rods to get you through the day. Now even less rash inducing!" trash = /obj/item/trash/pluto filling_color = "#ffffff" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("chalk" = 4, "sadness" = 1) nutriment_amt = 5 bitesize = 2 @@ -431,7 +431,7 @@ desc = "A steaming self-heated bowl of sweet eggs and taters!" trash = /obj/item/trash/mars filling_color = "#d2c63f" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("eggs" = 4, "potato" = 4, "mustard" = 2) nutriment_amt = 8 bitesize = 2 @@ -442,7 +442,7 @@ desc = "Hot takes on hot cakes, a timeless classic now finally fit for human consumption!" trash = /obj/item/trash/venus filling_color = "#d2c63f" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("heat" = 4, "burning" = 1) nutriment_amt = 5 bitesize = 2 @@ -458,7 +458,7 @@ desc = "Pop rocks. The new formula guarantees fewer shrapnel induced oral injuries." trash = /obj/item/trash/oort filling_color = "#3f7dd2" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("fizz" = 3, "sweet?" = 1, "shrapnel" = 1) nutriment_amt = 5 bitesize = 2 @@ -537,7 +537,7 @@ return has_been_heated = 1 user.visible_message("[user] crushes \the [src] package.", "You crush \the [src] package and feel a comfortable heat build up.") - addtimer(CALLBACK(src, .proc/heat, weakref(user)), 20 SECONDS) + addtimer(CALLBACK(src, PROC_REF(heat), weakref(user)), 20 SECONDS) /obj/item/chems/food/donkpocket/sinpocket/heat(weakref/message_to) ..() @@ -551,7 +551,7 @@ desc = "The food of choice for the seasoned traitor." icon_state = "donkpocket" filling_color = "#dedeab" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("heartiness" = 1, "dough" = 2) nutriment_amt = 2 var/warm = 0 @@ -569,7 +569,7 @@ reagents.add_reagent(reagent, heated_reagents[reagent]) bitesize = 6 SetName("warm donk-pocket") - addtimer(CALLBACK(src, .proc/cool), 7 MINUTES) + addtimer(CALLBACK(src, PROC_REF(cool)), 7 MINUTES) /obj/item/chems/food/donkpocket/proc/cool() if(!warm) diff --git a/code/modules/reagents/reagent_containers/food/meat/cubes.dm b/code/modules/reagents/reagent_containers/food/meat/cubes.dm index dddf72cf7c9..7394c2c4411 100644 --- a/code/modules/reagents/reagent_containers/food/meat/cubes.dm +++ b/code/modules/reagents/reagent_containers/food/meat/cubes.dm @@ -3,16 +3,19 @@ /obj/item/chems/food/monkeycube name = "monkey cube" desc = "Just add water!" - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER icon_state = "monkeycube" bitesize = 12 filling_color = "#adac7f" - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' var/growing = FALSE var/monkey_type = /mob/living/carbon/human/monkey var/wrapper_type +/obj/item/chems/food/monkeycube/get_food_consumption_method(mob/eater) + return EATING_METHOD_EAT + /obj/item/chems/food/monkeycube/populate_reagents() . = ..() reagents.add_reagent(/decl/material/liquid/nutriment/protein, 10) @@ -26,12 +29,12 @@ if(wrapper_type) Unwrap(user) -/obj/item/chems/food/monkeycube/proc/Expand() +/obj/item/chems/food/monkeycube/proc/Expand(force_loc) if(!growing) growing = TRUE - src.visible_message(SPAN_NOTICE("\The [src] expands!")) + visible_message(SPAN_NOTICE("\The [src] expands!")) var/mob/monkey = new monkey_type - monkey.dropInto(src.loc) + monkey.dropInto(force_loc || loc) qdel(src) /obj/item/chems/food/monkeycube/proc/Unwrap(var/mob/user) @@ -42,16 +45,20 @@ user.put_in_hands(new wrapper_type(get_turf(user))) wrapper_type = null -/obj/item/chems/food/monkeycube/On_Consume(var/mob/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.visible_message("A screeching creature bursts out of [M]'s chest!") - var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(H, BP_CHEST) - organ.take_external_damage(50, 0, 0, "Animal escaping the ribcage") - Expand() +/obj/item/chems/food/monkeycube/handle_eaten_by_mob(mob/user, mob/target) + . = ..() + if(. == EATEN_SUCCESS) + target = target || user + if(target) + target.visible_message(SPAN_DANGER("A screeching creature bursts out of \the [target]!")) + var/obj/item/organ/external/organ = GET_EXTERNAL_ORGAN(target, BP_CHEST) + if(organ) + organ.take_external_damage(50, 0, 0, "Animal escaping the ribcage") + Expand(get_turf(target)) /obj/item/chems/food/monkeycube/on_reagent_change() - if(reagents.has_reagent(/decl/material/liquid/water)) + ..() + if(!QDELETED(src) && reagents?.has_reagent(/decl/material/liquid/water)) Expand() /obj/item/chems/food/monkeycube/wrapped diff --git a/code/modules/reagents/reagent_containers/food/meat/fish.dm b/code/modules/reagents/reagent_containers/food/meat/fish.dm index abec8e0faf1..a2b2cd2c30b 100644 --- a/code/modules/reagents/reagent_containers/food/meat/fish.dm +++ b/code/modules/reagents/reagent_containers/food/meat/fish.dm @@ -3,7 +3,7 @@ desc = "A finger of fish." icon_state = "fishfingers" filling_color = "#ffdefe" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 3 /obj/item/chems/food/fishfingers/populate_reagents() @@ -16,7 +16,7 @@ icon_state = "cubancarp" trash = /obj/item/trash/plate filling_color = "#e9adff" - center_of_mass = @"{'x':12,'y':5}" + center_of_mass = @'{"x":12,"y":5}' nutriment_desc = list("toasted bread" = 3) nutriment_amt = 3 bitesize = 3 @@ -31,7 +31,7 @@ desc = "Best enjoyed wrapped in a newspaper on a cold wet day." icon_state = "fishandchips" filling_color = "#e3d796" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' nutriment_desc = list("salt" = 1, "chips" = 2, "fish" = 2) nutriment_amt = 3 bitesize = 3 diff --git a/code/modules/reagents/reagent_containers/food/meat/meat.dm b/code/modules/reagents/reagent_containers/food/meat/meat.dm index b5ed4bdf0a6..fe148bed4bb 100644 --- a/code/modules/reagents/reagent_containers/food/meat/meat.dm +++ b/code/modules/reagents/reagent_containers/food/meat/meat.dm @@ -5,8 +5,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawcutlet" bitesize = 1 - center_of_mass = @"{'x':17,'y':20}" - material = /decl/material/solid/meat + center_of_mass = @'{"x":17,"y":20}' + material = /decl/material/solid/organic/meat /obj/item/chems/food/rawcutlet/populate_reagents() . = ..() @@ -18,8 +18,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "cutlet" bitesize = 2 - center_of_mass = @"{'x':17,'y':20}" - material = /decl/material/solid/meat + center_of_mass = @'{"x":17,"y":20}' + material = /decl/material/solid/organic/meat /obj/item/chems/food/cutlet/populate_reagents() . = ..() @@ -31,8 +31,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawmeatball" bitesize = 2 - center_of_mass = @"{'x':16,'y':15}" - material = /decl/material/solid/meat + center_of_mass = @'{"x":16,"y":15}' + material = /decl/material/solid/organic/meat /obj/item/chems/food/rawmeatball/populate_reagents() . = ..() @@ -43,9 +43,9 @@ desc = "A great meal all round." icon_state = "meatball" filling_color = "#db0000" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 2 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/meatball/populate_reagents() . = ..() @@ -59,9 +59,9 @@ slice_path = /obj/item/chems/food/cutlet slices_num = 3 filling_color = "#7a3d11" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 3 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/plainsteak/populate_reagents() . = ..() @@ -73,9 +73,9 @@ icon_state = "meatstake" trash = /obj/item/trash/plate filling_color = "#7a3d11" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 3 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/meatsteak/populate_reagents() . = ..() @@ -93,11 +93,11 @@ icon_state = "meatstake" trash = /obj/item/trash/plate filling_color = "#7a3d11" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("onion" = 2, "mushroom" = 2) nutriment_amt = 4 bitesize = 3 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/loadedsteak/populate_reagents() . = ..() @@ -109,7 +109,7 @@ desc = "A slice from a huge tomato." icon_state = "tomatomeat" filling_color = "#db0000" - center_of_mass = @"{'x':17,'y':16}" + center_of_mass = @'{"x":17,"y":16}' nutriment_amt = 3 nutriment_desc = list("raw" = 2, "tomato" = 3) bitesize = 6 @@ -119,9 +119,9 @@ desc = "A very manly slab of meat." icon_state = "bearmeat" filling_color = "#db0000" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' bitesize = 3 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/bearmeat/populate_reagents() . = ..() @@ -133,9 +133,9 @@ desc = "An economical replacement for crab. In space! Would probably be a lot nicer cooked." icon_state = "spiderleg" filling_color = "#d5f5dc" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' bitesize = 3 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/spider/populate_reagents() . = ..() @@ -152,9 +152,9 @@ desc = "A slab of green meat. Smells like acid." icon_state = "xenomeat" filling_color = "#43de18" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' bitesize = 6 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/xenomeat/populate_reagents() . = ..() @@ -167,9 +167,9 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "sausage" filling_color = "#db0000" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 2 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/sausage/populate_reagents() . = ..() @@ -180,9 +180,9 @@ desc = "A piece of mixed, long meat, with some bite to it." icon_state = "sausage" filling_color = "#db0000" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 2 - material = /decl/material/solid/meat + material = /decl/material/solid/organic/meat /obj/item/chems/food/fatsausage/populate_reagents() . = ..() @@ -194,7 +194,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "appendix" filling_color = "#e00d34" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 3 /obj/item/chems/food/organ/populate_reagents() @@ -208,7 +208,7 @@ desc = "Delicious meat, on a stick." trash = /obj/item/stack/material/rods filling_color = "#a85340" - center_of_mass = @"{'x':17,'y':15}" + center_of_mass = @'{"x":17,"y":15}' bitesize = 2 /obj/item/chems/food/meatkabob/populate_reagents() diff --git a/code/modules/reagents/reagent_containers/food/meat/slabs.dm b/code/modules/reagents/reagent_containers/food/meat/slabs.dm index 406e919c09d..b17a98e30bd 100644 --- a/code/modules/reagents/reagent_containers/food/meat/slabs.dm +++ b/code/modules/reagents/reagent_containers/food/meat/slabs.dm @@ -7,8 +7,8 @@ slices_num = 3 max_health = 180 filling_color = "#ff1c1c" - center_of_mass = @"{'x':16,'y':14}" - material = /decl/material/solid/meat + center_of_mass = @'{"x":16,"y":14}' + material = /decl/material/solid/organic/meat bitesize = 3 /obj/item/chems/food/meat/populate_reagents() diff --git a/code/modules/reagents/reagent_containers/food/misc.dm b/code/modules/reagents/reagent_containers/food/misc.dm index 79781c1c3a9..71a4ef73a5c 100644 --- a/code/modules/reagents/reagent_containers/food/misc.dm +++ b/code/modules/reagents/reagent_containers/food/misc.dm @@ -3,7 +3,7 @@ desc = "Someone should be demoted from chef for this." icon_state = "badrecipe" filling_color = "#211f02" - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' bitesize = 2 /obj/item/chems/food/badrecipe/populate_reagents() @@ -16,7 +16,7 @@ desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" icon_state = "stuffing" filling_color = "#c9ac83" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_amt = 3 nutriment_desc = list("dryness" = 2, "bread" = 2) bitesize = 1 @@ -27,7 +27,7 @@ icon_state = "popcorn" trash = /obj/item/trash/popcorn filling_color = "#fffad4" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_desc = list("popcorn" = 3) nutriment_amt = 2 bitesize = 0.1 @@ -37,7 +37,7 @@ desc = "Totally baked." icon_state = "loadedbakedpotato" filling_color = "#9c7a68" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("baked potato" = 3) nutriment_amt = 3 bitesize = 2 @@ -52,7 +52,7 @@ icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl filling_color = "#42b873" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_desc = list("mushroom" = 5, "rainbow" = 1) nutriment_amt = 6 bitesize = 3 @@ -67,7 +67,7 @@ icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl filling_color = "#ed0758" - center_of_mass = @"{'x':16,'y':5}" + center_of_mass = @'{"x":16,"y":5}' nutriment_desc = list("jelly" = 3, "mushroom" = 3) nutriment_amt = 6 bitesize = 3 @@ -83,7 +83,7 @@ icon_state = "enchiladas" trash = /obj/item/trash/tray filling_color = "#a36a1f" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("tortilla" = 3, "corn" = 3) nutriment_amt = 2 bitesize = 4 @@ -99,7 +99,7 @@ icon_state = "monkeysdelight" trash = /obj/item/trash/tray filling_color = "#5c3c11" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' bitesize = 6 /obj/item/chems/food/monkeysdelight/populate_reagents() @@ -114,7 +114,7 @@ desc = "An apple coated in sugary sweetness." icon_state = "candiedapple" filling_color = "#f21873" - center_of_mass = @"{'x':15,'y':13}" + center_of_mass = @'{"x":15,"y":13}' nutriment_desc = list("apple" = 3, "caramel" = 3, "sweetness" = 2) nutriment_amt = 3 bitesize = 3 @@ -124,7 +124,7 @@ desc = "A tasty after-dinner mint. It is only wafer thin." icon_state = "mint" filling_color = "#f2f2f2" - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' bitesize = 1 /obj/item/chems/food/mint/populate_reagents() @@ -136,7 +136,7 @@ desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced wheat flour." icon_state = "phelmbiscuit" filling_color = "#cfb4c4" - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' nutriment_desc = list("mushroom" = 4) nutriment_amt = 5 bitesize = 2 @@ -155,7 +155,7 @@ icon_state = "gappletart" trash = /obj/item/trash/plate filling_color = "#ffff00" - center_of_mass = @"{'x':16,'y':18}" + center_of_mass = @'{"x":16,"y":18}' nutriment_desc = list("apple" = 8) nutriment_amt = 8 bitesize = 3 @@ -169,7 +169,7 @@ desc = "It's a salted cracker." icon_state = "cracker" filling_color = "#f5deb8" - center_of_mass = @"{'x':17,'y':6}" + center_of_mass = @'{"x":17,"y":6}' nutriment_desc = list("salt" = 1, "cracker" = 2) w_class = ITEM_SIZE_TINY nutriment_amt = 1 @@ -184,7 +184,7 @@ desc = "Take a bite!" icon_state = "taco" bitesize = 3 - center_of_mass = @"{'x':21,'y':12}" + center_of_mass = @'{"x":21,"y":12}' nutriment_desc = list("cheese" = 2,"taco shell" = 2) nutriment_amt = 4 nutriment_type = /decl/material/liquid/nutriment/bread @@ -198,7 +198,7 @@ desc = "Raw meat appetizer." icon_state = "pelmen" filling_color = "#ffffff" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 2 /obj/item/chems/food/pelmen/populate_reagents() @@ -210,7 +210,7 @@ desc = "A dish consisting of boiled pieces of meat wrapped in dough. Delicious!" icon_state = "pelmeni_boiled" filling_color = "#ffffff" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' bitesize = 2 /obj/item/chems/food/pelmeni_boiled/populate_reagents() diff --git a/code/modules/reagents/reagent_containers/food/pasta.dm b/code/modules/reagents/reagent_containers/food/pasta.dm index 97f839d2db3..f1eb02bdb52 100644 --- a/code/modules/reagents/reagent_containers/food/pasta.dm +++ b/code/modules/reagents/reagent_containers/food/pasta.dm @@ -7,7 +7,7 @@ desc = "A bundle of raw spaghetti." icon_state = "spagetti" filling_color = "#eddd00" - center_of_mass = @"{'x':16,'y':16}" + center_of_mass = @'{"x":16,"y":16}' nutriment_desc = list("noodles" = 2) nutriment_amt = 1 bitesize = 1 @@ -18,7 +18,7 @@ icon_state = "spagettiboiled" trash = /obj/item/trash/plate filling_color = "#fcee81" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("noodles" = 2) nutriment_amt = 2 bitesize = 2 @@ -29,7 +29,7 @@ icon_state = "pastatomato" trash = /obj/item/trash/plate filling_color = "#de4545" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("tomato" = 3, "noodles" = 3) nutriment_amt = 6 bitesize = 4 @@ -44,7 +44,7 @@ icon_state = "nanopasta" trash = /obj/item/trash/plate filling_color = "#535e66" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_amt = 6 bitesize = 4 @@ -58,7 +58,7 @@ icon_state = "meatballspagetti" trash = /obj/item/trash/plate filling_color = "#de4545" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("noodles" = 4) nutriment_amt = 4 bitesize = 2 @@ -71,7 +71,7 @@ desc = "Do you want some pasta with those meatballs?" icon_state = "spesslaw" filling_color = "#de4545" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("noodles" = 4) nutriment_amt = 4 bitesize = 2 diff --git a/code/modules/reagents/reagent_containers/food/rice.dm b/code/modules/reagents/reagent_containers/food/rice.dm index f95a46518c2..34db6b3e997 100644 --- a/code/modules/reagents/reagent_containers/food/rice.dm +++ b/code/modules/reagents/reagent_containers/food/rice.dm @@ -8,7 +8,7 @@ icon_state = "boiledrice" trash = /obj/item/trash/snack_bowl filling_color = "#fffbdb" - center_of_mass = @"{'x':17,'y':11}" + center_of_mass = @'{"x":17,"y":11}' nutriment_desc = list("rice" = 2) nutriment_amt = 6 bitesize = 2 @@ -27,7 +27,7 @@ icon_state = "katsu" trash = /obj/item/trash/snack_bowl filling_color = "#faa005" - center_of_mass = @"{'x':17,'y':11}" + center_of_mass = @'{"x":17,"y":11}' nutriment_desc = list("rice" = 2, "apple" = 2, "potato" = 2, "carrot" = 2, "bread" = 2, ) nutriment_amt = 6 bitesize = 2 @@ -38,7 +38,7 @@ icon_state = "rpudding" trash = /obj/item/trash/snack_bowl filling_color = "#fffbdb" - center_of_mass = @"{'x':17,'y':11}" + center_of_mass = @'{"x":17,"y":11}' nutriment_desc = list("rice" = 2) nutriment_amt = 4 bitesize = 2 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/rotten.dm b/code/modules/reagents/reagent_containers/food/rotten.dm index 1001a71fea8..64e9299847e 100644 --- a/code/modules/reagents/reagent_containers/food/rotten.dm +++ b/code/modules/reagents/reagent_containers/food/rotten.dm @@ -3,11 +3,12 @@ /obj/item/chems/food/old name = "master old-food" desc = "they're all inedible and potentially dangerous items" - center_of_mass = @"{'x':15,'y':12}" + center_of_mass = @'{"x":15,"y":12}' nutriment_desc = list("rot" = 5, "mold" = 5) nutriment_amt = 10 bitesize = 3 filling_color = "#336b42" + abstract_type = /obj/item/chems/food/old /obj/item/chems/food/old/populate_reagents() . = ..() diff --git a/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm b/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm index f9e9bd01be4..5a3f2890242 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm @@ -5,7 +5,7 @@ slice_path = /obj/item/chems/food/slice/carrotcake slices_num = 5 filling_color = "#ffd675" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "carrot" = 15) nutriment_amt = 25 bitesize = 2 @@ -22,7 +22,7 @@ trash = /obj/item/trash/plate filling_color = "#ffd675" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/carrotcake /obj/item/chems/food/slice/carrotcake/filled @@ -35,7 +35,7 @@ slice_path = /obj/item/chems/food/slice/braincake slices_num = 5 filling_color = "#e6aedb" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "slime" = 15) nutriment_amt = 5 bitesize = 2 @@ -53,7 +53,7 @@ trash = /obj/item/trash/plate filling_color = "#e6aedb" bitesize = 2 - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' whole_path = /obj/item/chems/food/sliceable/braincake /obj/item/chems/food/slice/braincake/filled @@ -66,7 +66,7 @@ slice_path = /obj/item/chems/food/slice/cheesecake slices_num = 5 filling_color = "#faf7af" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "cream" = 10, "cheese" = 15) nutriment_amt = 10 bitesize = 2 @@ -82,7 +82,7 @@ trash = /obj/item/trash/plate filling_color = "#faf7af" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/cheesecake /obj/item/chems/food/slice/cheesecake/filled @@ -95,7 +95,7 @@ slice_path = /obj/item/chems/food/slice/plaincake slices_num = 5 filling_color = "#f7edd5" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "vanilla" = 15) nutriment_amt = 20 nutriment_type = /decl/material/liquid/nutriment/bread/cake @@ -107,7 +107,7 @@ trash = /obj/item/trash/plate filling_color = "#f7edd5" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/plaincake /obj/item/chems/food/slice/plaincake/filled @@ -120,7 +120,7 @@ slice_path = /obj/item/chems/food/slice/orangecake slices_num = 5 filling_color = "#fada8e" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "orange" = 15) nutriment_amt = 20 nutriment_type = /decl/material/liquid/nutriment/bread/cake @@ -132,7 +132,7 @@ trash = /obj/item/trash/plate filling_color = "#fada8e" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/orangecake /obj/item/chems/food/slice/orangecake/filled @@ -145,7 +145,7 @@ slice_path = /obj/item/chems/food/slice/limecake slices_num = 5 filling_color = "#cbfa8e" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "lime" = 15) nutriment_amt = 20 nutriment_type = /decl/material/liquid/nutriment/bread/cake @@ -157,7 +157,7 @@ trash = /obj/item/trash/plate filling_color = "#cbfa8e" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/limecake /obj/item/chems/food/slice/limecake/filled @@ -170,7 +170,7 @@ slice_path = /obj/item/chems/food/slice/lemoncake slices_num = 5 filling_color = "#fafa8e" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "lemon" = 15) nutriment_amt = 20 nutriment_type = /decl/material/liquid/nutriment/bread/cake @@ -182,7 +182,7 @@ trash = /obj/item/trash/plate filling_color = "#fafa8e" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/lemoncake /obj/item/chems/food/slice/lemoncake/filled @@ -195,7 +195,7 @@ slice_path = /obj/item/chems/food/slice/chocolatecake slices_num = 5 filling_color = "#805930" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "chocolate" = 15) nutriment_amt = 20 nutriment_type = /decl/material/liquid/nutriment/bread/cake @@ -207,7 +207,7 @@ trash = /obj/item/trash/plate filling_color = "#805930" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/chocolatecake /obj/item/chems/food/slice/chocolatecake/filled @@ -220,7 +220,7 @@ slice_path = /obj/item/chems/food/slice/birthdaycake slices_num = 5 filling_color = "#ffd6d6" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10) nutriment_amt = 20 bitesize = 3 @@ -237,7 +237,7 @@ trash = /obj/item/trash/plate filling_color = "#ffd6d6" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/birthdaycake /obj/item/chems/food/slice/birthdaycake/filled @@ -250,7 +250,7 @@ slice_path = /obj/item/chems/food/slice/applecake slices_num = 5 filling_color = "#ebf5b8" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cake" = 10, "sweetness" = 10, "apple" = 15) nutriment_amt = 15 nutriment_type = /decl/material/liquid/nutriment/bread/cake @@ -262,7 +262,7 @@ trash = /obj/item/trash/plate filling_color = "#ebf5b8" bitesize = 2 - center_of_mass = @"{'x':16,'y':14}" + center_of_mass = @'{"x":16,"y":14}' whole_path = /obj/item/chems/food/sliceable/applecake /obj/item/chems/food/slice/applecake/filled @@ -275,7 +275,7 @@ slice_path = /obj/item/chems/food/slice/pumpkinpie slices_num = 5 filling_color = "#f5b951" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("pie" = 5, "cream" = 5, "pumpkin" = 5) nutriment_amt = 15 @@ -286,7 +286,7 @@ trash = /obj/item/trash/plate filling_color = "#f5b951" bitesize = 2 - center_of_mass = @"{'x':16,'y':12}" + center_of_mass = @'{"x":16,"y":12}' whole_path = /obj/item/chems/food/sliceable/pumpkinpie /obj/item/chems/food/slice/pumpkinpie/filled diff --git a/code/modules/reagents/reagent_containers/food/sliceable/cheeses.dm b/code/modules/reagents/reagent_containers/food/sliceable/cheeses.dm index fb076444459..c84751c530d 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/cheeses.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/cheeses.dm @@ -5,7 +5,7 @@ slice_path = /obj/item/chems/food/cheesewedge slices_num = 5 filling_color = "#fff700" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("cheese" = 10) nutriment_amt = 10 bitesize = 2 @@ -20,6 +20,6 @@ icon_state = "cheesewedge" filling_color = "#fff700" bitesize = 2 - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' // todo: non-cheddar cheeses \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/sliceable/loaves.dm b/code/modules/reagents/reagent_containers/food/sliceable/loaves.dm index b5c168fd449..0906466aa22 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/loaves.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/loaves.dm @@ -5,7 +5,7 @@ slice_path = /obj/item/chems/food/slice/meatbread slices_num = 5 filling_color = "#ff7575" - center_of_mass = @"{'x':19,'y':9}" + center_of_mass = @'{"x":19,"y":9}' nutriment_desc = list("bread" = 10) nutriment_amt = 10 bitesize = 2 @@ -22,7 +22,7 @@ trash = /obj/item/trash/plate filling_color = "#ff7575" bitesize = 2 - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' whole_path = /obj/item/chems/food/sliceable/meatbread /obj/item/chems/food/slice/meatbread/filled @@ -35,7 +35,7 @@ slice_path = /obj/item/chems/food/slice/xenomeatbread slices_num = 5 filling_color = "#8aff75" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' nutriment_desc = list("bread" = 10) nutriment_amt = 10 bitesize = 2 @@ -52,7 +52,7 @@ trash = /obj/item/trash/plate filling_color = "#8aff75" bitesize = 2 - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' whole_path = /obj/item/chems/food/sliceable/xenomeatbread /obj/item/chems/food/slice/xenomeatbread/filled @@ -65,7 +65,7 @@ slice_path = /obj/item/chems/food/slice/bananabread slices_num = 5 filling_color = "#ede5ad" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' nutriment_desc = list("bread" = 10) nutriment_amt = 10 bitesize = 2 @@ -82,7 +82,7 @@ trash = /obj/item/trash/plate filling_color = "#ede5ad" bitesize = 2 - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' whole_path = /obj/item/chems/food/sliceable/bananabread /obj/item/chems/food/slice/bananabread/filled @@ -95,7 +95,7 @@ slice_path = /obj/item/chems/food/slice/tofubread slices_num = 5 filling_color = "#f7ffe0" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' nutriment_desc = list("tofu" = 10) nutriment_amt = 10 bitesize = 2 @@ -108,7 +108,7 @@ trash = /obj/item/trash/plate filling_color = "#f7ffe0" bitesize = 2 - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' whole_path = /obj/item/chems/food/sliceable/tofubread /obj/item/chems/food/slice/tofubread/filled @@ -121,7 +121,7 @@ slice_path = /obj/item/chems/food/slice/bread slices_num = 5 filling_color = "#ffe396" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' nutriment_desc = list("bread" = 6) nutriment_amt = 6 bitesize = 2 @@ -134,7 +134,7 @@ trash = /obj/item/trash/plate filling_color = "#d27332" bitesize = 2 - center_of_mass = @"{'x':16,'y':4}" + center_of_mass = @'{"x":16,"y":4}' whole_path = /obj/item/chems/food/sliceable/bread /obj/item/chems/food/slice/bread/filled @@ -147,7 +147,7 @@ slice_path = /obj/item/chems/food/slice/creamcheesebread slices_num = 5 filling_color = "#fff896" - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' nutriment_desc = list("bread" = 6, "cream" = 3, "cheese" = 3) nutriment_amt = 5 bitesize = 2 @@ -164,7 +164,7 @@ trash = /obj/item/trash/plate filling_color = "#fff896" bitesize = 2 - center_of_mass = @"{'x':16,'y':13}" + center_of_mass = @'{"x":16,"y":13}' whole_path = /obj/item/chems/food/sliceable/creamcheesebread /obj/item/chems/food/slice/creamcheesebread/filled diff --git a/code/modules/reagents/reagent_containers/food/sliceable/misc_slices.dm b/code/modules/reagents/reagent_containers/food/sliceable/misc_slices.dm index 1232094ad3f..cb6dc5b9cc5 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/misc_slices.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/misc_slices.dm @@ -4,4 +4,4 @@ icon_state = "watermelonslice" filling_color = "#ff3867" bitesize = 2 - center_of_mass = @"{'x':16,'y':10}" \ No newline at end of file + center_of_mass = @'{"x":16,"y":10}' \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm b/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm index 1798fb1291a..78af7f12cc8 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm @@ -12,7 +12,7 @@ icon_state = "pizzamargherita" slice_path = /obj/item/chems/food/slice/margherita slices_num = 6 - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) nutriment_amt = 35 bitesize = 2 @@ -29,7 +29,7 @@ icon_state = "pizzamargheritaslice" filling_color = "#baa14c" bitesize = 2 - center_of_mass = @"{'x':18,'y':13}" + center_of_mass = @'{"x":18,"y":13}' whole_path = /obj/item/chems/food/sliceable/pizza/margherita /obj/item/chems/food/slice/margherita/filled @@ -41,7 +41,7 @@ icon_state = "meatpizza" slice_path = /obj/item/chems/food/slice/meatpizza slices_num = 6 - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) nutriment_amt = 10 bitesize = 2 @@ -58,7 +58,7 @@ icon_state = "meatpizzaslice" filling_color = "#baa14c" bitesize = 2 - center_of_mass = @"{'x':18,'y':13}" + center_of_mass = @'{"x":18,"y":13}' whole_path = /obj/item/chems/food/sliceable/pizza/meatpizza /obj/item/chems/food/slice/meatpizza/filled @@ -70,7 +70,7 @@ icon_state = "mushroompizza" slice_path = /obj/item/chems/food/slice/mushroompizza slices_num = 6 - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "mushroom" = 10) nutriment_amt = 35 bitesize = 2 @@ -86,7 +86,7 @@ icon_state = "mushroompizzaslice" filling_color = "#baa14c" bitesize = 2 - center_of_mass = @"{'x':18,'y':13}" + center_of_mass = @'{"x":18,"y":13}' whole_path = /obj/item/chems/food/sliceable/pizza/mushroompizza /obj/item/chems/food/slice/mushroompizza/filled @@ -98,7 +98,7 @@ icon_state = "vegetablepizza" slice_path = /obj/item/chems/food/slice/vegetablepizza slices_num = 6 - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5) nutriment_amt = 25 bitesize = 2 @@ -116,7 +116,7 @@ icon_state = "vegetablepizzaslice" filling_color = "#baa14c" bitesize = 2 - center_of_mass = @"{'x':18,'y':13}" + center_of_mass = @'{"x":18,"y":13}' whole_path = /obj/item/chems/food/sliceable/pizza/vegetablepizza /obj/item/chems/food/slice/vegetablepizza/filled @@ -127,7 +127,7 @@ desc = "A box suited for pizzas." icon = 'icons/obj/food.dmi' icon_state = "pizzabox1" - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard var/open = 0 // Is the box open? var/ismessy = 0 // Fancy mess on the lid var/obj/item/chems/food/sliceable/pizza/pizza // content pizza diff --git a/code/modules/reagents/reagent_containers/food/soup.dm b/code/modules/reagents/reagent_containers/food/soup.dm index c2a8a192450..f0069492db8 100644 --- a/code/modules/reagents/reagent_containers/food/soup.dm +++ b/code/modules/reagents/reagent_containers/food/soup.dm @@ -8,7 +8,7 @@ icon_state = "meatballsoup" trash = /obj/item/trash/snack_bowl filling_color = "#785210" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' bitesize = 5 eat_sound = list('sound/items/eatfood.ogg', 'sound/items/drink.ogg') @@ -22,7 +22,7 @@ desc = "Smells like copper." icon_state = "tomatosoup" filling_color = "#ff0000" - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' bitesize = 5 eat_sound = 'sound/items/drink.ogg' @@ -37,7 +37,7 @@ desc = "Not very funny." icon_state = "clownstears" filling_color = "#c4fbff" - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' nutriment_desc = list("salt" = 1, "the worst joke" = 3) nutriment_amt = 4 bitesize = 5 @@ -54,7 +54,7 @@ icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl filling_color = "#afc4b5" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_desc = list("carrot" = 2, "corn" = 2, "eggplant" = 2, "potato" = 2) nutriment_amt = 8 bitesize = 5 @@ -70,7 +70,7 @@ icon_state = "nettlesoup" trash = /obj/item/trash/snack_bowl filling_color = "#afc4b5" - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' nutriment_desc = list("salad" = 4, "egg" = 2, "potato" = 2) nutriment_amt = 8 bitesize = 5 @@ -87,7 +87,7 @@ icon_state = "mysterysoup" trash = /obj/item/trash/snack_bowl filling_color = "#f082ff" - center_of_mass = @"{'x':16,'y':6}" + center_of_mass = @'{"x":16,"y":6}' nutriment_desc = list("backwash" = 1) nutriment_amt = 1 bitesize = 5 @@ -149,7 +149,7 @@ icon_state = "wishsoup" trash = /obj/item/trash/snack_bowl filling_color = "#d1f4ff" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' bitesize = 5 eat_sound = 'sound/items/drink.ogg' @@ -166,7 +166,7 @@ icon_state = "hotchili" trash = /obj/item/trash/snack_bowl filling_color = "#ff3c00" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("chilli peppers" = 2, "burning" = 1) nutriment_amt = 3 bitesize = 5 @@ -182,7 +182,7 @@ desc = "This slush is barely a liquid!" icon_state = "coldchili" filling_color = "#2b00ff" - center_of_mass = @"{'x':15,'y':9}" + center_of_mass = @'{"x":15,"y":9}' nutriment_desc = list("chilly peppers" = 3) nutriment_amt = 3 trash = /obj/item/trash/snack_bowl @@ -200,7 +200,7 @@ icon_state = "tomatosoup" trash = /obj/item/trash/snack_bowl filling_color = "#d92929" - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' nutriment_desc = list("soup" = 5) nutriment_amt = 5 bitesize = 3 @@ -215,7 +215,7 @@ desc = "A nice and warm stew. Healthy and strong." icon_state = "stew" filling_color = "#9e673a" - center_of_mass = @"{'x':16,'y':5}" + center_of_mass = @'{"x":16,"y":5}' nutriment_desc = list("tomato" = 2, "potato" = 2, "carrot" = 2, "eggplant" = 2, "mushroom" = 2) nutriment_amt = 6 bitesize = 10 @@ -232,7 +232,7 @@ desc = "The universes best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' nutriment_desc = list("soy" = 8) nutriment_amt = 8 bitesize = 4 @@ -248,7 +248,7 @@ icon_state = "mushroomsoup" trash = /obj/item/trash/snack_bowl filling_color = "#e386bf" - center_of_mass = @"{'x':17,'y':10}" + center_of_mass = @'{"x":17,"y":10}' nutriment_desc = list("mushroom" = 8, "milk" = 2) nutriment_amt = 8 bitesize = 3 @@ -260,7 +260,7 @@ icon_state = "beetsoup" trash = /obj/item/trash/snack_bowl filling_color = "#fac9ff" - center_of_mass = @"{'x':15,'y':8}" + center_of_mass = @'{"x":15,"y":8}' nutriment_desc = list("tomato" = 4, "beet" = 4) nutriment_amt = 8 bitesize = 2 diff --git a/code/modules/reagents/reagent_containers/food/soy.dm b/code/modules/reagents/reagent_containers/food/soy.dm index 727043f19be..930a160c0ea 100644 --- a/code/modules/reagents/reagent_containers/food/soy.dm +++ b/code/modules/reagents/reagent_containers/food/soy.dm @@ -3,7 +3,7 @@ icon_state = "tofu" desc = "We all love tofu." filling_color = "#fffee0" - center_of_mass = @"{'x':17,'y':10}" + center_of_mass = @'{"x":17,"y":10}' nutriment_amt = 3 nutriment_desc = list("tofu" = 3, "softness" = 3) bitesize = 3 @@ -18,7 +18,7 @@ icon_state = "soydope" trash = /obj/item/trash/plate filling_color = "#c4bf76" - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("slime" = 2, "soy" = 2) nutriment_amt = 2 bitesize = 2 @@ -29,7 +29,7 @@ desc = "Vegan meat, on a stick." trash = /obj/item/stack/material/rods filling_color = "#fffee0" - center_of_mass = @"{'x':17,'y':15}" + center_of_mass = @'{"x":17,"y":15}' nutriment_desc = list("tofu" = 3, "metal" = 1) nutriment_amt = 8 bitesize = 2 @@ -39,7 +39,7 @@ desc = "A fake turkey made from tofu." icon_state = "tofurkey" filling_color = "#fffee0" - center_of_mass = @"{'x':16,'y':8}" + center_of_mass = @'{"x":16,"y":8}' nutriment_amt = 12 nutriment_desc = list("turkey" = 3, "tofu" = 5, "softness" = 4) bitesize = 3 @@ -49,7 +49,7 @@ desc = "Even non-vegetarians will LOVE this!" icon_state = "stewedsoymeat" trash = /obj/item/trash/plate - center_of_mass = @"{'x':16,'y':10}" + center_of_mass = @'{"x":16,"y":10}' nutriment_desc = list("soy" = 4, "tomato" = 4) nutriment_amt = 8 bitesize = 2 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/veggie.dm b/code/modules/reagents/reagent_containers/food/veggie.dm index 3f8a53ff5dd..5f29982c1e6 100644 --- a/code/modules/reagents/reagent_containers/food/veggie.dm +++ b/code/modules/reagents/reagent_containers/food/veggie.dm @@ -8,7 +8,7 @@ icon_state = "aesirsalad" trash = /obj/item/trash/snack_bowl filling_color = "#468c00" - center_of_mass = @"{'x':17,'y':11}" + center_of_mass = @'{"x":17,"y":11}' nutriment_amt = 8 nutriment_desc = list("apples" = 3,"salad" = 4, "quintessence" = 2) bitesize = 3 @@ -23,7 +23,7 @@ icon_state = "herbsalad" trash = /obj/item/trash/snack_bowl filling_color = "#76b87f" - center_of_mass = @"{'x':17,'y':11}" + center_of_mass = @'{"x":17,"y":11}' nutriment_desc = list("salad" = 2, "tomato" = 2, "carrot" = 2, "apple" = 2) nutriment_amt = 8 bitesize = 3 @@ -34,7 +34,7 @@ icon_state = "validsalad" trash = /obj/item/trash/snack_bowl filling_color = "#76b87f" - center_of_mass = @"{'x':17,'y':11}" + center_of_mass = @'{"x":17,"y":11}' nutriment_desc = list("100% real salad") nutriment_amt = 6 bitesize = 3 @@ -49,7 +49,7 @@ icon_state = "carrotfries" trash = /obj/item/trash/plate filling_color = "#faa005" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_desc = list("carrot" = 3, "salt" = 1) nutriment_amt = 3 bitesize = 2 @@ -63,7 +63,7 @@ desc = "A slice from a huge mushroom." icon_state = "hugemushroomslice" filling_color = "#e0d7c5" - center_of_mass = @"{'x':17,'y':16}" + center_of_mass = @'{"x":17,"y":16}' nutriment_amt = 3 nutriment_desc = list("raw" = 2, "mushroom" = 2) bitesize = 6 diff --git a/code/modules/reagents/reagent_containers/food_edibility.dm b/code/modules/reagents/reagent_containers/food_edibility.dm new file mode 100644 index 00000000000..5aa5d600162 --- /dev/null +++ b/code/modules/reagents/reagent_containers/food_edibility.dm @@ -0,0 +1,42 @@ +/obj/item/chems/food/show_feed_message_end(var/mob/user, var/mob/target) + target = target || user + if(user && user == target && isliving(user)) + var/mob/living/living_user = user + switch(living_user.get_food_satiation() / living_user.get_satiated_nutrition()) + if(-(INFINITY) to 0.2) + to_chat(living_user, SPAN_WARNING("You hungrily chew out a piece of [src] and gobble it!")) + if(0.2 to 0.4) + to_chat(living_user, SPAN_NOTICE("You hungrily begin to eat [src].")) + if(0.4 to 0.8) + . = ..() + else + to_chat(living_user, SPAN_NOTICE("You unwillingly chew a bit of [src].")) + +/obj/item/chems/food/play_feed_sound(mob/user, consumption_method = EATING_METHOD_EAT) + if(eat_sound) + playsound(user, pick(eat_sound), rand(10, 50), 1) + return + return ..() + +/obj/item/chems/food/handle_eaten_by_mob(mob/user, mob/target) + . = ..() + if(. == EATEN_SUCCESS) + bitecount++ + +/obj/item/chems/food/get_food_default_transfer_amount(mob/eater) + return eater?.get_eaten_transfer_amount(bitesize) + +/obj/item/chems/food/handle_consumed(mob/feeder, mob/eater, consumption_method = EATING_METHOD_EAT) + + if(isliving(eater) && cooked_food) + var/mob/living/living_eater = eater + living_eater.add_stressor(/datum/stressor/ate_cooked_food, 15 MINUTES) + + var/trash_ref = trash + . = ..() + if(. && trash_ref) + if(ispath(trash_ref, /obj/item)) + var/obj/item/trash_item = new trash_ref(get_turf(feeder)) + feeder.put_in_hands(trash_item) + else if(istype(trash_ref, /obj/item)) + feeder.put_in_hands(trash_ref) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 43ad029be2d..6fcbed2723f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -13,8 +13,8 @@ w_class = ITEM_SIZE_SMALL atom_flags = ATOM_FLAG_OPEN_CONTAINER obj_flags = OBJ_FLAG_HOLLOW - unacidable = 1 //glass doesn't dissolve in acid - + material = /decl/material/solid/glass + abstract_type = /obj/item/chems/glass drop_sound = 'sound/foley/bottledrop1.ogg' pickup_sound = 'sound/foley/bottlepickup1.ogg' @@ -37,7 +37,8 @@ /obj/machinery/smartfridge/, /obj/machinery/biogenerator, /obj/machinery/constructable_frame, - /obj/machinery/radiocarbon_spectrometer + /obj/machinery/radiocarbon_spectrometer, + /obj/machinery/material_processing/extractor ) /obj/item/chems/glass/examine(mob/user, distance) @@ -67,20 +68,6 @@ return ..() return FALSE -/obj/item/chems/glass/standard_feed_mob(var/mob/user, var/mob/target) - if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, "You need to open \the [src] first.") - return 1 - if(user.a_intent == I_HURT) - return 1 - return ..() - -/obj/item/chems/glass/self_feed_message(var/mob/user) - to_chat(user, "You swallow a gulp from \the [src].") - if(user.has_personal_goal(/datum/goal/achievement/specific_object/drink)) - for(var/R in reagents.reagent_volumes) - user.update_personal_goal(/datum/goal/achievement/specific_object/drink, R) - /obj/item/chems/glass/afterattack(var/obj/target, var/mob/user, var/proximity) if(!ATOM_IS_OPEN_CONTAINER(src) || !proximity) //Is the container open & are they next to whatever they're clicking? return FALSE //If not, do nothing. @@ -91,7 +78,7 @@ return TRUE if(standard_pour_into(user, target)) //Pouring into another beaker? return TRUE - if(standard_feed_mob(user, target)) + if(handle_eaten_by_mob(user, target) != EATEN_INVALID) return TRUE if(user.a_intent == I_HURT) if(standard_splash_mob(user,target)) @@ -111,15 +98,14 @@ desc = "It's a bucket." icon = 'icons/obj/items/bucket.dmi' icon_state = ICON_STATE_WORLD - center_of_mass = @"{'x':16,'y':9}" + center_of_mass = @'{"x":16,"y":9}' w_class = ITEM_SIZE_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = @"[10,20,30,60,120,150,180]" volume = 180 atom_flags = ATOM_FLAG_OPEN_CONTAINER presentation_flags = PRESENTATION_FLAG_NAME - unacidable = 0 - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic material_force_multiplier = 0.2 slot_flags = SLOT_HEAD drop_sound = 'sound/foley/donk1.ogg' @@ -129,7 +115,7 @@ desc = "It's a wooden bucket. How rustic." icon = 'icons/obj/items/wooden_bucket.dmi' volume = 200 - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood /obj/item/chems/glass/bucket/attackby(var/obj/D, mob/user) if(istype(D, /obj/item/mop)) diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 92eb3821c2a..4442ef8a475 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/items/chem/bottle.dmi' icon_state = ICON_STATE_WORLD randpixel = 7 - center_of_mass = @"{'x':16,'y':15}" + center_of_mass = @'{"x":16,"y":15}' amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60]" w_class = ITEM_SIZE_SMALL @@ -121,7 +121,7 @@ autolabel = FALSE label_color = COLOR_PALE_BTL_GREEN lid_color = COLOR_PALE_BTL_GREEN - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/chems/glass/bottle/eznutrient/populate_reagents() reagents.add_reagent(/decl/material/liquid/fertilizer, reagents.maximum_volume) @@ -132,7 +132,7 @@ autolabel = FALSE label_color = COMMS_COLOR_SCIENCE lid_color = COMMS_COLOR_SCIENCE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/chems/glass/bottle/left4zed/populate_reagents() var/mutagen_amount = round(reagents.maximum_volume / 6) @@ -145,7 +145,7 @@ autolabel = FALSE label_color = COLOR_ASSEMBLY_GREEN lid_color = COLOR_ASSEMBLY_GREEN - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/item/chems/glass/bottle/robustharvest/populate_reagents() var/amonia_amount = round(reagents.maximum_volume / 6) diff --git a/code/modules/reagents/reagent_containers/glass_edibility.dm b/code/modules/reagents/reagent_containers/glass_edibility.dm new file mode 100644 index 00000000000..2ffbb91be5b --- /dev/null +++ b/code/modules/reagents/reagent_containers/glass_edibility.dm @@ -0,0 +1,26 @@ +/obj/item/chems/glass/handle_eaten_by_mob(var/mob/user, var/mob/target) + if(!ATOM_IS_OPEN_CONTAINER(src)) + to_chat(user, SPAN_WARNING("You need to open \the [src] first.")) + return EATEN_UNABLE + if(user.a_intent == I_HURT) + return EATEN_INVALID + . = ..() + if(. == EATEN_SUCCESS && target?.has_personal_goal(/datum/goal/achievement/specific_object/drink)) + for(var/R in reagents.reagent_volumes) + target.update_personal_goal(/datum/goal/achievement/specific_object/drink, R) + +/obj/item/chems/glass/show_feed_message_start(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You begin trying to drink from \the [target].")) + else + user.visible_message(SPAN_NOTICE("\The [user] is trying to feed some of the contents of \the [src] to \the [target]!")) + +/obj/item/chems/glass/show_feed_message_end(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You swallow a gulp from \the [src].")) + else + user.visible_message(SPAN_NOTICE("\The [user] feeds some of the contents of \the [src] to \the [target]!")) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 805c30b3083..06abc3f994e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -2,20 +2,19 @@ /// HYPOSPRAY //////////////////////////////////////////////////////////////////////////////// -/obj/item/chems/hypospray //obsolete, use hypospray/vial for the actual hypospray item +/obj/item/chems/hypospray // abstract shared type, do not use directly name = "hypospray" desc = "A sterile, air-needle autoinjector for rapid administration of drugs to patients." - icon = 'icons/obj/syringe.dmi' - item_state = "hypo" - icon_state = "hypo" - origin_tech = "{'materials':4,'biotech':5}" + icon = 'icons/obj/hypospray.dmi' + icon_state = ICON_STATE_WORLD + abstract_type = /obj/item/chems/hypospray + origin_tech = @'{"materials":4,"biotech":5}' amount_per_transfer_from_this = 5 - unacidable = 1 volume = 30 possible_transfer_amounts = null atom_flags = ATOM_FLAG_OPEN_CONTAINER slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_TRACE, @@ -33,6 +32,10 @@ var/time = (1 SECONDS) / 1.9 var/single_use = TRUE // autoinjectors are not refillable (overriden for hypospray) +/obj/item/chems/hypospray/on_update_icon() + icon_state = get_world_inventory_state() + . = ..() + /obj/item/chems/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) to_chat(user, SPAN_WARNING("[src] is empty.")) @@ -81,7 +84,6 @@ //////////////////////////////////////////////////////////////////////////////// /obj/item/chems/hypospray/vial name = "hypospray" - item_state = "autoinjector" desc = "A sterile, air-needle autoinjector for rapid administration of drugs to patients. Uses a replacable 30u vial." possible_transfer_amounts = @"[1,2,5,10,15,20,30]" amount_per_transfer_from_this = 5 @@ -169,11 +171,10 @@ /obj/item/chems/hypospray/autoinjector name = "autoinjector" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel." - icon_state = "injector" - item_state = "autoinjector" + icon = 'icons/obj/autoinjector.dmi' amount_per_transfer_from_this = 5 volume = 5 - origin_tech = "{'materials':2,'biotech':2}" + origin_tech = @'{"materials":2,"biotech":2}' slot_flags = SLOT_LOWER_BODY | SLOT_EARS w_class = ITEM_SIZE_TINY detail_state = "_band" @@ -193,7 +194,8 @@ /obj/item/chems/hypospray/autoinjector/on_update_icon() . = ..() - icon_state = "[initial(icon_state)][(reagents?.total_volume) > 0]" + if(reagents?.total_volume <= 0) + icon_state = "[icon_state]_used" /obj/item/chems/hypospray/autoinjector/examine(mob/user) . = ..(user) diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 9c0846bfcab..3c045caba2b 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -3,19 +3,17 @@ /obj/item/chems/inhaler name = "autoinhaler" desc = "A rapid and safe way to administer small amounts of drugs into the lungs by untrained or trained personnel." - icon = 'icons/obj/syringe.dmi' - item_state = "autoinjector" - icon_state = "autoinhaler" - center_of_mass = @"{'x':16,'y':11}" - unacidable = TRUE + icon = 'icons/obj/inhaler.dmi' + icon_state = ICON_STATE_WORLD + center_of_mass = @'{"x":16,"y":11}' amount_per_transfer_from_this = 5 volume = 5 w_class = ITEM_SIZE_SMALL possible_transfer_amounts = null atom_flags = ATOM_FLAG_OPEN_CONTAINER slot_flags = SLOT_LOWER_BODY - origin_tech = "{'materials':2,'biotech':2}" - material = /decl/material/solid/plastic + origin_tech = @'{"materials":2,"biotech":2}' + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/aluminium = MATTER_AMOUNT_TRACE @@ -35,10 +33,11 @@ update_icon() /obj/item/chems/inhaler/on_update_icon() + icon_state = get_world_inventory_state() . = ..() if(ATOM_IS_OPEN_CONTAINER(src)) add_overlay("[icon_state]_loaded") - if(reagents.total_volume > 0) + if(reagents?.total_volume > 0) add_overlay("[icon_state]_reagents") /obj/item/chems/inhaler/attack(var/mob/living/carbon/human/target, var/mob/user, var/proximity) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 56ec7880d51..29327af664f 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -13,7 +13,7 @@ w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS volume = 30 - material = /decl/material/solid/plantmatter + material = /decl/material/solid/organic/plantmatter var/static/list/colorizable_icon_states = list("pill1", "pill2", "pill3", "pill4", "pill5") // if using an icon state from here, color will be derived from reagents /obj/item/chems/pill/Initialize() @@ -36,63 +36,24 @@ /obj/item/chems/pill/dragged_onto(var/mob/user) attack(user, user) -/obj/item/chems/pill/attack(mob/M, mob/user, def_zone) - //TODO: replace with standard_feed_mob() call. - if(M == user) - if(!M.can_eat(src)) - return - M.visible_message(SPAN_NOTICE("[M] swallows a pill."), SPAN_NOTICE("You swallow \the [src]."), null, 2) - if(reagents?.total_volume) - reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) - qdel(src) - return 1 - - else if(ishuman(M)) - if(!M.can_force_feed(user, src)) - return - - user.visible_message(SPAN_WARNING("[user] attempts to force [M] to swallow \the [src].")) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(!do_mob(user, M)) - return - user.visible_message(SPAN_WARNING("[user] forces [M] to swallow \the [src].")) - var/contained = REAGENT_LIST(src) - admin_attack_log(user, M, "Fed the victim with [name] (Reagents: [contained])", "Was fed [src] (Reagents: [contained])", "used [src] (Reagents: [contained]) to feed") - if(reagents.total_volume) - reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) - qdel(src) - return 1 - - return 0 - /obj/item/chems/pill/afterattack(obj/target, mob/user, proximity) - if(!proximity) return - - if(ATOM_IS_OPEN_CONTAINER(target) && target.reagents) + if(proximity && ATOM_IS_OPEN_CONTAINER(target) && target.reagents) if(!target.reagents.total_volume) - to_chat(user, "[target] is empty. Can't dissolve \the [src].") + to_chat(user, SPAN_WARNING("\The [target] is empty. You can't dissolve \the [src] in it.")) return - to_chat(user, "You dissolve \the [src] in [target].") - + to_chat(user, SPAN_NOTICE("You dissolve \the [src] in \the [target].")) + user.visible_message(SPAN_NOTICE("\The [user] puts something in \the [target]."), range = 2) admin_attacker_log(user, "spiked \a [target] with a pill. Reagents: [REAGENT_LIST(src)]") reagents.trans_to(target, reagents.total_volume) - user.visible_message(SPAN_NOTICE("\The [user] puts something in \the [target]."), range = 2) qdel(src) - return + return + return ..() //////////////////////////////////////////////////////////////////////////////// /// Pills. END //////////////////////////////////////////////////////////////////////////////// //We lied - it's pills all the way down -/obj/item/chems/pill/antitox - name = "antitoxins (25u)" - desc = "Neutralizes many common toxins." - icon_state = "pill1" - -/obj/item/chems/pill/antitox/populate_reagents() - reagents.add_reagent(/decl/material/liquid/antitoxins, 25) - /obj/item/chems/pill/bromide name = "bromide pill" desc = "Highly toxic." @@ -168,12 +129,13 @@ reagents.add_reagent(/decl/material/liquid/oxy_meds, 15) /obj/item/chems/pill/antitoxins - name = "antitoxins (15u)" + name = "antitoxins (25u)" desc = "A broad-spectrum anti-toxin." icon_state = "pill1" /obj/item/chems/pill/antitoxins/populate_reagents() - reagents.add_reagent(/decl/material/liquid/antitoxins, 15) + // Antitox is easy to make and has no OD threshold so we can get away with big pills. + reagents.add_reagent(/decl/material/liquid/antitoxins, 25) /obj/item/chems/pill/brute_meds name = "styptic (20u)" @@ -266,14 +228,13 @@ name = "detergent pod" desc = "Put in water to get space cleaner. Do not eat. Really." icon_state = "pod21" - var/smell_clean_time = 10 MINUTES // Don't overwrite the custom name. /obj/item/chems/pill/detergent/update_container_name() return /obj/item/chems/pill/detergent/populate_reagents() - reagents.add_reagent(/decl/material/gas/ammonia, 30) + reagents.add_reagent(/decl/material/liquid/contaminant_cleaner, 30) /obj/item/chems/pill/pod name = "master flavorpod item" diff --git a/code/modules/reagents/reagent_containers/pill_edibility.dm b/code/modules/reagents/reagent_containers/pill_edibility.dm new file mode 100644 index 00000000000..9aa114344fc --- /dev/null +++ b/code/modules/reagents/reagent_containers/pill_edibility.dm @@ -0,0 +1,24 @@ +/obj/item/chems/pill/get_food_default_transfer_amount(mob/eater) + return reagents?.total_volume // Always eat it in one bite. + +/obj/item/chems/pill/show_feed_message_start(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You begin trying to swallow \the [target].")) + else + user.visible_message(SPAN_NOTICE("\The [user] attempts to force \the [target] to swallow \the [src]!")) + +/obj/item/chems/pill/show_feed_message_end(var/mob/user, var/mob/target) + target = target || user + if(user) + if(user == target) + to_chat(user, SPAN_NOTICE("You swallow \the [src].")) + else + user.visible_message(SPAN_NOTICE("\The [user] forces \the [target] to swallow \the [src]!")) + +/obj/item/chems/pill/play_feed_sound(mob/user, consumption_method = EATING_METHOD_EAT) + return + +/obj/item/chems/pill/show_food_consumed_message(mob/user, mob/target) + return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index ffb93d52c44..c533beca5a5 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -12,8 +12,7 @@ throw_range = 10 throwforce = 3 attack_cooldown = DEFAULT_QUICK_COOLDOWN - unacidable = TRUE //plastic - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic volume = 250 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10]" @@ -22,7 +21,9 @@ var/tmp/particle_move_delay = 10 ///lower is faster var/tmp/sound_spray = 'sound/effects/spray2.ogg' ///Sound played when spraying var/safety = FALSE ///Whether the safety is on - + +/obj/item/chems/spray/solvent_can_melt(var/solvent_power = MAT_SOLVENT_STRONG) + return FALSE // maybe reconsider this /obj/item/chems/spray/Initialize() . = ..() @@ -70,7 +71,7 @@ /obj/item/chems/spray/proc/create_chempuff(var/atom/movable/target, var/particle_amount) set waitfor = FALSE - + var/obj/effect/effect/water/chempuff/D = new/obj/effect/effect/water/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this) if(QDELETED(src)) @@ -191,7 +192,7 @@ w_class = ITEM_SIZE_LARGE possible_transfer_amounts = null volume = 600 - origin_tech = "{'combat':3,'materials':3,'engineering':3}" + origin_tech = @'{"combat":3,"materials":3,"engineering":3}' particle_move_delay = 2 //Was hardcoded to 2 before, and 8 was slower than most mob's move speed material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 16be8b07730..b408d1c88ec 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -10,8 +10,7 @@ base_name = "syringe" desc = "A syringe." icon = 'icons/obj/syringe.dmi' - item_state = "rg0" - icon_state = "rg" + icon_state = ICON_STATE_WORLD material = /decl/material/solid/glass amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[1,2,5]" @@ -19,21 +18,16 @@ w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS sharp = 1 - unacidable = 1 //glass item_flags = ITEM_FLAG_NO_BLUDGEON var/mode = SYRINGE_DRAW - var/image/filling //holds a reference to the current filling overlay var/visible_name = "a syringe" var/time = 30 + var/can_stab = TRUE /obj/item/chems/syringe/Initialize(var/mapload) . = ..() update_icon() -/obj/item/chems/syringe/on_reagent_change() - . = ..() - update_icon() - /obj/item/chems/syringe/on_picked_up(mob/user) . = ..() update_icon() @@ -75,7 +69,10 @@ return if((user.a_intent == I_HURT) && ismob(target)) - syringestab(target, user) + if(can_stab) + syringestab(target, user) + else + to_chat(user, SPAN_WARNING("This syringe is too big to stab someone with it.")) return handleTarget(target, user) @@ -83,25 +80,20 @@ /obj/item/chems/syringe/on_update_icon() . = ..() underlays.Cut() - + icon_state = get_world_inventory_state() if(mode == SYRINGE_BROKEN) - icon_state = "broken" + icon_state = "[icon_state]_broken" return - - var/rounded_vol = clamp(round((reagents.total_volume / volume * 15),5), 5, 15) - if (reagents.total_volume == 0) - rounded_vol = 0 + var/rounded_vol = 0 + if (reagents?.total_volume > 0) + rounded_vol = clamp(round((reagents.total_volume / volume * 15),5), 5, 15) if(ismob(loc)) - add_overlay((mode == SYRINGE_DRAW)? "draw" : "inject") - icon_state = "[initial(icon_state)][rounded_vol]" - item_state = "syringe_[rounded_vol]" - - if(reagents.total_volume) - filling = image('icons/obj/reagentfillings.dmi', src, "syringe10") - - filling.icon_state = "syringe[rounded_vol]" - + add_overlay((mode == SYRINGE_DRAW)? "[icon_state]_draw" : "[icon_state]_inject") + icon_state = "[icon_state]_[rounded_vol]" + if(reagents?.total_volume) + var/image/filling = image(icon, "[icon_state]_underlay") filling.color = reagents.get_color() + filling.appearance_flags |= RESET_COLOR underlays += filling /obj/item/chems/syringe/proc/handleTarget(var/atom/target, var/mob/user) @@ -182,7 +174,7 @@ /obj/item/chems/syringe/proc/injectReagents(var/atom/target, var/mob/user) - if(ismob(target) && !user.skill_check(SKILL_MEDICAL, SKILL_BASIC)) + if(ismob(target) && !user.skill_check(SKILL_MEDICAL, SKILL_BASIC) && (can_stab == TRUE)) syringestab(target, user) return @@ -190,12 +182,14 @@ to_chat(user, SPAN_NOTICE("The syringe is empty.")) mode = SYRINGE_DRAW return - if(istype(target, /obj/item/implantcase/chem)) + + if(!user.Adjacent(target)) return - if(!ATOM_IS_OPEN_CONTAINER(target) && !ismob(target) && !istype(target, /obj/item/chems/food) && !istype(target, /obj/item/clothing/mask/smokable/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes)) + if(!ismob(target) && (!target.reagents || !target.can_be_injected_by(src))) to_chat(user, SPAN_NOTICE("You cannot directly fill this object.")) return + if(!REAGENTS_FREE_SPACE(target.reagents)) to_chat(user, SPAN_NOTICE("[target] is full.")) return @@ -315,14 +309,11 @@ visible_name = "a giant syringe" time = 300 mode = SYRINGE_INJECT + can_stab = FALSE /obj/item/chems/syringe/ld50_syringe/populate_reagents() reagents.add_reagent(/decl/material/liquid/heartstopper, reagents.maximum_volume) -/obj/item/chems/syringe/ld50_syringe/syringestab(var/mob/living/carbon/target, var/mob/living/carbon/user) - to_chat(user, SPAN_NOTICE("This syringe is too big to stab someone with it.")) - return // No instant injecting - /obj/item/chems/syringe/ld50_syringe/drawReagents(var/target, var/mob/user) if(ismob(target)) // No drawing 60 units of blood at once to_chat(user, SPAN_NOTICE("This needle isn't designed for drawing blood.")) @@ -385,23 +376,23 @@ desc = "An advanced syringe that can hold 60 units of chemicals." amount_per_transfer_from_this = 20 volume = 60 - icon_state = "bs" + icon = 'icons/obj/syringe_advanced.dmi' material = /decl/material/solid/glass matter = list( /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) - origin_tech = "{'biotech':3,'materials':4,'exoticmatter':2}" + origin_tech = @'{"biotech":3,"materials":4,"exoticmatter":2}' /obj/item/chems/syringe/noreact name = "cryostasis syringe" desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units." volume = 20 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT - icon_state = "cs" + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE + icon = 'icons/obj/syringe_cryo.dmi' material = /decl/material/solid/glass matter = list( /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/plastic = MATTER_AMOUNT_TRACE + /decl/material/solid/organic/plastic = MATTER_AMOUNT_TRACE ) - origin_tech = "{'biotech':4,'materials':4}" + origin_tech = @'{"biotech":4,"materials":4}' diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index e725274130a..b7ea1a71c81 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -6,9 +6,9 @@ icon_state = "watertank" density = TRUE anchored = FALSE - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY) - maxhealth = 100 + max_health = 100 tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT var/unwrenched = FALSE var/tmp/volume = 1000 @@ -22,7 +22,8 @@ verbs -= /obj/structure/reagent_dispensers/verb/set_amount_dispensed /obj/structure/reagent_dispensers/on_reagent_change() - if(reagents.total_volume > 0) + ..() + if(reagents?.total_volume > 0) tool_interaction_flags = 0 else tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT @@ -128,7 +129,7 @@ amount_dispensed = 10 possible_transfer_amounts = @"[10,25,50,100]" volume = 7500 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED /obj/structure/reagent_dispensers/watertank/populate_reagents() diff --git a/code/modules/reagents/storage/pill_bottle.dm b/code/modules/reagents/storage/pill_bottle.dm index 989ff2a4180..520683077f3 100644 --- a/code/modules/reagents/storage/pill_bottle.dm +++ b/code/modules/reagents/storage/pill_bottle.dm @@ -19,7 +19,7 @@ allow_quick_gather = 1 use_to_pickup = 1 use_sound = 'sound/effects/storage/pillbottle.ogg' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/pop_sound = 'sound/effects/peelz.ogg' var/wrapper_color diff --git a/code/modules/reagents/storage/pill_bottle_subtypes.dm b/code/modules/reagents/storage/pill_bottle_subtypes.dm index 2f649bddec5..2335449cb94 100644 --- a/code/modules/reagents/storage/pill_bottle_subtypes.dm +++ b/code/modules/reagents/storage/pill_bottle_subtypes.dm @@ -1,11 +1,3 @@ -/obj/item/storage/pill_bottle/antitox - labeled_name = "antitoxins" - desc = "Contains pills used to counter toxins." - wrapper_color = COLOR_GREEN - -/obj/item/storage/pill_bottle/antitox/WillContain() - return list(/obj/item/chems/pill/antitox = 21) - /obj/item/storage/pill_bottle/brute_meds labeled_name = "styptic" desc = "Contains pills used to stabilize the severely injured." @@ -14,6 +6,14 @@ /obj/item/storage/pill_bottle/brute_meds/WillContain() return list(/obj/item/chems/pill/brute_meds = 21) +/obj/item/storage/pill_bottle/sugariron + labeled_name = "sugar-iron" + desc = "Contains pills used to assist in blood recovery." + wrapper_color = COLOR_MAROON + +/obj/item/storage/pill_bottle/sugariron/WillContain() + return list(/obj/item/chems/pill/sugariron = 21) + /obj/item/storage/pill_bottle/oxygen labeled_name = "oxygen" desc = "Contains pills used to treat oxygen deprivation." @@ -24,7 +24,7 @@ /obj/item/storage/pill_bottle/antitoxins labeled_name = "antitoxins" - desc = "Contains pills used to treat toxic substances in the blood." + desc = "Contains pills used to treat toxic substances." wrapper_color = COLOR_GREEN /obj/item/storage/pill_bottle/antitoxins/WillContain() diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 6506a537000..3913386add2 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -235,7 +235,7 @@ var/global/list/all_conveyor_switches = list() desc = "A conveyor belt assembly. Must be linked to a conveyor control switch assembly before placement." w_class = ITEM_SIZE_HUGE material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) var/id_tag /obj/item/conveyor_construct/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/recycling/destination_tagger.dm b/code/modules/recycling/destination_tagger.dm index 7a0418a6147..ab74cb34715 100644 --- a/code/modules/recycling/destination_tagger.dm +++ b/code/modules/recycling/destination_tagger.dm @@ -7,7 +7,7 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 160e1d50831..0d264554032 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -9,7 +9,7 @@ anchored = FALSE density = FALSE material = /decl/material/solid/metal/steel - level = 2 + level = LEVEL_ABOVE_PLATING obj_flags = OBJ_FLAG_ROTATABLE var/sort_type = "" var/dpdir = 0 // directions as disposalpipe @@ -65,7 +65,7 @@ // hide called by levelupdate if turf intact status changes // change visibility status and force update of icon /obj/structure/disposalconstruct/hide(var/intact) - set_invisibility((intact && level==1) ? 101: 0) // hide if floor is intact + set_invisibility((intact && level == LEVEL_BELOW_PLATING) ? 101: 0) // hide if floor is intact update() /obj/structure/disposalconstruct/proc/flip() @@ -180,11 +180,11 @@ /obj/structure/disposalconstruct/proc/wrench_down(anchor) if(anchor) anchored = TRUE - level = 1 // We don't want disposal bins to disappear under the floors + level = LEVEL_BELOW_PLATING set_density(0) else anchored = FALSE - level = 2 + level = LEVEL_ABOVE_PLATING set_density(1) /obj/structure/disposalconstruct/machine/check_buildability(obj/structure/disposalpipe/CP, mob/user) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4aea8101f63..27a50a3634d 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -112,7 +112,7 @@ var/global/list/diversion_junctions = list() update_icon() -/obj/machinery/disposal/receive_mouse_drop(atom/dropping, mob/user) +/obj/machinery/disposal/receive_mouse_drop(atom/dropping, mob/user, params) . = (user?.a_intent != I_HURT && ..()) @@ -124,7 +124,7 @@ var/global/list/diversion_junctions = list() var/incapacitation_flags = INCAPACITATION_DEFAULT if(dropping == user) incapacitation_flags &= ~INCAPACITATION_RESTRAINED - if(!dropping.can_mouse_drop(src, user, incapacitation_flags)) + if(!dropping.can_mouse_drop(src, user, incapacitation_flags, params)) return FALSE // Todo rewrite all of this. @@ -538,7 +538,7 @@ var/global/list/diversion_junctions = list() anchored = TRUE var/turf/target // this will be where the output objects are 'thrown' to. var/mode = 0 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + atom_flags = ATOM_FLAG_CLIMBABLE /obj/structure/disposaloutlet/Initialize() . = ..() diff --git a/code/modules/recycling/disposalholder.dm b/code/modules/recycling/disposalholder.dm index c007a959ce3..120782aaff4 100644 --- a/code/modules/recycling/disposalholder.dm +++ b/code/modules/recycling/disposalholder.dm @@ -5,11 +5,11 @@ // this allows the gas flushed to be tracked /obj/structure/disposalholder - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT var/datum/gas_mixture/gas = null // gas used to flush, will appear at exit point var/active = 0 // true if the holder is moving, otherwise inactive dir = 0 - var/count = 2048 //*** can travel 2048 steps before going inactive (in case of loops) + var/count = 4096 //*** can travel 4096 steps before going inactive (in case of loops) var/destinationTag = "" // changes if contains a delivery container var/tomail = 0 //changes if contains wrapped package var/hasmob = 0 //If it contains a mob diff --git a/code/modules/recycling/disposalpipe.dm b/code/modules/recycling/disposalpipe.dm index 935c972c509..1ef619ed011 100644 --- a/code/modules/recycling/disposalpipe.dm +++ b/code/modules/recycling/disposalpipe.dm @@ -6,8 +6,8 @@ desc = "An underfloor disposal pipe." anchored = TRUE density = FALSE - maxhealth = 10 - level = 1 // underfloor only + max_health = 10 + level = LEVEL_BELOW_PLATING dir = 0 // dir will contain dominant direction for junction pipes alpha = 192 // Plane and alpha modified for mapping, reset to normal on spawn. layer = ABOVE_TILE_LAYER @@ -164,7 +164,7 @@ var/obj/structure/disposalpipe/broken/P = new(src.loc) P.set_dir(D) - src.set_invisibility(101) // make invisible (since we won't delete the pipe immediately) + src.set_invisibility(INVISIBILITY_ABSTRACT) // make invisible (since we won't delete the pipe immediately) var/obj/structure/disposalholder/H = locate() in src if(H) // holder was present diff --git a/code/modules/recycling/package_wrapper.dm b/code/modules/recycling/package_wrapper.dm index 40e308f2c95..4333cf48d40 100644 --- a/code/modules/recycling/package_wrapper.dm +++ b/code/modules/recycling/package_wrapper.dm @@ -31,15 +31,15 @@ singular_name = "sheet" w_class = ITEM_SIZE_NORMAL max_amount = 50 - material = /decl/material/solid/paper + material = /decl/material/solid/organic/paper force = 1 throwforce = 1 throw_range = 5 throw_speed = 3 item_flags = ITEM_FLAG_NO_BLUDGEON - ///Check to prevent people from wrapping something multiple times at once. + /// Check to prevent people from wrapping something multiple times at once. var/tmp/currently_wrapping = FALSE - ///The type of wrapped item that will be produced + /// The type of wrapped item that will be produced var/tmp/wrapped_result_type = /obj/item/parcel /obj/item/stack/package_wrap/twenty_five @@ -125,15 +125,15 @@ /obj/item/stack/package_wrap/create_matter() . = ..() //Cardboard for the tube, isn't in the matter_per_piece list, has to be added after that's been initialized - LAZYSET(matter, /decl/material/solid/cardboard, MATTER_AMOUNT_PRIMARY * HOLLOW_OBJECT_MATTER_MULTIPLIER) + LAZYSET(matter, /decl/material/solid/organic/cardboard, MATTER_AMOUNT_PRIMARY * HOLLOW_OBJECT_MATTER_MULTIPLIER) /obj/item/stack/package_wrap/update_matter() //Keep track of the cardboard amount to prevent it creating infinite cardboard matter each times the stack changes - var/cardboard_amount = LAZYACCESS(matter, /decl/material/solid/cardboard) + var/cardboard_amount = LAZYACCESS(matter, /decl/material/solid/organic/cardboard) matter = list() for(var/mat in matter_per_piece) matter[mat] = (matter_per_piece[mat] * amount) - matter[/decl/material/solid/cardboard] = cardboard_amount + matter[/decl/material/solid/organic/cardboard] = cardboard_amount ///Types that the wrapper cannot wrap, ever /obj/item/stack/package_wrap/proc/get_blacklist() @@ -190,5 +190,5 @@ throwforce = 1 throw_speed = 4 throw_range = 5 - material = /decl/material/solid/cardboard + material = /decl/material/solid/organic/cardboard obj_flags = OBJ_FLAG_HOLLOW diff --git a/code/modules/recycling/wrapped_package.dm b/code/modules/recycling/wrapped_package.dm index ce253f7fa2e..857474bb831 100644 --- a/code/modules/recycling/wrapped_package.dm +++ b/code/modules/recycling/wrapped_package.dm @@ -11,7 +11,7 @@ icon = 'icons/obj/items/storage/deliverypackage.dmi' icon_state = "parcel" obj_flags = OBJ_FLAG_HOLLOW - material = /decl/material/solid/paper + material = /decl/material/solid/organic/paper attack_verb = list("delivered a hit", "expedited on", "shipped at", "went postal on") base_parry_chance = 40 //Boxes tend to be good at parrying ///A text note attached to the parcel that shows on examine diff --git a/code/modules/research/design_database_analyzer.dm b/code/modules/research/design_database_analyzer.dm index bce7bff5a42..b0c3c4150bb 100644 --- a/code/modules/research/design_database_analyzer.dm +++ b/code/modules/research/design_database_analyzer.dm @@ -114,7 +114,7 @@ loaded_item = O to_chat(user, SPAN_NOTICE("You add \the [O] to \the [src].")) flick("d_analyzer_la", src) - addtimer(CALLBACK(src, .proc/refresh_busy), 1 SECOND) + addtimer(CALLBACK(src, PROC_REF(refresh_busy)), 1 SECOND) return TRUE /obj/machinery/destructive_analyzer/proc/refresh_busy() @@ -140,12 +140,12 @@ else loaded_item = null flick("d_analyzer_process", src) - addtimer(CALLBACK(src, .proc/refresh_busy), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(refresh_busy)), 2 SECONDS) /obj/item/research name = "research debugging device" desc = "Instant research tool. For testing purposes only." icon = 'icons/obj/items/stock_parts/stock_parts.dmi' icon_state = "smes_coil" - origin_tech = "{'materials':19,'engineering':19,'exoticmatter':19,'powerstorage':19,'wormholes':19,'biotech':19,'combat':19,'magnets':19,'programming':19,'esoteric':19}" + origin_tech = @'{"materials":19,"engineering":19,"exoticmatter":19,"powerstorage":19,"wormholes":19,"biotech":19,"combat":19,"magnets":19,"programming":19,"esoteric":19}' max_health = ITEM_HEALTH_NO_DAMAGE diff --git a/code/modules/sealant_gun/sealant_gun.dm b/code/modules/sealant_gun/sealant_gun.dm index 4a7cf1719c1..57dc500ade3 100644 --- a/code/modules/sealant_gun/sealant_gun.dm +++ b/code/modules/sealant_gun/sealant_gun.dm @@ -22,10 +22,12 @@ if(loaded_tank) add_overlay("[icon_state]-tank") -/obj/item/gun/launcher/sealant/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/gun/launcher/sealant/apply_gun_mob_overlays(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) if(overlay && loaded_tank) - overlay.overlays += image(overlay.icon, "[overlay.icon_state]-tank") - . = ..() + var/tank_state = "[overlay.icon_state]-tank" + if(check_state_in_icon(tank_state, overlay.icon)) + overlay.overlays += image(overlay.icon, tank_state) + ..() /obj/item/gun/launcher/sealant/mapped loaded_tank = /obj/item/sealant_tank/mapped diff --git a/code/modules/security levels/keycard_authentication.dm b/code/modules/security levels/keycard_authentication.dm index 036f61b6f6b..6af4ec58fdc 100644 --- a/code/modules/security levels/keycard_authentication.dm +++ b/code/modules/security levels/keycard_authentication.dm @@ -9,7 +9,7 @@ active_power_usage = 6 power_channel = ENVIRON obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-20}, 'SOUTH':{'y':28}, 'EAST':{'x':-24}, 'WEST':{'x':24}}" + directional_offset = @'{"NORTH":{"y":-20}, "SOUTH":{"y":28}, "EAST":{"x":-24}, "WEST":{"x":24}}' var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made. var/event = "" @@ -79,7 +79,7 @@ else dat += "
  • Engage [security_state.high_security_level.name]
  • " - if(!config.ert_admin_call_only) + if(!get_config_value(/decl/config/toggle/ert_admin_call_only)) dat += "
  • Emergency Response Team
  • " dat += "
  • Grant Emergency Maintenance Access
  • " @@ -130,10 +130,10 @@ if(KA == src) continue KA.reset() - addtimer(CALLBACK(src, .proc/receive_request, src, initial_card.resolve())) + addtimer(CALLBACK(src, PROC_REF(receive_request), src, initial_card.resolve())) if(confirm_delay) - addtimer(CALLBACK(src, .proc/broadcast_check), confirm_delay) + addtimer(CALLBACK(src, PROC_REF(broadcast_check)), confirm_delay) /obj/machinery/keycard_auth/proc/broadcast_check() if(confirmed) @@ -192,8 +192,9 @@ SSstatistics.add_field("alert_keycard_auth_nukecode",1) /obj/machinery/keycard_auth/proc/is_ert_blocked() - if(config.ert_admin_call_only) return 1 - return SSticker.mode && SSticker.mode.ert_disabled + if(get_config_value(/decl/config/toggle/ert_admin_call_only)) + return TRUE + return SSticker.mode?.ert_disabled /obj/machinery/keycard_auth/update_directional_offset(force = FALSE) if(!force && (!length(directional_offset) || !is_wall_mounted())) //Check if the thing is actually mapped onto a table or something diff --git a/code/modules/shield_generators/floor_diffuser.dm b/code/modules/shield_generators/floor_diffuser.dm index 8b9db779986..1cfeb54a6e3 100644 --- a/code/modules/shield_generators/floor_diffuser.dm +++ b/code/modules/shield_generators/floor_diffuser.dm @@ -8,7 +8,7 @@ active_power_usage = 2000 anchored = TRUE density = FALSE - level = 1 + level = LEVEL_BELOW_PLATING construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 diff --git a/code/modules/shield_generators/handheld_diffuser.dm b/code/modules/shield_generators/handheld_diffuser.dm index 03a2919b3e3..d74998a1b38 100644 --- a/code/modules/shield_generators/handheld_diffuser.dm +++ b/code/modules/shield_generators/handheld_diffuser.dm @@ -3,15 +3,13 @@ desc = "A small handheld device designed to disrupt energy barriers." icon = 'icons/obj/machines/shielding.dmi' icon_state = "hdiffuser_off" - origin_tech = "{'magnets':5,'powerstorage':5,'esoteric':2}" + origin_tech = @'{"magnets":5,"powerstorage":5,"esoteric":2}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - - var/obj/item/cell/device/cell var/enabled = 0 /obj/item/shield_diffuser/on_update_icon() @@ -22,20 +20,17 @@ icon_state = "hdiffuser_off" /obj/item/shield_diffuser/Initialize() + set_extension(src, /datum/extension/loaded_cell/unremovable, /obj/item/cell/device, /obj/item/cell/device/standard) . = ..() - cell = new(src) /obj/item/shield_diffuser/Destroy() - QDEL_NULL(cell) if(enabled) STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/shield_diffuser/get_cell() - return cell - /obj/item/shield_diffuser/Process() - if(!enabled) + var/obj/item/cell/cell = get_cell() + if(!enabled || !cell) return for(var/direction in global.cardinal) @@ -56,5 +51,4 @@ /obj/item/shield_diffuser/examine(mob/user) . = ..() - to_chat(user, "The charge meter reads [cell ? cell.percent() : 0]%") to_chat(user, "It is [enabled ? "enabled" : "disabled"].") diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index c4fac1ab095..af9266beaba 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -7,7 +7,7 @@ anchored = TRUE layer = ABOVE_HUMAN_LAYER density = TRUE - invisibility = 0 + invisibility = INVISIBILITY_NONE atmos_canpass = CANPASS_PROC var/obj/machinery/shield_generator/gen = null var/disabled_for = 0 @@ -94,7 +94,7 @@ if(!disabled_for && !diffused_for) set_density(1) - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) update_nearby_tiles() update_icon(TRUE) update_explosion_resistance() @@ -201,10 +201,10 @@ // Fire /obj/effect/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + SHOULD_CALL_PARENT(FALSE) if(!disabled_for) take_damage(rand(5,10), SHIELD_DAMTYPE_HEAT) - // Projectiles /obj/effect/shield/bullet_act(var/obj/item/projectile/proj) if(proj.damage_type == BURN) @@ -322,7 +322,7 @@ affected_shields |= src i-- if(i) - addtimer(CALLBACK(src, .proc/spread_impact_effect, i, affected_shields), 2) + addtimer(CALLBACK(src, PROC_REF(spread_impact_effect), i, affected_shields), 2) /obj/effect/shield/proc/spread_impact_effect(var/i, var/list/affected_shields = list()) for(var/direction in global.cardinal) diff --git a/code/modules/shield_generators/shield_generator.dm b/code/modules/shield_generators/shield_generator.dm index d0a84fc3e8f..0b4a9d14a47 100644 --- a/code/modules/shield_generators/shield_generator.dm +++ b/code/modules/shield_generators/shield_generator.dm @@ -57,7 +57,7 @@ for(var/st in subtypesof(/datum/shield_mode/)) var/datum/shield_mode/SM = new st() mode_list.Add(SM) - events_repository.register(/decl/observ/moved, src, src, .proc/update_overmap_shield_list) + events_repository.register(/decl/observ/moved, src, src, PROC_REF(update_overmap_shield_list)) . = INITIALIZE_HINT_LATELOAD /obj/machinery/shield_generator/LateInitialize() diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index d9d5180c51b..32b40b200be 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -1,21 +1,19 @@ /obj/machinery/shield - name = "Emergency energy shield" + name = "emergency energy shield" desc = "An energy shield used to contain hull breaches." icon = 'icons/effects/effects.dmi' icon_state = "shield-old" density = TRUE opacity = FALSE anchored = TRUE - unacidable = 1 - var/const/max_health = 200 - var/health = max_health //The shield can only take so much beating (prevents perma-prisons) + max_health = 200 var/shield_generate_power = 7500 //how much power we use when regenerating var/shield_idle_power = 1500 //how much power we use when just being sustained. /obj/machinery/shield/malfai name = "emergency forcefield" desc = "A weak forcefield which seems to be projected by the emergency atmosphere containment field." - health = max_health/2 // Half health, it's not suposed to resist much. + max_health = 100 // Half health, it's not suposed to resist much. /obj/machinery/shield/malfai/Process() health -= 0.5 // Slowly lose integrity over time @@ -111,8 +109,7 @@ opacity = FALSE anchored = FALSE initial_access = list(access_engine) - var/const/max_health = 100 - var/health = max_health + max_health = 100 var/active = 0 var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate var/list/deployed_shields = list() @@ -277,7 +274,7 @@ else if(IS_COIL(W) && malfunction && is_open) var/obj/item/stack/cable_coil/coil = W to_chat(user, "You begin to replace the wires.") - //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ))) //Take longer to repair heavier damage + //if(do_after(user, min(60, round( ((max_health/health)*10)+(malfunction*10) ))) //Take longer to repair heavier damage if(do_after(user, 30,src)) if (coil.use(1)) health = max_health diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 5b551e8832f..63ce6167e33 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -9,7 +9,7 @@ anchored = TRUE layer = PROJECTILE_LAYER density = FALSE - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT var/strength = 0 var/ticks_recovering = 10 @@ -35,12 +35,12 @@ //if we take too much damage, drop out - the generator will bring us back up if we have enough power ticks_recovering = min(ticks_recovering + 2, 10) if(strength < 1) - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) set_density(0) ticks_recovering = 10 strength = 0 else if(strength >= 1) - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) set_density(1) /obj/effect/energy_field/proc/Strengthen(var/severity) @@ -51,10 +51,10 @@ //if we take too much damage, drop out - the generator will bring us back up if we have enough power var/old_density = density if(strength >= 1) - set_invisibility(0) + set_invisibility(INVISIBILITY_NONE) set_density(1) else if(strength < 1) - set_invisibility(101) + set_invisibility(INVISIBILITY_ABSTRACT) set_density(0) if (density != old_density) diff --git a/code/modules/shieldgen/shieldwallgen.dm b/code/modules/shieldgen/shieldwallgen.dm index 142f5796c60..75caf91139e 100644 --- a/code/modules/shieldgen/shieldwallgen.dm +++ b/code/modules/shieldgen/shieldwallgen.dm @@ -258,13 +258,12 @@ //////////////Containment Field START /obj/machinery/shieldwall - name = "Shield" + name = "shield" desc = "An energy shield." icon = 'icons/effects/effects.dmi' icon_state = "shieldwall" anchored = TRUE density = TRUE - unacidable = 1 light_range = 3 var/needs_power = 0 var/obj/machinery/shieldwallgen/gen_primary diff --git a/code/modules/shuttles/docking_beacon.dm b/code/modules/shuttles/docking_beacon.dm index a8b99cbc9e1..84721e66431 100644 --- a/code/modules/shuttles/docking_beacon.dm +++ b/code/modules/shuttles/docking_beacon.dm @@ -153,7 +153,7 @@ for(var/turf/T in get_turfs()) new /obj/effect/temporary(T, 5 SECONDS,'icons/effects/alphacolors.dmi', "green") projecting = TRUE - addtimer(CALLBACK(src, .proc/allow_projection), 10 SECONDS) // No spamming holograms. + addtimer(CALLBACK(src, PROC_REF(allow_projection)), 10 SECONDS) // No spamming holograms. if(href_list["settings"]) D.ui_interact(user) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index a735fb61aaa..755791d1755 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -6,9 +6,8 @@ var/global/list/shuttle_landmarks = list() icon = 'icons/effects/effects.dmi' icon_state = "energynet" anchored = TRUE - unacidable = 1 - simulated = 0 - invisibility = 101 + simulated = FALSE + invisibility = INVISIBILITY_ABSTRACT var/landmark_tag //ID of the controller on the dock side @@ -176,7 +175,7 @@ var/global/list/shuttle_landmarks = list() icon = 'icons/obj/items/device/long_range_flare.dmi' icon_state = "bluflare" light_color = "#3728ff" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/active /obj/item/spaceflare/attack_self(var/mob/user) diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 3d75695bb52..d350dc21c37 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -16,6 +16,7 @@ var/multiz = 0 //how many multiz levels, starts at 0 var/ceiling_type = /turf/unsimulated/floor/shuttle_ceiling + var/force_ceiling_on_init = TRUE // Whether or not to force ceilings turfs to be created above on initialization. var/sound_takeoff = 'sound/effects/shuttle_takeoff.ogg' var/sound_landing = 'sound/effects/shuttle_landing.ogg' @@ -48,7 +49,7 @@ for(var/area_type in shuttle_area) if(istype(area_type, /area)) // If the shuttle area is already an instance, it does not need to be located. areas += area_type - events_repository.register(/decl/observ/destroyed, area_type, src, .proc/remove_shuttle_area) + events_repository.register(/decl/observ/destroyed, area_type, src, PROC_REF(remove_shuttle_area)) continue var/area/A if(map_hash && islist(SSshuttle.map_hash_to_areas[map_hash])) @@ -58,7 +59,7 @@ if(!istype(A)) CRASH("Shuttle \"[name]\" couldn't locate area [area_type].") areas += A - events_repository.register(/decl/observ/destroyed, A, src, .proc/remove_shuttle_area) + events_repository.register(/decl/observ/destroyed, A, src, PROC_REF(remove_shuttle_area)) shuttle_area = areas if(initial_location) @@ -80,8 +81,10 @@ CRASH("A supply shuttle is already defined.") SSsupply.shuttle = src + create_ceiling(force_ceiling_on_init) + /datum/shuttle/proc/remove_shuttle_area(area/area_to_remove) - events_repository.unregister(/decl/observ/destroyed, area_to_remove, src, .proc/remove_shuttle_area) + events_repository.unregister(/decl/observ/destroyed, area_to_remove, src, PROC_REF(remove_shuttle_area)) SSshuttle.shuttle_areas -= area_to_remove shuttle_area -= area_to_remove if(!length(shuttle_area)) @@ -252,14 +255,7 @@ current_location = destination // if there's a zlevel above our destination, paint in a ceiling on it so we retain our air - if(HasAbove(current_location.z)) - for(var/area/A in shuttle_area) - for(var/turf/TD in A.contents) - var/turf/TA = GetAbove(TD) - if(istype(TA, get_base_turf_by_area(TA)) || (istype(TA) && TA.is_open())) - if(get_area(TA) in shuttle_area) - continue - TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE) + create_ceiling() handle_pipes_and_power_on_move(new_turfs) @@ -305,6 +301,20 @@ for(var/obj/machinery/atmospherics/pipe as anything in pipes) pipe.build_network() +/datum/shuttle/proc/create_ceiling(force) + if(!HasAbove(current_location.z)) + return + for(var/area/A in shuttle_area) + for(var/turf/TD in A.contents) + // Background turfs don't get a ceiling. + if(TD.turf_flags & TURF_FLAG_BACKGROUND) + continue + var/turf/TA = GetAbove(TD) + if(force || (istype(TA, get_base_turf_by_area(TA)) || (istype(TA) && TA.is_open()))) + if(get_area(TA) in shuttle_area) + continue + TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE, TRUE) + //returns 1 if the shuttle has a valid arrive time /datum/shuttle/proc/has_arrive_time() return (moving_status == SHUTTLE_INTRANSIT) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index bac28ece8f5..e028cd81130 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -155,7 +155,7 @@ for(var/obj/abstract/landmark/L in global.landmarks_list) if(L.name == "Marauder Exit") var/obj/effect/portal/P = new(L.loc) - P.set_invisibility(101)//So it is not seen by anyone. + P.set_invisibility(INVISIBILITY_ABSTRACT)//So it is not seen by anyone. P.failchance = 0//So it has no fail chance when teleporting. P.target = pick(spawn_marauder)//Where the marauder will arrive. spawn_marauder.Remove(P.target) diff --git a/code/modules/species/outsider/random.dm b/code/modules/species/outsider/random.dm index a68048eedf6..25f6d1e3709 100644 --- a/code/modules/species/outsider/random.dm +++ b/code/modules/species/outsider/random.dm @@ -15,6 +15,15 @@ base_color = RANDOM_RGB MULT_BY_RANDOM_COEF(eye_flash_mod, 0.5, 1.5) eye_darksight_range = rand(1,8) + var/temp_comfort_shift = rand(-50,50) + cold_level_1 += temp_comfort_shift + cold_level_2 += temp_comfort_shift + cold_level_3 += temp_comfort_shift + heat_level_1 += temp_comfort_shift + heat_level_2 += temp_comfort_shift + heat_level_3 += temp_comfort_shift + heat_discomfort_level += temp_comfort_shift + cold_discomfort_level += temp_comfort_shift . = ..() /decl/species/alium @@ -74,17 +83,6 @@ //Environment var/temp_comfort_shift = rand(-50,50) - cold_level_1 += temp_comfort_shift - cold_level_2 += temp_comfort_shift - cold_level_3 += temp_comfort_shift - - heat_level_1 += temp_comfort_shift - heat_level_2 += temp_comfort_shift - heat_level_3 += temp_comfort_shift - - heat_discomfort_level += temp_comfort_shift - cold_discomfort_level += temp_comfort_shift - body_temperature += temp_comfort_shift var/pressure_comfort_shift = rand(-50,50) @@ -108,44 +106,6 @@ return ..() return blood_color -/decl/species/alium/proc/adapt_to_atmosphere(var/datum/gas_mixture/atmosphere) - var/temp_comfort_shift = atmosphere.temperature - body_temperature - - cold_level_1 += temp_comfort_shift - cold_level_2 += temp_comfort_shift - cold_level_3 += temp_comfort_shift - - heat_level_1 += temp_comfort_shift - heat_level_2 += temp_comfort_shift - heat_level_3 += temp_comfort_shift - - heat_discomfort_level += temp_comfort_shift - cold_discomfort_level += temp_comfort_shift - - body_temperature += temp_comfort_shift - - var/normal_pressure = atmosphere.return_pressure() - hazard_high_pressure = 5 * normal_pressure - warning_high_pressure = 0.7 * hazard_high_pressure - - hazard_low_pressure = 0.2 * normal_pressure - warning_low_pressure = 2.5 * hazard_low_pressure - - breath_type = pick(atmosphere.gas) - breath_pressure = 0.8*(atmosphere.gas[breath_type]/atmosphere.total_moles)*normal_pressure - - var/list/newgases = decls_repository.get_decl_paths_of_subtype(/decl/material/gas) - newgases = newgases.Copy() - newgases ^= atmosphere.gas - for(var/gas in newgases) - var/decl/material/mat = GET_DECL(gas) - if(mat.gas_flags & (XGM_GAS_OXIDIZER|XGM_GAS_FUEL)) - newgases -= gas - if(newgases.len) - poison_types = list(pick_n_take(newgases)) - if(newgases.len) - exhale_type = pick_n_take(newgases) - /obj/structure/aliumizer name = "alien monolith" desc = "Your true form is calling. Use this to become an alien humanoid." diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm index 9d06d562de6..76ba51fd1aa 100644 --- a/code/modules/species/outsider/starlight.dm +++ b/code/modules/species/outsider/starlight.dm @@ -37,12 +37,29 @@ icon_state = "ash" /decl/bodytype/starlight/starborn - name = "starborn" - desc = "A blazing mass of light." - icon_base = 'icons/mob/human_races/species/starborn/body.dmi' - icon_deformed = 'icons/mob/human_races/species/starborn/body.dmi' - husk_icon = 'icons/mob/human_races/species/starborn/husk.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS + name = "starborn" + desc = "A blazing mass of light." + icon_base = 'icons/mob/human_races/species/starborn/body.dmi' + icon_deformed = 'icons/mob/human_races/species/starborn/body.dmi' + husk_icon = 'icons/mob/human_races/species/starborn/husk.dmi' + body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS + cold_level_1 = 260 + cold_level_2 = 250 + cold_level_3 = 235 + heat_level_1 = 20000 + heat_level_2 = 30000 + heat_level_3 = 40000 + cold_discomfort_level = 300 + cold_discomfort_strings = list( + "You feel your fire dying out...", + "Your fire begins to shrink away from the cold.", + "You feel slow and sluggish from the cold." + ) + heat_discomfort_level = 10000 + heat_discomfort_strings = list( + "Surprisingly, you start burning!", + "You're... burning!?!" + ) /decl/blood_type/starstuff name = "starstuff" @@ -52,7 +69,7 @@ splatter_colour = "#ffff00" /decl/species/starlight/handle_death(var/mob/living/carbon/human/H) - addtimer(CALLBACK(H,/mob/proc/dust),0) + addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, dust)),0) /decl/species/starlight/starborn name = "Starborn" @@ -67,22 +84,6 @@ unarmed_attacks = list(/decl/natural_attack/punch/starborn) - cold_discomfort_level = 300 - cold_discomfort_strings = list("You feel your fire dying out...", - "Your fire begins to shrink away from the cold.", - "You feel slow and sluggish from the cold." - ) - cold_level_1 = 260 - cold_level_2 = 250 - cold_level_3 = 235 - - heat_discomfort_level = 10000 - heat_discomfort_strings = list("Surprisingly, you start burning!", - "You're... burning!?!") - heat_level_1 = 20000 - heat_level_2 = 30000 - heat_level_3 = 40000 - warning_low_pressure = 50 hazard_low_pressure = 0 siemens_coefficient = 0 diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 193beec938f..2130b66b273 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -22,6 +22,12 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/decl/bodytype/default_bodytype var/base_prosthetics_model = /decl/bodytype/prosthetic/basic_human + // Lists of accessory types for modpack modification of accessory restrictions. + // These lists are pretty broad and indiscriminate in application, don't use + // them for fine detail restriction/allowing if you can avoid it. + var/list/allow_specific_sprite_accessories + var/list/disallow_specific_sprite_accessories + var/list/blood_types = list( /decl/blood_type/aplus, /decl/blood_type/aminus, @@ -82,9 +88,9 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 // Death vars. var/meat_type = /obj/item/chems/food/meat/human var/meat_amount = 3 - var/skin_material = /decl/material/solid/skin + var/skin_material = /decl/material/solid/organic/skin var/skin_amount = 3 - var/bone_material = /decl/material/solid/bone + var/bone_material = /decl/material/solid/organic/bone var/bone_amount = 3 var/remains_type = /obj/item/remains/xeno var/gibbed_anim = "gibbed-h" @@ -111,12 +117,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/blood_reagent = /decl/material/liquid/blood var/max_pressure_diff = 60 // Maximum pressure difference that is safe for lungs - var/cold_level_1 = 243 // Cold damage level 1 below this point. -30 Celsium degrees - var/cold_level_2 = 200 // Cold damage level 2 below this point. - var/cold_level_3 = 120 // Cold damage level 3 below this point. - var/heat_level_1 = 360 // Heat damage level 1 above this point. - var/heat_level_2 = 400 // Heat damage level 2 above this point. - var/heat_level_3 = 1000 // Heat damage level 3 above this point. + var/passive_temp_gain = 0 // Species will gain this much temperature every second var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. @@ -124,19 +125,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. var/body_temperature = 310.15 // Species will try to stabilize at this temperature. // (also affects temperature processing) - var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm. - var/cold_discomfort_level = 285 // Aesthetic messages about feeling chilly. - var/list/heat_discomfort_strings = list( - "You feel sweat drip down your neck.", - "You feel uncomfortably warm.", - "Your skin prickles in the heat." - ) - var/list/cold_discomfort_strings = list( - "You feel chilly.", - "You shiver suddenly.", - "Your chilly flesh stands out in goosebumps." - ) - var/water_soothe_amount // HUD data vars. @@ -305,6 +293,42 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 available_bodytypes -= bodytype available_bodytypes += GET_DECL(bodytype) + // Update sprite accessory lists for these species. + for(var/accessory_type in allow_specific_sprite_accessories) + var/decl/sprite_accessory/accessory = GET_DECL(accessory_type) + // If this accessory is species restricted, add us to the list. + if(accessory.species_allowed) + accessory.species_allowed |= name + if(!isnull(accessory.body_flags_allowed)) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.body_flags_allowed |= bodytype.body_flags + if(!isnull(accessory.body_flags_denied)) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.body_flags_denied &= ~bodytype.body_flags + if(accessory.bodytype_categories_allowed) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.bodytype_categories_allowed |= bodytype.bodytype_category + if(accessory.bodytype_categories_denied) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.bodytype_categories_allowed -= bodytype.bodytype_category + + for(var/accessory_type in disallow_specific_sprite_accessories) + var/decl/sprite_accessory/accessory = GET_DECL(accessory_type) + if(accessory.species_allowed) + accessory.species_allowed -= name + if(!isnull(accessory.body_flags_allowed)) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.body_flags_allowed &= ~bodytype.body_flags + if(!isnull(accessory.body_flags_denied)) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.body_flags_denied |= bodytype.body_flags + if(accessory.bodytype_categories_allowed) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.bodytype_categories_allowed -= bodytype.bodytype_category + if(accessory.bodytype_categories_denied) + for(var/decl/bodytype/bodytype in available_bodytypes) + accessory.bodytype_categories_allowed |= bodytype.bodytype_category + if(ispath(default_bodytype)) default_bodytype = GET_DECL(default_bodytype) else if(length(available_bodytypes) && !default_bodytype) @@ -382,31 +406,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 else if(!ispath(age_descriptor, /datum/appearance_descriptor/age)) . += "age descriptor was not a /datum/appearance_descriptor/age subtype" - if(cold_level_3) - if(cold_level_2) - if(cold_level_3 > cold_level_2) - . += "cold_level_3 ([cold_level_3]) was not lower than cold_level_2 ([cold_level_2])" - if(cold_level_1) - if(cold_level_3 > cold_level_1) - . += "cold_level_3 ([cold_level_3]) was not lower than cold_level_1 ([cold_level_1])" - if(cold_level_2 && cold_level_1) - if(cold_level_2 > cold_level_1) - . += "cold_level_2 ([cold_level_2]) was not lower than cold_level_1 ([cold_level_1])" - - if(heat_level_3 != INFINITY) - if(heat_level_2 != INFINITY) - if(heat_level_3 < heat_level_2) - . += "heat_level_3 ([heat_level_3]) was not higher than heat_level_2 ([heat_level_2])" - if(heat_level_1 != INFINITY) - if(heat_level_3 < heat_level_1) - . += "heat_level_3 ([heat_level_3]) was not higher than heat_level_1 ([heat_level_1])" - if((heat_level_2 != INFINITY) && (heat_level_1 != INFINITY)) - if(heat_level_2 < heat_level_1) - . += "heat_level_2 ([heat_level_2]) was not higher than heat_level_1 ([heat_level_1])" - - if(min(heat_level_1, heat_level_2, heat_level_3) <= max(cold_level_1, cold_level_2, cold_level_3)) - . += "heat and cold damage level thresholds overlap" - if(taste_sensitivity < 0) . += "taste_sensitivity ([taste_sensitivity]) was negative" @@ -542,7 +541,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 H.set_fullscreen(GET_STATUS(H, STAT_BLIND) && !H.equipment_prescription, "blind", /obj/screen/fullscreen/blind) H.set_fullscreen(H.stat == UNCONSCIOUS, "blackout", /obj/screen/fullscreen/blackout) - if(config.welder_vision) + if(get_config_value(/decl/config/toggle/on/welder_vision)) H.set_fullscreen(H.equipment_tint_total, "welder", /obj/screen/fullscreen/impaired, H.equipment_tint_total) var/how_nearsighted = get_how_nearsighted(H) H.set_fullscreen(how_nearsighted, "nearsighted", /obj/screen/fullscreen/oxy, how_nearsighted) @@ -827,20 +826,3 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags H.pass_flags = pass_flags - -/decl/species/proc/get_species_temperature_threshold(var/threshold) - switch(threshold) - if(COLD_LEVEL_1) - return cold_level_1 - if(COLD_LEVEL_2) - return cold_level_2 - if(COLD_LEVEL_3) - return cold_level_3 - if(HEAT_LEVEL_1) - return heat_level_1 - if(HEAT_LEVEL_2) - return heat_level_2 - if(HEAT_LEVEL_3) - return heat_level_3 - else - CRASH("get_species_temperature_threshold() called with invalid threshold value.") diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 9b5776aa4d2..ae81a69ab11 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -23,7 +23,7 @@ var/global/list/bodytypes_by_category = list() var/appearance_flags = 0 // Appearance/display related features. /// What tech levels should limbs of this type use/need? - var/limb_tech = "{'biotech':2}" + var/limb_tech = @'{"biotech":2}' var/icon_cache_uid /// Determines if eyes should render on heads using this bodytype. var/has_eyes = TRUE @@ -79,19 +79,15 @@ var/global/list/bodytypes_by_category = list() 'sound/foley/meat2.ogg' ) - var/list/synthetic_bodyfall_sounds = list( - 'sound/foley/metal1.ogg' - ) - // Used for initializing prefs/preview var/base_color = COLOR_BLACK var/base_eye_color = COLOR_BLACK var/base_hair_color = COLOR_BLACK /// Used to initialize organ material - var/material = /decl/material/solid/meat + var/material = /decl/material/solid/organic/meat /// Used to initialize organ matter - var/matter = null + var/list/matter = null /// The reagent organs are filled with, which currently affects what mobs that eat the organ will receive. /// TODO: Remove this in a later matter edibility refactor. var/edible_reagent = /decl/material/liquid/nutriment/protein @@ -172,6 +168,30 @@ var/global/list/bodytypes_by_category = list() /// Stun from blindness modifier. var/eye_flash_mod = 1 + // Bodytype temperature damage thresholds. + var/cold_level_1 = 243 // Cold damage level 1 below this point. -30 Celsium degrees + var/cold_level_2 = 200 // Cold damage level 2 below this point. + var/cold_level_3 = 120 // Cold damage level 3 below this point. + var/heat_level_1 = 360 // Heat damage level 1 above this point. + var/heat_level_2 = 400 // Heat damage level 2 above this point. + var/heat_level_3 = 1000 // Heat damage level 3 above this point. + + // Temperature comfort levels and strings. + var/heat_discomfort_level = 315 + var/cold_discomfort_level = 285 + /// Aesthetic messages about feeling warm. + var/list/heat_discomfort_strings = list( + "You feel sweat drip down your neck.", + "You feel uncomfortably warm.", + "Your skin prickles in the heat." + ) + /// Aesthetic messages about feeling chilly. + var/list/cold_discomfort_strings = list( + "You feel chilly.", + "You shiver suddenly.", + "Your chilly flesh stands out in goosebumps." + ) + /decl/bodytype/Initialize() . = ..() icon_deformed ||= icon_base @@ -184,9 +204,9 @@ var/global/list/bodytypes_by_category = list() if(!breathing_organ && has_organ[BP_LUNGS]) breathing_organ = BP_LUNGS - if(config.grant_default_darksight) - eye_darksight_range = max(eye_darksight_range, config.default_darksight_range) - eye_low_light_vision_effectiveness = max(eye_low_light_vision_effectiveness, config.default_darksight_effectiveness) + if(get_config_value(/decl/config/toggle/grant_default_darksight)) + eye_darksight_range = max(eye_darksight_range, get_config_value(/decl/config/num/default_darksight_range)) + eye_low_light_vision_effectiveness = max(eye_low_light_vision_effectiveness, get_config_value(/decl/config/num/default_darksight_effectiveness)) // Modify organ lists if necessary. if(islist(override_organ_types)) @@ -256,6 +276,57 @@ var/global/list/bodytypes_by_category = list() if(isnull(default_f_style)) . += "null default_f_style (use a shaved/hairless facial hair style if 'no facial hair' is intended)" + var/list/tail_data = has_limbs[BP_TAIL] + if(tail_data) + var/obj/item/organ/external/tail/tail_organ = LAZYACCESS(tail_data, "path") + if(ispath(tail_organ, /obj/item/organ/external/tail)) + var/use_species = get_user_species_for_validation() + if(use_species) + var/datum/dna/dummy_dna = new + dummy_dna.species = use_species + tail_organ = new tail_organ(null, null, dummy_dna, src) + var/tail_icon = tail_organ.get_tail_icon() + var/tail_state = tail_organ.get_tail() + if(tail_icon && tail_state) + if(!check_state_in_icon(tail_state, tail_icon)) + . += "tail state [tail_state] not present in icon [tail_icon], available states are: [json_encode(icon_states(tail_icon))]" + else + if(!tail_icon) + . += "missing tail icon" + if(!tail_state) + . += "missing tail state" + qdel(tail_organ) + qdel(dummy_dna) + else + . += "could not find a species with this bodytype available for tail organ validation" + else + . += "invalid BP_TAIL type: got [tail_organ], expected /obj/item/organ/external/tail" + + if(cold_level_3) + if(cold_level_2) + if(cold_level_3 > cold_level_2) + . += "cold_level_3 ([cold_level_3]) was not lower than cold_level_2 ([cold_level_2])" + if(cold_level_1) + if(cold_level_3 > cold_level_1) + . += "cold_level_3 ([cold_level_3]) was not lower than cold_level_1 ([cold_level_1])" + if(cold_level_2 && cold_level_1) + if(cold_level_2 > cold_level_1) + . += "cold_level_2 ([cold_level_2]) was not lower than cold_level_1 ([cold_level_1])" + + if(heat_level_3 != INFINITY) + if(heat_level_2 != INFINITY) + if(heat_level_3 < heat_level_2) + . += "heat_level_3 ([heat_level_3]) was not higher than heat_level_2 ([heat_level_2])" + if(heat_level_1 != INFINITY) + if(heat_level_3 < heat_level_1) + . += "heat_level_3 ([heat_level_3]) was not higher than heat_level_1 ([heat_level_1])" + if((heat_level_2 != INFINITY) && (heat_level_1 != INFINITY)) + if(heat_level_2 < heat_level_1) + . += "heat_level_2 ([heat_level_2]) was not higher than heat_level_1 ([heat_level_1])" + + if(min(heat_level_1, heat_level_2, heat_level_3) <= max(cold_level_1, cold_level_2, cold_level_3)) + . += "heat and cold damage level thresholds overlap" + /decl/bodytype/proc/max_skin_tone() if(appearance_flags & HAS_SKIN_TONE_GRAV) return 100 @@ -281,14 +352,14 @@ var/global/list/bodytypes_by_category = list() if(H.has_external_organs()) for(var/obj/item/organ/external/E in H.get_external_organs()) if(!is_default_limb(E)) - H.remove_organ(E, FALSE, FALSE, TRUE, TRUE, FALSE) //Remove them first so we don't trigger removal effects by just calling delete on them + H.remove_organ(E, FALSE, FALSE, TRUE, TRUE, FALSE, skip_health_update = TRUE) //Remove them first so we don't trigger removal effects by just calling delete on them qdel(E) //Clear invalid internal organs if(H.has_internal_organs()) for(var/obj/item/organ/O in H.get_internal_organs()) if(!is_default_organ(O)) - H.remove_organ(O, FALSE, FALSE, TRUE, TRUE, FALSE) //Remove them first so we don't trigger removal effects by just calling delete on them + H.remove_organ(O, FALSE, FALSE, TRUE, TRUE, FALSE, skip_health_update = TRUE) //Remove them first so we don't trigger removal effects by just calling delete on them qdel(O) //Create missing limbs @@ -301,7 +372,7 @@ var/global/list/bodytypes_by_category = list() if(E.parent_organ) var/list/parent_organ_data = has_limbs[E.parent_organ] parent_organ_data["has_children"]++ - H.add_organ(E, GET_EXTERNAL_ORGAN(H, E.parent_organ), FALSE, FALSE) + H.add_organ(E, GET_EXTERNAL_ORGAN(H, E.parent_organ), FALSE, FALSE, skip_health_update = TRUE) //Create missing internal organs for(var/organ_tag in has_organ) @@ -312,7 +383,8 @@ var/global/list/bodytypes_by_category = list() if(organ_tag != O.organ_tag) warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.") O.organ_tag = organ_tag - H.add_organ(O, GET_EXTERNAL_ORGAN(H, O.parent_organ), FALSE, FALSE) + H.add_organ(O, GET_EXTERNAL_ORGAN(H, O.parent_organ), FALSE, FALSE, skip_health_update = TRUE) + H.update_health() //Checks if an existing organ is the bodytype default /decl/bodytype/proc/is_default_organ(obj/item/organ/internal/O) @@ -352,11 +424,11 @@ var/global/list/bodytypes_by_category = list() limb.cavity_max_w_class = max(limb.cavity_max_w_class, get_resized_organ_w_class(initial(I.w_class))) /decl/bodytype/proc/set_default_hair(mob/living/carbon/human/organism, override_existing = TRUE, defer_update_hair = FALSE) - if(!organism.h_style || (override_existing && (organism.h_style != default_h_style))) - organism.h_style = default_h_style + if(!organism.get_hairstyle() || (override_existing && (organism.get_hairstyle() != default_h_style))) + organism.set_hairstyle(default_h_style) . = TRUE - if(!organism.h_style || (override_existing && (organism.f_style != default_f_style))) - organism.f_style = default_f_style + if(!organism.get_hairstyle() || (override_existing && (organism.get_facial_hairstyle() != default_f_style))) + organism.set_facial_hairstyle(default_f_style) . = TRUE if(. && !defer_update_hair) organism.update_hair() @@ -373,9 +445,9 @@ var/global/list/bodytypes_by_category = list() for(var/obj/item/organ/external/E in mannequin.get_external_organs()) E.skin_colour = base_color - mannequin.eye_colour = base_eye_color - mannequin.hair_colour = base_hair_color - mannequin.facial_hair_colour = base_hair_color + mannequin.set_eye_colour(base_eye_color, skip_update = TRUE) + mannequin.set_hair_colour(base_hair_color, skip_update = TRUE) + mannequin.set_facial_hair_colour(base_hair_color, skip_update = TRUE) set_default_hair(mannequin) mannequin.force_update_limbs() @@ -386,7 +458,89 @@ var/global/list/bodytypes_by_category = list() mannequin.update_icon() /decl/species/proc/customize_preview_mannequin(mob/living/carbon/human/dummy/mannequin/mannequin) - if(mannequin.species.preview_outfit) + if(preview_outfit) var/decl/hierarchy/outfit/outfit = outfit_by_type(preview_outfit) - outfit.equip(mannequin, equip_adjustments = (OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR|OUTFIT_ADJUSTMENT_SKIP_BACKPACK)) + outfit.equip_outfit(mannequin, equip_adjustments = (OUTFIT_ADJUSTMENT_SKIP_SURVIVAL_GEAR|OUTFIT_ADJUSTMENT_SKIP_BACKPACK)) + mannequin.update_icon() mannequin.update_transform() + +/decl/bodytype/proc/rebuild_internal_organs(var/obj/item/organ/external/limb, var/override_material) + + if(!limb.owner) + return + + // Work out what we want to have in this organ. + var/list/replacing_organs = list() + for(var/organ_tag in has_organ) + var/obj/item/organ/internal/organ_prototype = has_organ[organ_tag] + if(initial(organ_prototype.parent_organ) == limb.organ_tag) + replacing_organs[organ_tag] = organ_prototype + + // No organs, just delete everything. + if(!length(replacing_organs)) + for(var/obj/item/organ/internal/innard in limb.internal_organs) + limb.owner.remove_organ(innard, FALSE, FALSE, TRUE, TRUE, FALSE) + qdel(innard) + return + + // Check what we already have that matches. + for(var/obj/item/organ/internal/innard in limb.internal_organs) + var/obj/item/organ/internal/organ_prototype = replacing_organs[innard.organ_tag] + if(organ_prototype && istype(innard, organ_prototype)) + innard.set_bodytype(type, override_material || material) + replacing_organs -= innard.organ_tag + else + limb.owner.remove_organ(innard, FALSE, FALSE, TRUE, TRUE, FALSE) + qdel(innard) + + // Install any necessary new organs. + for(var/organ_tag in replacing_organs) + var/organ_type = replacing_organs[organ_tag] + var/obj/item/organ/internal/new_innard = new organ_type(limb.owner, null, limb.owner.dna, src) + limb.owner.add_organ(new_innard, GET_EXTERNAL_ORGAN(limb.owner, new_innard.parent_organ), FALSE, FALSE) + +/decl/bodytype/proc/get_body_temperature_threshold(var/threshold) + switch(threshold) + if(COLD_LEVEL_1) + return cold_level_1 + if(COLD_LEVEL_2) + return cold_level_2 + if(COLD_LEVEL_3) + return cold_level_3 + if(HEAT_LEVEL_1) + return heat_level_1 + if(HEAT_LEVEL_2) + return heat_level_2 + if(HEAT_LEVEL_3) + return heat_level_3 + else + CRASH("get_species_temperature_threshold() called with invalid threshold value.") + +/decl/bodytype/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type) + + if(!prob(5)) + return + + var/covered = 0 // Basic coverage can help. + var/held_items = H.get_held_items() + for(var/obj/item/clothing/clothes in H) + if(clothes in held_items) + continue + if((clothes.body_parts_covered & SLOT_UPPER_BODY) && (clothes.body_parts_covered & SLOT_LOWER_BODY)) + covered = 1 + break + + switch(msg_type) + if("cold") + if(!covered && length(cold_discomfort_strings)) + to_chat(H, SPAN_DANGER(pick(cold_discomfort_strings))) + if("heat") + if(covered && length(heat_discomfort_strings)) + to_chat(H, SPAN_DANGER(pick(heat_discomfort_strings))) + +/decl/bodytype/proc/get_user_species_for_validation() + for(var/species_name in get_all_species()) + var/decl/species/species = get_species_by_key(species_name) + if(src in species.available_bodytypes) + return species_name + diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/species/species_bodytype_helpers.dm index 815c6b3938c..591054675dc 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/species/species_bodytype_helpers.dm @@ -38,4 +38,5 @@ pref.body_markings = base_markings?.Copy() /decl/bodytype/proc/apply_appearance(var/mob/living/carbon/human/H) - H.skin_colour = base_color \ No newline at end of file + if(base_color) + H.set_skin_colour(base_color) diff --git a/code/modules/species/species_bodytype_offsets.dm b/code/modules/species/species_bodytype_offsets.dm index b3871df5d49..2a7505551a7 100644 --- a/code/modules/species/species_bodytype_offsets.dm +++ b/code/modules/species/species_bodytype_offsets.dm @@ -21,9 +21,9 @@ The slots that you can use are found in items_clothing.dm and are the inventory var/list/equip_adjust = list() var/list/equip_overlays = list() -/decl/bodytype/proc/get_offset_overlay_image(var/spritesheet, var/mob_icon, var/mob_state, var/color, var/slot) +/decl/bodytype/proc/get_offset_overlay_image(var/mob_icon, var/mob_state, var/color, var/slot) // If we don't actually need to offset this, don't bother with any of the generation/caching. - if(!spritesheet && length(equip_adjust) && equip_adjust[slot] && length(equip_adjust[slot])) + if(length(equip_adjust) && equip_adjust[slot] && length(equip_adjust[slot])) // Check the cache for previously made icons. var/image_key = "[mob_icon]-[mob_state]-[color]-[slot]" @@ -38,7 +38,7 @@ The slots that you can use are found in items_clothing.dm and are the inventory var/use_dir = text2num(shift_facing) var/icon/equip = new(mob_icon, icon_state = mob_state, dir = use_dir) var/icon/canvas = new(icon_template) - canvas.Blend(equip, ICON_OVERLAY, facing_list["x"]+1, facing_list["y"]+1) + canvas.Blend(equip, ICON_OVERLAY, facing_list[1]+1, facing_list[2]+1) final_I.Insert(canvas, dir = use_dir) equip_overlays[image_key] = overlay_image(final_I, color = color, flags = RESET_COLOR) var/image/I = new() // We return a copy of the cached image, in case downstream procs mutate it. diff --git a/code/modules/species/species_bodytype_random.dm b/code/modules/species/species_bodytype_random.dm index 31f90a9fb86..ee73c83f994 100644 --- a/code/modules/species/species_bodytype_random.dm +++ b/code/modules/species/species_bodytype_random.dm @@ -29,7 +29,7 @@ SETUP_RANDOM_COLOR_GETTER(skin_color, skin_colors, HAS_SKIN_COLOR, list( /decl/color_generator/blue_light, /decl/color_generator/green, /decl/color_generator/white)) -SETUP_RANDOM_COLOR_SETTER(skin_color, change_skin_color) +SETUP_RANDOM_COLOR_SETTER(skin_color, set_skin_colour) SETUP_RANDOM_COLOR_GETTER(hair_color, hair_colors, HAS_HAIR_COLOR, list( /decl/color_generator/black, @@ -40,7 +40,7 @@ SETUP_RANDOM_COLOR_GETTER(hair_color, hair_colors, HAS_HAIR_COLOR, list( /decl/color_generator/wheat, /decl/color_generator/old, /decl/color_generator/punk)) -SETUP_RANDOM_COLOR_SETTER(hair_color, change_hair_color) +SETUP_RANDOM_COLOR_SETTER(hair_color, set_hair_colour) SETUP_RANDOM_COLOR_GETTER(eye_color, eye_colors, HAS_EYE_COLOR, list( /decl/color_generator/black, @@ -51,12 +51,12 @@ SETUP_RANDOM_COLOR_GETTER(eye_color, eye_colors, HAS_EYE_COLOR, list( /decl/color_generator/blue_light, /decl/color_generator/green, /decl/color_generator/albino_eye)) -SETUP_RANDOM_COLOR_SETTER(eye_color, change_eye_color) +SETUP_RANDOM_COLOR_SETTER(eye_color, set_eye_colour) /decl/bodytype/proc/get_random_facial_hair_color() return get_random_hair_color() -SETUP_RANDOM_COLOR_SETTER(facial_hair_color, change_facial_hair_color) +SETUP_RANDOM_COLOR_SETTER(facial_hair_color, set_facial_hair_colour) /decl/bodytype/proc/get_random_skin_tone() return random_skin_tone(src) @@ -71,10 +71,10 @@ SETUP_RANDOM_COLOR_SETTER(facial_hair_color, change_facial_hair_color) /mob/living/carbon/human/proc/randomize_hair_style() var/list/L = get_valid_hairstyle_types() - change_hair(SAFEPICK(L)) + set_hairstyle(SAFEPICK(L)) /mob/living/carbon/human/proc/randomize_facial_hair_style() var/list/L = get_valid_facial_hairstyle_types() - change_facial_hair(SAFEPICK(L)) + set_facial_hairstyle(SAFEPICK(L)) #undef SETUP_RANDOM_COLOR_GETTER diff --git a/code/modules/species/species_crystalline_bodytypes.dm b/code/modules/species/species_crystalline_bodytypes.dm index c281454099d..15c0f6047bb 100644 --- a/code/modules/species/species_crystalline_bodytypes.dm +++ b/code/modules/species/species_crystalline_bodytypes.dm @@ -5,10 +5,16 @@ **/ /decl/bodytype/crystalline abstract_type = /decl/bodytype/crystalline - limb_tech = "{'materials':4}" + limb_tech = @'{"materials":4}' is_robotic = FALSE material = /decl/material/solid/gemstone/crystal body_flags = BODY_FLAG_CRYSTAL_REFORM | BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS + cold_level_1 = SYNTH_COLD_LEVEL_1 + cold_level_2 = SYNTH_COLD_LEVEL_2 + cold_level_3 = SYNTH_COLD_LEVEL_3 + heat_level_1 = SYNTH_HEAT_LEVEL_1 + heat_level_2 = SYNTH_HEAT_LEVEL_2 + heat_level_3 = SYNTH_HEAT_LEVEL_3 var/is_brittle /decl/bodytype/crystalline/apply_bodytype_organ_modifications(obj/item/organ/org) diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 150571a33ed..a54b2fdc015 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -22,28 +22,6 @@ /decl/species/proc/get_flesh_colour(var/mob/living/carbon/human/H) return ((H && H.isSynthetic()) ? SYNTH_FLESH_COLOUR : flesh_color) -/decl/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type) - - if(!prob(5)) - return - - var/covered = 0 // Basic coverage can help. - var/held_items = H.get_held_items() - for(var/obj/item/clothing/clothes in H) - if(clothes in held_items) - continue - if((clothes.body_parts_covered & SLOT_UPPER_BODY) && (clothes.body_parts_covered & SLOT_LOWER_BODY)) - covered = 1 - break - - switch(msg_type) - if("cold") - if(!covered) - to_chat(H, "[pick(cold_discomfort_strings)]") - if("heat") - if(covered) - to_chat(H, "[pick(heat_discomfort_strings)]") - /decl/species/proc/get_vision_flags(var/mob/living/carbon/human/H) return vision_flags diff --git a/code/modules/species/species_hud.dm b/code/modules/species/species_hud.dm index d18384bffa0..ab14a1baf6a 100644 --- a/code/modules/species/species_hud.dm +++ b/code/modules/species/species_hud.dm @@ -6,7 +6,6 @@ var/has_pressure = 1 // Draw the pressure indicator. var/has_nutrition = 1 // Draw the nutrition indicator. var/has_bodytemp = 1 // Draw the bodytemp indicator. - var/has_hands = 1 // Set to draw hands. var/has_drop = 1 // Set to draw drop button. var/has_throw = 1 // Set to draw throw button. var/has_resist = 1 // Set to draw resist button. @@ -43,19 +42,14 @@ var/slot_id = inv_slot.slot_id inventory_slots[slot_id] = inv_slot equip_slots |= slot_id - // Build reference lists for inventory updates - if(slot_id in global.persistent_inventory_slots) - persistent_slots |= slot_id - else if(slot_id in global.hidden_inventory_slots) + if(inv_slot.can_be_hidden) hidden_slots |= slot_id - - if(has_hands) - equip_slots |= slot_handcuffed_str - + else + persistent_slots |= slot_id + equip_slots |= slot_handcuffed_str if(slot_back_str in equip_slots) equip_slots |= slot_in_backpack_str - if(slot_w_uniform_str in equip_slots) equip_slots |= slot_tie_str diff --git a/code/modules/species/species_shapeshifter.dm b/code/modules/species/species_shapeshifter.dm index c2ef6d30c67..2e8a3ba1059 100644 --- a/code/modules/species/species_shapeshifter.dm +++ b/code/modules/species/species_shapeshifter.dm @@ -33,8 +33,9 @@ var/global/list/wrapped_species_by_ref = list() /decl/species/shapeshifter/handle_post_spawn(var/mob/living/carbon/human/H) if(monochromatic) - H.hair_colour = H.skin_colour - H.facial_hair_colour = H.skin_colour + var/skin_colour = H.get_skin_colour() + H.set_hair_colour(skin_colour, skip_update = TRUE) + H.set_facial_hair_colour(skin_colour, skip_update = TRUE) ..() /decl/species/shapeshifter/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) @@ -57,12 +58,12 @@ var/global/list/wrapped_species_by_ref = list() var/list/hairstyles = species.get_hair_styles(root_bodytype) if(length(hairstyles)) var/decl/sprite_accessory/new_hair = input("Select a hairstyle.", "Shapeshifter Hair") as null|anything in hairstyles - change_hair(new_hair ? new_hair.type : /decl/sprite_accessory/hair/bald) + set_hairstyle(new_hair ? new_hair.type : /decl/sprite_accessory/hair/bald) var/list/beardstyles = species.get_facial_hair_styles(root_bodytype) if(length(beardstyles)) var/decl/sprite_accessory/new_hair = input("Select a facial hair style.", "Shapeshifter Hair") as null|anything in beardstyles - change_facial_hair(new_hair ? new_hair.type : /decl/sprite_accessory/facial_hair/shaved) + set_facial_hairstyle(new_hair ? new_hair.type : /decl/sprite_accessory/facial_hair/shaved) /mob/living/carbon/human/proc/shapeshifter_select_gender() @@ -97,7 +98,7 @@ var/global/list/wrapped_species_by_ref = list() wrapped_species_by_ref["\ref[src]"] = new_species visible_message("\The [src] shifts and contorts, taking the form of \a ["\improper [new_species]"]!") - refresh_visible_overlays() + try_refresh_visible_overlays() /mob/living/carbon/human/proc/shapeshifter_select_colour() @@ -115,15 +116,12 @@ var/global/list/wrapped_species_by_ref = list() shapeshifter_set_colour(new_skin) /mob/living/carbon/human/proc/shapeshifter_set_colour(var/new_skin) - - skin_colour = new_skin - + set_skin_colour(new_skin, skip_update = TRUE) var/decl/species/shapeshifter/S = species if(S.monochromatic) - hair_colour = skin_colour - facial_hair_colour = skin_colour - + var/skin_colour = get_skin_colour() + set_hair_colour(skin_colour, skip_update = TRUE) + set_facial_hair_colour(skin_colour, skip_update = TRUE) for(var/obj/item/organ/external/E in get_external_organs()) E.sync_colour_to_human(src) - - refresh_visible_overlays() + try_refresh_visible_overlays() diff --git a/code/modules/species/station/golem.dm b/code/modules/species/station/golem.dm index 5281b332af9..4ca51b873eb 100644 --- a/code/modules/species/station/golem.dm +++ b/code/modules/species/station/golem.dm @@ -30,14 +30,6 @@ flesh_color = "#137e8f" - cold_level_1 = SYNTH_COLD_LEVEL_1 - cold_level_2 = SYNTH_COLD_LEVEL_2 - cold_level_3 = SYNTH_COLD_LEVEL_3 - - heat_level_1 = SYNTH_HEAT_LEVEL_1 - heat_level_2 = SYNTH_HEAT_LEVEL_2 - heat_level_3 = SYNTH_HEAT_LEVEL_3 - death_message = "becomes completely motionless..." available_pronouns = list(/decl/pronouns/neuter) diff --git a/code/modules/species/station/human.dm b/code/modules/species/station/human.dm index d2e602c39b7..11962d6f9b0 100644 --- a/code/modules/species/station/human.dm +++ b/code/modules/species/station/human.dm @@ -8,9 +8,11 @@ spawn_flags = SPECIES_CAN_JOIN inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + // Add /decl/bodytype/prosthetic/basic_human to this list to allow full-body prosthetics. available_bodytypes = list( /decl/bodytype/human, - /decl/bodytype/human/masculine + /decl/bodytype/human/masculine, + /decl/bodytype/prosthetic/basic_human ) exertion_effect_chance = 10 diff --git a/code/modules/species/station/monkey_bodytypes.dm b/code/modules/species/station/monkey_bodytypes.dm index b5f81859ebf..3d622631b7e 100644 --- a/code/modules/species/station/monkey_bodytypes.dm +++ b/code/modules/species/station/monkey_bodytypes.dm @@ -5,21 +5,22 @@ blood_overlays = 'icons/mob/human_races/species/monkey/blood_overlays.dmi' health_hud_intensity = 1.75 bodytype_flag = BODY_FLAG_MONKEY + eye_icon = null override_limb_types = list( - BP_HEAD = /obj/item/organ/external/head/no_eyes, BP_TAIL = /obj/item/organ/external/tail/monkey ) mob_size = MOB_SIZE_SMALL /decl/bodytype/monkey/Initialize() equip_adjust = list( - BP_L_HAND = list("[NORTH]" = list("x" = 1, "y" = 3), "[EAST]" = list("x" = -3, "y" = 2), "[SOUTH]" = list("x" = -1, "y" = 3), "[WEST]" = list("x" = 3, "y" = 2)), - BP_R_HAND = list("[NORTH]" = list("x" = -1, "y" = 3), "[EAST]" = list("x" = 3, "y" = 2), "[SOUTH]" = list("x" = 1, "y" = 3), "[WEST]" = list("x" = -3, "y" = 2)), - slot_shoes_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = -1, "y" = 7), "[SOUTH]" = list("x" = 0, "y" = 7), "[WEST]" = list("x" = 1, "y" = 7)), - slot_head_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = -2, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = 2, "y" = 0)), - slot_wear_mask_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = -1, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = 1, "y" = 0)) + BP_L_HAND = list("[NORTH]" = list( 1, 3), "[EAST]" = list(-3, 2), "[SOUTH]" = list(-1, 3), "[WEST]" = list( 3, 2)), + BP_R_HAND = list("[NORTH]" = list(-1, 3), "[EAST]" = list( 3, 2), "[SOUTH]" = list( 1, 3), "[WEST]" = list(-3, 2)), + slot_shoes_str = list("[NORTH]" = list( 0, 7), "[EAST]" = list(-1, 7), "[SOUTH]" = list( 0, 7), "[WEST]" = list( 1, 7)), + slot_head_str = list("[NORTH]" = list( 0, 0), "[EAST]" = list(-2, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list( 2, 0)), + slot_wear_mask_str = list("[NORTH]" = list( 0, 0), "[EAST]" = list(-1, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list( 1, 0)) ) . = ..() /obj/item/organ/external/tail/monkey - tail = "chimptail" + tail = "chimptail" + tail_icon = 'icons/mob/human_races/species/monkey/monkey_tail.dmi' diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm index 70a37798f3f..d4b5db4bb88 100644 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm @@ -39,7 +39,7 @@ if(!..()) return 0 - newVars = list("maxHealth" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) + newVars = list("mob_default_max_health" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) return "Your bats are now stronger." @@ -59,7 +59,7 @@ summon_amt = 1 summon_type = list(/mob/living/simple_animal/hostile/commanded/bear) - newVars = list("maxHealth" = 15, + newVars = list("mob_default_max_health" = 15, "health" = 15, "melee_damage_lower" = 10, "melee_damage_upper" = 10, @@ -76,14 +76,14 @@ return 0 switch(spell_levels[Sp_POWER]) if(1) - newVars = list("maxHealth" = 30, + newVars = list("mob_default_max_health" = 30, "health" = 30, "melee_damage_lower" = 15, "melee_damage_upper" = 15 ) return "Your bear has been upgraded from a cub to a whelp." if(2) - newVars = list("maxHealth" = 45, + newVars = list("mob_default_max_health" = 45, "health" = 45, "melee_damage_lower" = 20, "melee_damage_upper" = 20, @@ -91,7 +91,7 @@ ) return "Your bear has been upgraded from a whelp to an adult." if(3) - newVars = list("maxHealth" = 60, + newVars = list("mob_default_max_health" = 60, "health" = 60, "melee_damage_lower" = 25, "melee_damage_upper" = 25, @@ -99,7 +99,7 @@ ) return "Your bear has been upgraded from an adult to an alpha." if(4) - newVars = list("maxHealth" = 75, + newVars = list("mob_default_max_health" = 75, "health" = 75, "melee_damage_lower" = 35, "melee_damage_upper" = 35, diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm index 9f1bac20fca..89ceb6d64cd 100644 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm @@ -34,7 +34,6 @@ anchored = TRUE opacity = FALSE density = TRUE - unacidable = 1 /obj/effect/forcefield/bullet_act(var/obj/item/projectile/Proj, var/def_zone) var/turf/T = get_turf(src.loc) diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm index 8fa0be93c73..da5d1be45cd 100644 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ b/code/modules/spells/aoe_turf/drain_blood.dm @@ -40,8 +40,8 @@ if(amount > 0) H.adjust_blood(amount) continue - L.adjustBruteLoss(-5) - L.adjustFireLoss(-2.5) + L.adjustBruteLoss(-5, do_update_health = FALSE) + L.adjustFireLoss(-2.5, do_update_health = FALSE) L.adjustToxLoss(-2.5) /obj/item/projectile/beam/blood_effect diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm index 891a4b6ad2d..60c6bba8bf9 100644 --- a/code/modules/spells/contracts.dm +++ b/code/modules/spells/contracts.dm @@ -3,7 +3,7 @@ desc = "written in the blood of some unfortunate fellow." icon = 'icons/mob/screen_spells.dmi' icon_state = "master_open" - material = /decl/material/solid/cardboard //#TODO: replace with paper + material = /decl/material/solid/organic/paper var/contract_master = null var/list/contract_spells = list(/spell/contract/reward,/spell/contract/punish,/spell/contract/return_master) diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm index 846888ae184..2895e63fbcf 100644 --- a/code/modules/spells/general/mark_recall.dm +++ b/code/modules/spells/general/mark_recall.dm @@ -52,12 +52,9 @@ desc = "A strange rune said to be made by wizards. Or its just some shmuck playing with crayons again." icon = 'icons/obj/rune.dmi' icon_state = "wizard_mark" - anchored = TRUE - unacidable = 1 layer = TURF_LAYER is_spawnable_type = FALSE // invalid without spell passed - var/spell/mark_recall/spell /obj/effect/cleanable/wizard_mark/Initialize(mapload,var/mrspell) diff --git a/code/modules/spells/general/veil_of_shadows.dm b/code/modules/spells/general/veil_of_shadows.dm index 0b189f8efbc..4d328e65db0 100644 --- a/code/modules/spells/general/veil_of_shadows.dm +++ b/code/modules/spells/general/veil_of_shadows.dm @@ -22,8 +22,8 @@ H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) if(H.add_cloaking_source(src)) H.visible_message("\The [H] shrinks from view!") - events_repository.register(/decl/observ/moved, H,src,.proc/check_light) - timer_id = addtimer(CALLBACK(src,.proc/cancel_veil),duration, TIMER_STOPPABLE) + events_repository.register(/decl/observ/moved, H,src,PROC_REF(check_light)) + timer_id = addtimer(CALLBACK(src,PROC_REF(cancel_veil)),duration, TIMER_STOPPABLE) /spell/veil_of_shadows/proc/cancel_veil() var/mob/living/carbon/human/H = holder @@ -35,7 +35,7 @@ drop_cloak() else events_repository.unregister(/decl/observ/moved, H,src) - events_repository.register(/decl/observ/moved, H,src,.proc/drop_cloak) + events_repository.register(/decl/observ/moved, H,src,PROC_REF(drop_cloak)) /spell/veil_of_shadows/proc/drop_cloak() var/mob/living/carbon/human/H = holder diff --git a/code/modules/spells/hand/hand.dm b/code/modules/spells/hand/hand.dm index f17f55c1707..a533cc3dbb3 100644 --- a/code/modules/spells/hand/hand.dm +++ b/code/modules/spells/hand/hand.dm @@ -75,7 +75,7 @@ /spell/hand/duration/cast(var/list/targets, var/mob/user) . = ..() if(.) - hand_timer = addtimer(CALLBACK(src, .proc/cancel_hand), hand_duration, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE) + hand_timer = addtimer(CALLBACK(src, PROC_REF(cancel_hand)), hand_duration, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE) /spell/hand/duration/cancel_hand() deltimer(hand_timer) diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index e5aa4532d91..cb5af2f7598 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -29,8 +29,8 @@ var/global/list/artefact_feedback = list( throw_speed = 1 throw_range = 5 w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/cardboard //#TODO: Replace with paper - matter = list(/decl/material/solid/leather = MATTER_AMOUNT_REINFORCEMENT) + material = /decl/material/solid/organic/paper + matter = list(/decl/material/solid/organic/leather = MATTER_AMOUNT_REINFORCEMENT) var/uses = 1 var/temp = null var/datum/spellbook/spellbook diff --git a/code/modules/spells/spells.dm b/code/modules/spells/spells.dm index d2dc6a0201e..ad550747a7f 100644 --- a/code/modules/spells/spells.dm +++ b/code/modules/spells/spells.dm @@ -31,7 +31,7 @@ /mob/proc/add_spell(var/spell/spell_to_add, var/spell_base = "wiz_spell_ready") if(!ability_master) - ability_master = new() + ability_master = new(null, src) spell_to_add.holder = src if(mind) if(!mind.learned_spells) diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm index 1c16d337cdb..0f9ef34b98a 100644 --- a/code/modules/spells/targeted/blood_boil.dm +++ b/code/modules/spells/targeted/blood_boil.dm @@ -20,6 +20,6 @@ H.bodytemperature += 40 if(prob(10)) to_chat(H,"\The [user] seems to radiate an uncomfortable amount of heat your direction.") - if(H.bodytemperature > H.get_temperature_threshold(HEAT_LEVEL_3)) //Burst into flames + if(H.bodytemperature > H.get_mob_temperature_threshold(HEAT_LEVEL_3)) //Burst into flames H.fire_stacks += 50 H.IgniteMob() \ No newline at end of file diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm index e3ea0071e9f..59545660c56 100644 --- a/code/modules/spells/targeted/cleric_spells.dm +++ b/code/modules/spells/targeted/cleric_spells.dm @@ -181,7 +181,7 @@ var/time = (L.getBruteLoss() + L.getFireLoss()) * 20 L.status_flags &= GODMODE to_chat(L,"You will be in stasis for [time/10] second\s.") - addtimer(CALLBACK(src,.proc/cancel_rift),time) + addtimer(CALLBACK(src,PROC_REF(cancel_rift)),time) /spell/targeted/heal_target/trance/Destroy() cancel_rift() @@ -220,7 +220,7 @@ should_wait = 0 break //Don't need to check anymore. if(should_wait) - addtimer(CALLBACK(src,.proc/check_for_revoke,targets), 30 SECONDS) + addtimer(CALLBACK(src,PROC_REF(check_for_revoke),targets), 30 SECONDS) else revoke_spells() diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index 9f3885664c9..fd741613209 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -107,7 +107,7 @@ else to_chat(user, "Some strange aura is blocking the way!") canmove = 0 - addtimer(CALLBACK(src, .proc/allow_move), 2) + addtimer(CALLBACK(src, PROC_REF(allow_move)), 2) /obj/effect/dummy/spell_jaunt/proc/allow_move() canmove = TRUE diff --git a/code/modules/spells/targeted/glimpse_of_eternity.dm b/code/modules/spells/targeted/glimpse_of_eternity.dm index 8a9c5b9e912..a34920af8f1 100644 --- a/code/modules/spells/targeted/glimpse_of_eternity.dm +++ b/code/modules/spells/targeted/glimpse_of_eternity.dm @@ -21,6 +21,6 @@ new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "electricity_constant") else SET_STATUS_MAX(L, STAT_BLIND, 2) - L.adjustBruteLoss(-10) + L.adjustBruteLoss(-10, do_update_health = FALSE) L.adjustFireLoss(-10) new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "green_sparkles") \ No newline at end of file diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm index a4504ed778c..b45e03c42eb 100644 --- a/code/modules/spells/targeted/shapeshift.dm +++ b/code/modules/spells/targeted/shapeshift.dm @@ -55,9 +55,9 @@ M.forceMove(trans) //move inside the new dude to hide him. M.status_flags |= GODMODE //dont want him to die or breathe or do ANYTHING transformed_dudes[trans] = M - events_repository.register(/decl/observ/death, trans,src,/spell/targeted/shapeshift/proc/stop_transformation) - events_repository.register(/decl/observ/destroyed, trans,src,/spell/targeted/shapeshift/proc/stop_transformation) - events_repository.register(/decl/observ/destroyed, M, src, /spell/targeted/shapeshift/proc/destroyed_transformer) + events_repository.register(/decl/observ/death, trans,src, TYPE_PROC_REF(/spell/targeted/shapeshift, stop_transformation)) + events_repository.register(/decl/observ/destroyed, trans,src, TYPE_PROC_REF(/spell/targeted/shapeshift, stop_transformation)) + events_repository.register(/decl/observ/destroyed, M, src, TYPE_PROC_REF(/spell/targeted/shapeshift, destroyed_transformer)) if(duration) spawn(duration) stop_transformation(trans) @@ -73,8 +73,8 @@ return FALSE transformer.status_flags &= ~GODMODE if(share_damage) - var/ratio = target.health/target.maxHealth - var/damage = transformer.maxHealth - round(transformer.maxHealth*(ratio)) + var/transformer_max_health = transformer.get_max_health() + var/damage = transformer.set_max_health(transformer_max_health-round(transformer_max_health*(transformer.get_health_ratio()))) for(var/i in 1 to CEILING(damage/10)) transformer.adjustBruteLoss(10) if(target.mind) @@ -116,7 +116,7 @@ level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - newVars = list("health" = 50, "maxHealth" = 50) + newVars = list("health" = 50, "default_mob_max_health" = 50) hud_state = "wiz_poly" @@ -183,7 +183,7 @@ "melee_damage_upper" = 25, "resistance" = 6, "health" = 125, - "maxHealth" = 125) + "mob_default_max_health" = 125) duration = 0 return "You revel in the corruption. There is no turning back." diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm index 2bb9cca2eb7..04a69e3b7da 100644 --- a/code/modules/spells/targeted/targeted.dm +++ b/code/modules/spells/targeted/targeted.dm @@ -140,9 +140,9 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp apply_spell_damage(target) /spell/targeted/proc/apply_spell_damage(mob/living/target) - target.adjustBruteLoss(amt_dam_brute) - target.adjustFireLoss(amt_dam_fire) - target.adjustToxLoss(amt_dam_tox) + target.adjustBruteLoss(amt_dam_brute, do_update_health = FALSE) + target.adjustFireLoss(amt_dam_fire, do_update_health = FALSE) + target.adjustToxLoss(amt_dam_tox, do_update_health = FALSE) target.adjustOxyLoss(amt_dam_oxy) if(ishuman(target)) var/mob/living/carbon/human/H = target diff --git a/code/modules/sprite_accessories/_accessory.dm b/code/modules/sprite_accessories/_accessory.dm index a78cab57bf4..78ade6f2489 100644 --- a/code/modules/sprite_accessories/_accessory.dm +++ b/code/modules/sprite_accessories/_accessory.dm @@ -10,33 +10,63 @@ have to define any UI values for sprite accessories manually for hair and facial hair. Just add in new hair types and the game will naturally adapt. - !!WARNING!!: changing existing hair information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm + Changing icon states, icon files and names should not represent any risks to + existing savefiles, but please do not change decl uids unless you are very sure + you know what you're doing and don't mind potentially causing people's savefiles + to load the default values for the marking category in question. */ /decl/sprite_accessory abstract_type = /decl/sprite_accessory decl_flags = DECL_FLAG_MANDATORY_UID - var/name // The preview name of the accessory - var/icon // the icon file the accessory is located in - var/icon_state // the icon_state of the accessory - var/required_gender = null // Restricted to specific genders. null matches any - var/list/species_allowed = list(SPECIES_HUMAN) // Restrict some styles to specific root species names - var/list/subspecies_allowed // Restrict some styles to specific species names, irrespective of root species name - var/body_flags_allowed = null // Restrict some styles to specific bodytype flags - var/body_flags_denied = null // Restrict some styles to specific bodytype flags - var/list/bodytype_categories_allowed = null // Restricts some styles to specific bodytype categories - var/list/bodytype_categories_denied = null // Restricts some styles to specific bodytype categories - - var/do_colouration = 1 // Whether or not the accessory can be affected by colouration - var/blend = ICON_ADD + /// The preview name of the accessory + var/name + /// the icon file the accessory is located in + var/icon + /// the icon_state of the accessory + var/icon_state + /// Restricted to specific bodytypes. null matches any + var/list/decl/bodytype/bodytypes_allowed + /// Restricted from specific bodytypes. null matches none + var/list/decl/bodytype/bodytypes_denied + /// Restrict some styles to specific root species names + var/list/species_allowed = list(SPECIES_HUMAN) + /// Restrict some styles to specific species names, irrespective of root species name + var/list/subspecies_allowed + /// Restrict some styles to specific bodytype flags. + var/body_flags_allowed + /// Restrict some styles to specific bodytype flags. + var/body_flags_denied + /// Restricts some styles to specific bodytype categories + var/list/bodytype_categories_allowed + /// Restricts some styles to specific bodytype categories + var/list/bodytype_categories_denied + /// Slot to check equipment for when hiding this accessory. + var/hidden_by_gear_slot + /// Flag to check equipment for when hiding this accessory. + var/hidden_by_gear_flag + /// Whether or not the accessory can be affected by colouration + var/do_colouration = TRUE + /// Various flags controlling some checks and behavior. var/flags = 0 + /// Flags to check when applying this accessory to the mob. + var/requires_appearance_flags = 0 + /// Icon cache for various icon generation steps. + var/list/cached_icons = list() + /// Whether or not this overlay should be trimmed to fit the base bodypart icon. + var/mask_to_bodypart = FALSE + /// What blend mode to use when colourizing this accessory. + var/color_blend = ICON_ADD + /// What blend mode to use when applying this accessory to the compiled organ. + var/layer_blend = ICON_OVERLAY + /// What bodypart tags does this marking apply to? + var/list/body_parts + /// Set to a layer integer to apply this as an overlay over the top of hair and such. + var/sprite_overlay_layer + /// A list of sprite accessory types that are disallowed by this one being included. + var/list/disallows_accessories /decl/sprite_accessory/proc/accessory_is_available(var/mob/owner, var/decl/species/species, var/decl/bodytype/bodytype) - if(!isnull(required_gender) && bodytype.associated_gender != required_gender) - return FALSE if(species) var/species_is_permitted = TRUE if(species_allowed) @@ -46,6 +76,10 @@ if(!species_is_permitted) return FALSE if(bodytype) + if(LAZYLEN(bodytypes_allowed) && !(bodytype.type in bodytypes_allowed)) + return FALSE + if(LAZYISIN(bodytypes_denied, bodytype.type)) + return FALSE if(!isnull(bodytype_categories_allowed) && !(bodytype.bodytype_category in bodytype_categories_allowed)) return FALSE if(!isnull(bodytype_categories_denied) && (bodytype.bodytype_category in bodytype_categories_denied)) @@ -54,18 +88,51 @@ return FALSE if(!isnull(body_flags_denied) && (body_flags_denied & bodytype.bodytype_flag)) return FALSE + if(requires_appearance_flags && !(bodytype.appearance_flags & requires_appearance_flags)) + return FALSE return TRUE -/decl/sprite_accessory/proc/get_validatable_icon_state() - return icon_state - /decl/sprite_accessory/validate() . = ..() if(!icon) . += "missing icon" else - var/actual_icon_state = get_validatable_icon_state() - if(!actual_icon_state) + if(!icon_state) . += "missing icon_state" - else if(!check_state_in_icon(actual_icon_state, icon)) - . += "missing icon state \"[actual_icon_state]\" in [icon]" + else if(!check_state_in_icon(icon_state, icon)) + . += "missing icon state \"[icon_state]\" in [icon]" + +/decl/sprite_accessory/proc/get_hidden_substitute() + return + +/decl/sprite_accessory/proc/is_hidden(var/obj/item/organ/external/organ) + if(!organ?.owner) + return FALSE + if(hidden_by_gear_slot) + var/obj/item/hiding = organ.owner.get_equipped_item(hidden_by_gear_slot) + if(!hiding) + return FALSE + return (hiding.flags_inv & hidden_by_gear_flag) + return FALSE + +/decl/sprite_accessory/proc/get_accessory_icon(var/obj/item/organ/external/organ) + return icon + +/decl/sprite_accessory/proc/get_cached_accessory_icon(var/obj/item/organ/external/organ, var/color = COLOR_WHITE) + ASSERT(istext(color) && (length(color) == 7 || length(color) == 9)) + if(!icon_state) + return null + LAZYINITLIST(cached_icons[organ.bodytype]) + LAZYINITLIST(cached_icons[organ.bodytype][organ.organ_tag]) + var/icon/accessory_icon = cached_icons[organ.bodytype][organ.organ_tag][color] + if(!accessory_icon) + accessory_icon = icon(get_accessory_icon(organ), icon_state) // make a new one to avoid mutating the base + if(!accessory_icon) + cached_icons[organ.bodytype][organ.organ_tag][color] = null + return null + if(mask_to_bodypart) + accessory_icon.Blend(get_limb_mask_for(organ.bodytype, organ.organ_tag), ICON_MULTIPLY) + if(do_colouration && color) + accessory_icon.Blend(color, color_blend) + cached_icons[organ.bodytype][organ.organ_tag][color] = accessory_icon + return accessory_icon diff --git a/code/modules/sprite_accessories/_accessory_facial.dm b/code/modules/sprite_accessories/_accessory_facial.dm index ea5338b8db0..37a00b5254b 100644 --- a/code/modules/sprite_accessories/_accessory_facial.dm +++ b/code/modules/sprite_accessories/_accessory_facial.dm @@ -9,14 +9,18 @@ /decl/sprite_accessory/facial_hair abstract_type = /decl/sprite_accessory/facial_hair icon = 'icons/mob/human_races/species/human/facial.dmi' + hidden_by_gear_slot = slot_head_str + hidden_by_gear_flag = BLOCK_HEAD_HAIR + body_parts = list(BP_HEAD) -/decl/sprite_accessory/facial_hair/get_validatable_icon_state() - return "[icon_state]_s" +/decl/sprite_accessory/facial_hair/get_hidden_substitute() + return GET_DECL(/decl/sprite_accessory/facial_hair/shaved) /decl/sprite_accessory/facial_hair/shaved name = "Shaved" icon_state = "bald" - required_gender = null + bodytypes_allowed = null + bodytypes_denied = null species_allowed = null subspecies_allowed = null bodytype_categories_allowed = null diff --git a/code/modules/sprite_accessories/_accessory_hair.dm b/code/modules/sprite_accessories/_accessory_hair.dm index 0732fc0eb3c..613a52e7259 100644 --- a/code/modules/sprite_accessories/_accessory_hair.dm +++ b/code/modules/sprite_accessories/_accessory_hair.dm @@ -9,15 +9,21 @@ /decl/sprite_accessory/hair abstract_type = /decl/sprite_accessory/hair icon = 'icons/mob/human_races/species/human/hair.dmi' + hidden_by_gear_slot = slot_head_str + hidden_by_gear_flag = BLOCK_HEAD_HAIR + body_parts = list(BP_HEAD) -/decl/sprite_accessory/hair/get_validatable_icon_state() - return "[icon_state]_s" +/decl/sprite_accessory/hair/get_hidden_substitute() + if(flags & VERY_SHORT) + return src + return GET_DECL(/decl/sprite_accessory/hair/short) /decl/sprite_accessory/hair/bald name = "Bald" icon_state = "bald" flags = VERY_SHORT | HAIR_BALD - required_gender = null + bodytypes_allowed = null + bodytypes_denied = null species_allowed = null subspecies_allowed = null bodytype_categories_allowed = null diff --git a/code/modules/sprite_accessories/_accessory_markings.dm b/code/modules/sprite_accessories/_accessory_markings.dm index 99d73ccab36..6abf3c86e31 100644 --- a/code/modules/sprite_accessories/_accessory_markings.dm +++ b/code/modules/sprite_accessories/_accessory_markings.dm @@ -3,31 +3,7 @@ icon = 'icons/mob/human_races/species/default_markings.dmi' do_colouration = 1 //Almost all of them have it, COLOR_ADD abstract_type = /decl/sprite_accessory/marking - //Empty list is unrestricted. Should only restrict the ones that make NO SENSE on other species, - //like IPC optics overlay stuff. - var/layer_blend = ICON_OVERLAY - var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines - //Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN,BP_HEAD - var/draw_target = MARKING_TARGET_SKIN - var/list/disallows = list() //A list of other marking types to ban from adding when this marking is already added - var/list/icons = list() - var/mask_to_bodypart = TRUE - -/decl/sprite_accessory/marking/proc/get_cached_marking_icon(var/decl/bodytype/bodytype, var/bodypart, var/color = COLOR_WHITE) - LAZYINITLIST(icons[bodytype]) - LAZYINITLIST(icons[bodytype][bodypart]) - if(!icons[bodytype][bodypart][color]) - var/icon/marking_icon = icon(icon, icon_state) // make a new one to avoid mutating the base - if(mask_to_bodypart) - marking_icon.Blend(get_limb_mask_for(bodytype, bodypart), ICON_MULTIPLY) - marking_icon.Blend(color, blend) - icons[bodytype][bodypart][color] = marking_icon - return icons[bodytype][bodypart][color] - -/decl/sprite_accessory/marking/validate() - . = ..() - if(!check_state_in_icon(icon_state, icon)) - . += "missing icon state \"[icon_state]\" in [icon]" + mask_to_bodypart = TRUE /decl/sprite_accessory/marking/tat_hive name = "Tattoo (Hive, Back)" diff --git a/code/modules/status_conditions/_status_markers.dm b/code/modules/status_conditions/_status_markers.dm index e3a935bd4c6..830aa5581b2 100644 --- a/code/modules/status_conditions/_status_markers.dm +++ b/code/modules/status_conditions/_status_markers.dm @@ -43,7 +43,7 @@ mob_image = new /image mob_image.loc = owner - mob_image.appearance_flags |= (RESET_COLOR|RESET_TRANSFORM|KEEP_TOGETHER) + mob_image.appearance_flags |= (RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM|KEEP_APART) mob_image.plane = DEFAULT_PLANE mob_image.layer = POINTER_LAYER @@ -53,7 +53,7 @@ mob_image_personal = new /image mob_image_personal.loc = owner - mob_image_personal.appearance_flags |= (RESET_COLOR|RESET_TRANSFORM|KEEP_TOGETHER) + mob_image_personal.appearance_flags |= (RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM|KEEP_APART) mob_image_personal.plane = DEFAULT_PLANE mob_image_personal.layer = POINTER_LAYER diff --git a/code/modules/status_conditions/status_sleeping.dm b/code/modules/status_conditions/status_sleeping.dm index d70e8c3b8b5..7c64e3b2083 100644 --- a/code/modules/status_conditions/status_sleeping.dm +++ b/code/modules/status_conditions/status_sleeping.dm @@ -9,14 +9,10 @@ . = ..() victim.facing_dir = null victim.UpdateLyingBuckledAndVerbStatus() - if(ishuman(victim)) - var/mob/living/carbon/human/H = victim - H.handle_dreams() - H.species.handle_sleeping(H) + victim.handle_dreams() + victim.get_species()?.handle_sleeping(victim) /decl/status_condition/sleeping/handle_status(mob/living/victim, var/amount) . = ..() - if(ishuman(victim)) - var/mob/living/carbon/human/H = victim - H.handle_dreams() - H.species.handle_sleeping(H) + victim.handle_dreams() + victim.get_species()?.handle_sleeping(victim) diff --git a/code/modules/submaps/submap_join.dm b/code/modules/submaps/submap_join.dm index 06b605a0e62..997f6f89de2 100644 --- a/code/modules/submaps/submap_join.dm +++ b/code/modules/submaps/submap_join.dm @@ -54,7 +54,7 @@ if(!check_general_join_blockers(joining, job)) return - log_debug("Player: [joining] is now offsite rank: [job.title] ([name]), JCP:[job.current_positions], JPL:[job.total_positions]") + log_debug("Player: [joining] is now offsite job: [job.title] ([name]), JCP:[job.current_positions], JPL:[job.total_positions]") joining.faction = name job.current_positions++ @@ -74,7 +74,7 @@ // We need to make sure to use the abstract instance here; it's not the same as the one we were passed. character.skillset.obtain_from_client(SSjobs.get_by_path(job.type), character.client) - job.equip(character, "") + job.equip_job(character) job.apply_fingerprints(character) var/list/spawn_in_storage = SSjobs.equip_custom_loadout(character, job) if(spawn_in_storage) @@ -113,7 +113,7 @@ log_and_message_admins("has joined the round as offsite role [character.mind.assigned_role].", character) callHook("submap_join", list(job, character)) if(character.cannot_stand()) equip_wheelchair(character) - job.post_equip_rank(character, job.title) + job.post_equip_job_title(character, job.title) qdel(joining) return character diff --git a/code/modules/submaps/submap_landmark.dm b/code/modules/submaps/submap_landmark.dm index 65cf96aa48e..7bf42c3fec0 100644 --- a/code/modules/submaps/submap_landmark.dm +++ b/code/modules/submaps/submap_landmark.dm @@ -1,10 +1,12 @@ /obj/abstract/submap_landmark - icon = 'icons/misc/mark.dmi' - invisibility = INVISIBILITY_MAXIMUM - anchored = TRUE - simulated = FALSE - density = FALSE - opacity = FALSE + icon = 'icons/misc/mark.dmi' + invisibility = INVISIBILITY_MAXIMUM + anchored = TRUE + simulated = FALSE + density = FALSE + opacity = FALSE + abstract_type = /obj/abstract/submap_landmark + is_spawnable_type = FALSE /obj/abstract/submap_landmark/joinable_submap icon_state = "x4" diff --git a/code/modules/supermatter/setup_supermatter.dm b/code/modules/supermatter/setup_supermatter.dm index f0f845d580b..e7dc912abb4 100644 --- a/code/modules/supermatter/setup_supermatter.dm +++ b/code/modules/supermatter/setup_supermatter.dm @@ -102,7 +102,7 @@ var/global/list/engine_setup_markers = list() /obj/effect/engine_setup name = "Engine Setup Marker" desc = "You shouldn't see this." - invisibility = 101 + invisibility = INVISIBILITY_ABSTRACT anchored = TRUE density = FALSE icon = 'icons/mob/screen1.dmi' diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index dfa03826dc4..dce747435be 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -562,7 +562,7 @@ var/global/list/supermatter_delam_accent_sounds = list( animate_filter("rays",list(time = 2 SECONDS, size = 80, loop=-1, flags = ANIMATION_PARALLEL)) animate(time = 2 SECONDS, size = 10, loop=-1, flags = ANIMATION_PARALLEL) - addtimer(CALLBACK(src, .proc/finish_damage_animation), 12 SECONDS) + addtimer(CALLBACK(src, PROC_REF(finish_damage_animation)), 12 SECONDS) /obj/machinery/power/supermatter/proc/finish_damage_animation() damage_animation = FALSE diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 163b4a87dce..65c8eee72d6 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -17,22 +17,44 @@ var/global/list/surgery_tool_exception_cache = list() /* SURGERY STEPS */ /decl/surgery_step abstract_type = /decl/surgery_step + /// An identifying name string. var/name + /// An informative description string. var/description - var/list/allowed_tools // type path referencing tools that can be used for this step, and how well are they suited for it - var/list/allowed_species // type paths referencing races that this step applies to. - var/list/disallowed_species // type paths referencing races that this step applies to. - var/min_duration = 0 // duration of the step - var/max_duration = 0 // duration of the step - var/can_infect = 0 // evil infection stuff that will make everyone hate me - var/blood_level = 0 // How much blood this step can get on surgeon. 1 - hands, 2 - full body. - var/shock_level = 0 // what shock level will this step put patient on - var/delicate = 0 // if this step NEEDS stable optable or can be done on any valid surface with no penalty - var/surgery_candidate_flags = 0 // Various bitflags for requirements of the surgery. - var/strict_access_requirement = TRUE // Whether or not this surgery will be fuzzy on size requirements. - var/hidden_from_codex // Is this surgery a secret? + /// type path referencing tools that can be used for this step, and how well are they suited for it + var/list/allowed_tools + /// type paths referencing races that this step applies to. + var/list/allowed_species + /// type paths referencing races that this step applies to. + var/list/disallowed_species + /// duration of the step + var/min_duration = 0 + /// duration of the step + var/max_duration = 0 + /// evil infection stuff that will make everyone hate me + var/can_infect = 0 + /// How much blood this step can get on surgeon. 1 - hands, 2 - full body. + var/blood_level = 0 + /// what shock level will this step put patient on + var/shock_level = 0 + /// if this step NEEDS stable optable or can be done on any valid surface with no penalty + var/delicate = 0 + /// Various bitflags for requirements of the surgery. + var/surgery_candidate_flags = 0 + /// Whether or not this surgery will be fuzzy on size requirements. + var/strict_access_requirement = TRUE + /// Is this surgery a secret? + var/hidden_from_codex + /// Any additional information to add to the codex entry for this step. var/list/additional_codex_lines + /// What mob type does this surgery apply to. var/expected_mob_type = /mob/living/carbon/human + /// Sound (or list of sounds) to play on end step. + var/end_step_sound = "rustle" + /// Sound (or list of sounds) to play on fail step. + var/fail_step_sound + /// Sound (or list of sounds) to play on begin step. + var/begin_step_sound = "rustle" /decl/surgery_step/proc/is_self_surgery_permitted(var/mob/target, var/bodypart) return TRUE @@ -86,8 +108,7 @@ var/global/list/surgery_tool_exception_cache = list() /decl/surgery_step/proc/get_skill_reqs(mob/living/user, mob/living/target, obj/item/tool, target_zone) if(delicate) return SURGERY_SKILLS_DELICATE - else - return SURGERY_SKILLS_GENERIC + return SURGERY_SKILLS_GENERIC // checks whether this step can be applied with the given user and target /decl/surgery_step/proc/can_use(mob/living/user, mob/living/target, target_zone, obj/item/tool) @@ -134,6 +155,9 @@ var/global/list/surgery_tool_exception_cache = list() // does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too /decl/surgery_step/proc/begin_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + if(begin_step_sound) + playsound(target, pick(begin_step_sound), 15, 1) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) if (can_infect && affected) spread_germs_to_organ(affected, user) @@ -149,10 +173,15 @@ var/global/list/surgery_tool_exception_cache = list() // does stuff to end the step, which is normally print a message + do whatever this step changes /decl/surgery_step/proc/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) - return + SHOULD_CALL_PARENT(TRUE) + if(end_step_sound) + playsound(target, pick(end_step_sound), 15, 1) // stuff that happens when the step fails /decl/surgery_step/proc/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + if(fail_step_sound) + playsound(target, pick(fail_step_sound), 15, 1) return null /decl/surgery_step/proc/success_chance(mob/living/user, mob/living/target, obj/item/tool, target_zone) diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 1d438b2c6c9..82f52e1d33d 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -19,6 +19,7 @@ /decl/surgery_step/bone/glue name = "Begin bone repair" description = "This procedure is used to begin setting a bone in place by treating the damage with bone gel." + end_step_sound = 'sound/effects/ointment.ogg' allowed_tools = list( TOOL_BONE_GEL = 100, TOOL_SCREWDRIVER = 75 @@ -46,12 +47,13 @@ if(affected.stage == 0) affected.stage = 1 affected.status &= ~ORGAN_BRITTLE + ..() /decl/surgery_step/bone/glue/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") - + ..() ////////////////////////////////////////////////////////////////// // bone setting surgery step @@ -69,6 +71,7 @@ delicate = 1 surgery_candidate_flags = SURGERY_NO_ROBOTIC | SURGERY_NEEDS_ENCASEMENT required_stage = 1 + end_step_sound = "fracture" /decl/surgery_step/bone/set_bone/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -93,6 +96,7 @@ user.visible_message("\The [user] sets [bone] in place with \the [tool].", \ "You set [bone] in place with \the [tool].") affected.stage = 2 + ..() // The pseudo-fail condition below plays a fracture sound anyway. else user.visible_message("\The [user] sets [bone] in the WRONG place with \the [tool].", \ "You set [bone] in the WRONG place with \the [tool].") @@ -104,6 +108,7 @@ "Your hand slips, damaging the [affected.encased ? affected.encased : "bones"] in \the [target]'s [affected.name] with \the [tool]!") affected.fracture() affected.take_external_damage(5, used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // post setting bone-gelling surgery step @@ -111,6 +116,7 @@ /decl/surgery_step/bone/finish name = "Finish bone repair" description = "This procedure seals a damaged bone with bone gel after setting the bone in place." + end_step_sound = 'sound/effects/ointment.ogg' allowed_tools = list( TOOL_BONE_GEL = 100, TOOL_SCREWDRIVER = 75 @@ -137,8 +143,10 @@ affected.status &= ~ORGAN_BROKEN affected.stage = 0 affected.update_wounds() + ..() /decl/surgery_step/bone/finish/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ - "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") \ No newline at end of file + "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") + ..() diff --git a/code/modules/surgery/crystal.dm b/code/modules/surgery/crystal.dm index d9899a24ff6..490d1fcc12c 100644 --- a/code/modules/surgery/crystal.dm +++ b/code/modules/surgery/crystal.dm @@ -1,7 +1,7 @@ /decl/surgery_step/generic/cut_open/crystal name = "Drill keyhole incision" description = "This procedure drills a keyhold incision into crystalline limbs to allow for delicate internal work." - allowed_tools = list(TOOL_DRILL = 100) + allowed_tools = list(TOOL_SURGICAL_DRILL = 100) fail_string = "cracking" access_string = "a neat hole" surgery_candidate_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_FLESH @@ -37,7 +37,7 @@ /decl/surgery_step/internal/detach_organ/crystal name = "Detach crystalline internal organ" description = "This procedure severs a crystalline internal organ, allowing it to be removed." - allowed_tools = list(TOOL_DRILL = 100) + allowed_tools = list(TOOL_SURGICAL_DRILL = 100) surgery_candidate_flags = SURGERY_NO_ROBOTIC | SURGERY_NEEDS_ENCASEMENT | SURGERY_NO_FLESH /decl/surgery_step/internal/attach_organ/crystal diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index fe2d40b1626..36a969d13fd 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -39,6 +39,7 @@ user.visible_message("[user] has cut [target]'s [affected.encased] open with \the [tool].", \ "You have cut [target]'s [affected.encased] open with \the [tool].") affected.fracture() + ..() /decl/surgery_step/open_encased/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -46,3 +47,4 @@ "Your hand slips, cracking [target]'s [affected.encased] with \the [tool]!" ) affected.take_external_damage(15, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) affected.fracture() + ..() diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 9d9b79df1ca..a2baf2e1200 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -28,11 +28,13 @@ user.visible_message("[user] repairs \the [target]'s face with \the [tool].", \ "You repair \the [target]'s face with \the [tool].") var/obj/item/organ/external/h = GET_EXTERNAL_ORGAN(target, target_zone) - if(h) + if(h) h.status &= ~ORGAN_DISFIGURED + ..() /decl/surgery_step/fix_face/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ "Your hand slips, tearing skin on [target]'s face with \the [tool]!") affected.take_external_damage(10, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 3ae3cbebe64..4f6c83bee51 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -23,6 +23,7 @@ /decl/surgery_step/generic/cut_open name = "Make incision" description = "This procedure cuts a small wound that allows access to deeper tissue." + end_step_sound = 'sound/items/Wirecutter.ogg' allowed_tools = list(TOOL_SCALPEL = 100) min_duration = 90 max_duration = 110 @@ -50,15 +51,18 @@ user.visible_message("[user] has made [access_string] on [target]'s [affected.name] with \the [tool].", \ "You have made [access_string] on [target]'s [affected.name] with \the [tool].",) affected.createwound(CUT, CEILING(affected.min_broken_damage/2), TRUE) - playsound(target.loc, 'sound/weapons/bladeslice.ogg', 15, 1) if(tool.damtype == BURN) affected.clamp_organ() + playsound(target, 'sound/items/Welder.ogg', 15, 1) + else + ..() /decl/surgery_step/generic/cut_open/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, [fail_string] \the [target]'s [affected.name] in the wrong place with \the [tool]!", \ "Your hand slips, [fail_string] \the [target]'s [affected.name] in the wrong place with \the [tool]!") affected.take_external_damage(10, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() /decl/surgery_step/generic/cut_open/success_chance(mob/living/user, mob/living/target, obj/item/tool) . = ..() @@ -73,6 +77,7 @@ /decl/surgery_step/generic/clamp_bleeders name = "Clamp bleeders" description = "This procedure clamps off veins within an incision, preventing it from bleeding excessively." + end_step_sound = 'sound/items/Wirecutter.ogg' allowed_tools = list( TOOL_HEMOSTAT = 100, TOOL_CABLECOIL = 75 @@ -100,13 +105,14 @@ "You clamp bleeders in [target]'s [affected.name] with \the [tool].") affected.clamp_organ() spread_germs_to_organ(affected, user) - playsound(target.loc, 'sound/items/Welder.ogg', 15, 1) + ..() /decl/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!",) affected.take_external_damage(10, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // retractor surgery step @@ -145,12 +151,14 @@ user.visible_message("[user] keeps the incision open on [target]'s [affected.name] with \the [tool].", \ "You keep the incision open on [target]'s [affected.name] with \the [tool].") affected.open_incision() + ..() /decl/surgery_step/generic/retract_skin/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!") affected.take_external_damage(12, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // skin cauterization surgery step @@ -158,6 +166,7 @@ /decl/surgery_step/generic/cauterize name = "Cauterize incision" description = "This procedure cauterizes and closes an incision." + end_step_sound = 'sound/items/Welder.ogg' allowed_tools = list( TOOL_CAUTERY = 100, TOOL_WELDER = 25 @@ -198,12 +207,14 @@ affected.update_wounds() if(affected.clamped()) affected.remove_clamps() + ..() /decl/surgery_step/generic/cauterize/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") affected.take_external_damage(0, 3, used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // limb amputation surgery step @@ -211,6 +222,7 @@ /decl/surgery_step/generic/amputate name = "Amputate limb" description = "This procedure removes a limb, or the stump of a limb, from the body entirely." + end_step_sound = 'sound/weapons/bladeslice.ogg' allowed_tools = list( TOOL_SAW = 100, TOOL_HATCHET = 75 @@ -265,6 +277,7 @@ SPAN_DANGER("\The [user] hacks off \the [target]'s [affected.name] at the [affected.amputation_point] with \the [tool]!"), \ SPAN_DANGER("You hack off \the [target]'s [affected.name] with \the [tool]!")) affected.dismember(clean_cut, DISMEMBER_METHOD_EDGE) + ..() /decl/surgery_step/generic/amputate/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -279,3 +292,4 @@ SPAN_WARNING("You slip, mangling \the [target]'s [affected.name] with \the [tool].")) affected.take_external_damage(30, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) affected.fracture() + ..() diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index d1923ee3cdc..1b8ef1751a0 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -12,12 +12,14 @@ delicate = 1 surgery_candidate_flags = SURGERY_NO_CRYSTAL | SURGERY_NEEDS_ENCASEMENT abstract_type = /decl/surgery_step/cavity + end_step_sound = 'sound/effects/squelch1.ogg' /decl/surgery_step/cavity/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!") affected.take_external_damage(20, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // create implant space surgery step @@ -25,7 +27,7 @@ /decl/surgery_step/cavity/make_space name = "Hollow out cavity" description = "This procedure is used to prepare a patient to have something large implanted in their body." - allowed_tools = list(TOOL_DRILL = 100) + allowed_tools = list(TOOL_SURGICAL_DRILL = 100) min_duration = 60 max_duration = 80 @@ -46,6 +48,7 @@ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user] makes some space inside [target]'s [affected.cavity_name] cavity with \the [tool].", \ "You make some space inside [target]'s [affected.cavity_name] cavity with \the [tool]." ) + ..() ////////////////////////////////////////////////////////////////// // implant cavity sealing surgery step @@ -77,6 +80,7 @@ user.visible_message("[user] mends [target]'s [affected.cavity_name] cavity walls with \the [tool].", \ "You mend [target]'s [affected.cavity_name] cavity walls with \the [tool]." ) affected.cavity = FALSE + ..() ////////////////////////////////////////////////////////////////// // implanting surgery step @@ -88,6 +92,7 @@ min_duration = 80 max_duration = 100 hidden_from_codex = TRUE + begin_step_sound = 'sound/effects/squelch1.ogg' /decl/surgery_step/cavity/place_item/can_use(mob/living/user, mob/living/target, target_zone, obj/item/tool) if(isrobot(user)) @@ -123,7 +128,6 @@ user.visible_message("[user] starts putting \the [tool] inside [target]'s [affected.cavity_name] cavity.", \ "You start putting \the [tool] inside [target]'s [affected.cavity_name] cavity." ) target.custom_pain("The pain in your chest is living hell!",1,affecting = affected) - playsound(target.loc, 'sound/effects/squelch1.ogg', 25, 1) ..() /decl/surgery_step/cavity/place_item/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) @@ -137,6 +141,7 @@ affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1,affecting = affected) LAZYDISTINCTADD(affected.implants, tool) affected.cavity = 0 + ..() ////////////////////////////////////////////////////////////////// // implant removal surgery step @@ -150,6 +155,7 @@ ) min_duration = 80 max_duration = 100 + end_step_sound = 'sound/effects/squelch1.ogg' /decl/surgery_step/cavity/implant_removal/assess_bodypart(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = ..() @@ -202,13 +208,16 @@ "You take \the [obj] out of incision on \the [target]'s [affected.name] with \the [tool]." ) target.remove_implant(obj, TRUE, affected) BITSET(target.hud_updateflag, IMPLOYAL_HUD) - playsound(target.loc, 'sound/effects/squelch1.ogg', 15, 1) + ..() else user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \ "There's something inside [target]'s [affected.name], but you just missed it this time." ) + playsound(target.loc, "rustle", 15, 1) else user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ "You could not find anything inside [target]'s [affected.name]." ) + playsound(target.loc, "rustle", 15, 1) + /decl/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) ..() diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index 421421c42a1..d51f538ac2a 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -13,11 +13,35 @@ delicate = 1 abstract_type = /decl/surgery_step/limb +/decl/surgery_step/limb/get_skill_reqs(mob/living/user, mob/living/target, obj/item/organ/external/tool) + // Not supplied a limb. + if(!istype(tool)) + return ..() + // No parent (how did we get here?) + var/tool_is_prosthetic = BP_IS_PROSTHETIC(tool) + if(!tool.parent_organ) + if(tool_is_prosthetic) + return SURGERY_SKILLS_ROBOTIC + return ..() + // Parent is invalid. + var/obj/item/organ/external/parent = target && GET_EXTERNAL_ORGAN(target, tool.parent_organ) + if(!istype(parent)) + return ..() + // If either is meat and the other is not, return mixed skills. + var/parent_is_prosthetic = BP_IS_PROSTHETIC(parent) + if(parent_is_prosthetic != tool_is_prosthetic) + return SURGERY_SKILLS_ROBOTIC_ON_MEAT + // If they are robotic, return robot skills. + if(parent_is_prosthetic) + return SURGERY_SKILLS_ROBOTIC + // Otherwise return base skills. + return ..() + /decl/surgery_step/limb/assess_bodypart(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) if(affected) return affected - var/list/organ_data = target.get_bodytype()?.has_limbs?["[target_zone]"] + var/list/organ_data = target.should_have_limb(target_zone) return !isnull(organ_data) ////////////////////////////////////////////////////////////////// @@ -63,14 +87,6 @@ . = TRUE -/decl/surgery_step/limb/attach/get_skill_reqs(mob/living/user, mob/living/target, obj/item/organ/external/tool) - if(istype(tool) && BP_IS_PROSTHETIC(tool)) - if(target.isSynthetic()) - return SURGERY_SKILLS_ROBOTIC - else - return SURGERY_SKILLS_ROBOTIC_ON_MEAT - return ..() - /decl/surgery_step/limb/attach/can_use(mob/living/user, mob/living/target, target_zone, obj/item/tool) if(..()) var/obj/item/organ/external/E = tool @@ -81,6 +97,7 @@ var/obj/item/organ/external/E = tool user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \ "You start attaching [E.name] to [target]'s [E.amputation_point].") + ..() /decl/surgery_step/limb/attach/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) if(!user.try_unequip(tool)) @@ -95,12 +112,14 @@ if(BP_IS_PROSTHETIC(E) && prob(user.skill_fail_chance(SKILL_DEVICES, 50, SKILL_ADEPT))) E.add_random_ailment() + ..() /decl/surgery_step/limb/attach/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = tool user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ " Your hand slips, damaging [target]'s [E.amputation_point]!") target.apply_damage(10, BRUTE, null, damage_flags=DAM_SHARP) + ..() ////////////////////////////////////////////////////////////////// // limb connecting surgery step @@ -109,7 +128,7 @@ name = "Connect limb" description = "This procedure is used to reconnect a replaced severed limb." allowed_tools = list( - TOOL_HEMOSTAT = 100, + TOOL_SUTURES = 100, TOOL_CABLECOIL = 75 ) can_infect = 1 @@ -117,13 +136,7 @@ max_duration = 120 /decl/surgery_step/limb/connect/get_skill_reqs(mob/living/user, mob/living/target, obj/item/tool, target_zone) - var/obj/item/organ/external/E = target && GET_EXTERNAL_ORGAN(target, target_zone) - if(istype(E) && BP_IS_PROSTHETIC(E)) - if(target.isSynthetic()) - return SURGERY_SKILLS_ROBOTIC - else - return SURGERY_SKILLS_ROBOTIC_ON_MEAT - return ..() + return ..(tool = (target && GET_EXTERNAL_ORGAN(target, target_zone))) /decl/surgery_step/limb/connect/can_use(mob/living/user, mob/living/target, target_zone, obj/item/tool) if(..()) @@ -132,20 +145,23 @@ /decl/surgery_step/limb/connect/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(target, target_zone) - user.visible_message("[user] starts connecting tendons and muscles in [target]'s [E.amputation_point] with [tool].", \ - "You start connecting tendons and muscle in [target]'s [E.amputation_point].") + user.visible_message("[user] starts reattaching tendons and muscles in [target]'s [E.amputation_point] with [tool].", \ + "You start reattaching tendons and muscle in [target]'s [E.amputation_point].") + ..() /decl/surgery_step/limb/connect/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(target, target_zone) var/obj/item/organ/external/P = GET_EXTERNAL_ORGAN(target, E.parent_organ) - user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool].", \ - "You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool].") + user.visible_message("[user] has reattached tendons and muscles in [target]'s [E.amputation_point] with [tool].", \ + "You have reattached tendons and muscles in [target]'s [E.amputation_point] with [tool].") //This time we call add_organ but we want it to install in a non detached state target.add_organ(E, P, FALSE, TRUE, FALSE) + ..() /decl/surgery_step/limb/connect/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ " Your hand slips, damaging [target]'s [E.amputation_point]!") target.apply_damage(10, BRUTE, null, damage_flags=DAM_SHARP) + ..() diff --git a/code/modules/surgery/necrotic.dm b/code/modules/surgery/necrotic.dm index 446e2467c71..cae3b0fc8eb 100644 --- a/code/modules/surgery/necrotic.dm +++ b/code/modules/surgery/necrotic.dm @@ -16,6 +16,7 @@ allowed_tools = list(TOOL_SCALPEL = 90) min_duration = 150 max_duration = 170 + end_step_sound = 'sound/weapons/bladeslice.ogg' /decl/surgery_step/necrotic/tissue/assess_bodypart(mob/living/user, mob/living/target, target_zone, obj/item/tool) . = ..() @@ -70,7 +71,6 @@ user.visible_message( SPAN_NOTICE("\The [user] has excised the necrotic tissue from \the [target]'s [target_organ] with \the [tool]."), \ SPAN_NOTICE("You have excised the necrotic tissue from \the [target]'s [target_organ] with \the [tool].")) - playsound(target.loc, 'sound/weapons/bladeslice.ogg', 15, 1) var/obj/item/organ/O = target.get_organ(LAZYACCESS(global.surgeries_in_progress["\ref[target]"], target_zone)) if(O) @@ -78,6 +78,7 @@ if(istype(O,/obj/item/organ/external)) var/obj/item/organ/external/E = O E.disinfect() + ..() /decl/surgery_step/necrotic/tissue/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -86,6 +87,7 @@ SPAN_DANGER("\The [user]'s hand slips, slicing into a healthy portion of \the [target]'s [affected.name] with \the [tool]!"), SPAN_DANGER("Your hand slips, slicing into a healthy portion of [target]'s [affected.name] with \the [tool]!")) affected.take_external_damage(10, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // Dead organ regeneration treatment @@ -183,6 +185,7 @@ to_chat(user,SPAN_WARNING("You transferred too little for the organ to regenerate!")) qdel(temp_reagents) qdel(temp_holder) + ..() /decl/surgery_step/necrotic/regeneration/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) if(!istype(tool) || !tool.reagents) @@ -194,3 +197,4 @@ user.visible_message( SPAN_DANGER("\The [user]'s hand slips, spilling \the [tool]'s contents over the [target]'s [affected.name]!"), SPAN_DANGER("Your hand slips, spilling \the [tool]'s contents over the [target]'s [affected.name]!")) + ..() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 7bdfc3e64f8..d873e0406eb 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -9,6 +9,7 @@ delicate = 1 surgery_candidate_flags = SURGERY_NO_ROBOTIC | SURGERY_NEEDS_ENCASEMENT abstract_type = /decl/surgery_step/internal + end_step_sound = 'sound/effects/squelch1.ogg' ////////////////////////////////////////////////////////////////// // Organ mending surgery step @@ -69,6 +70,7 @@ I.surgical_fix(user) user.visible_message("\The [user] finishes treating damage within \the [target]'s [affected.name] with [tool_name].", \ "You finish treating damage within \the [target]'s [affected.name] with [tool_name]." ) + ..() /decl/surgery_step/internal/fix_organ/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -84,6 +86,7 @@ for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0 && !BP_IS_PROSTHETIC(I) && (I.surface_accessible || affected.how_open() >= (affected.encased ? SURGERY_ENCASED : SURGERY_RETRACTED))) I.take_internal_damage(dam_amt) + ..() ////////////////////////////////////////////////////////////////// // Organ detachment surgery step @@ -125,6 +128,7 @@ if(I && istype(I) && istype(affected)) //First only detach the organ, without fully removing it target.remove_organ(I, FALSE, TRUE) + ..() /decl/surgery_step/internal/detach_organ/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -132,6 +136,7 @@ user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") affected.take_external_damage(rand(30,50), 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // Organ removal surgery step @@ -185,25 +190,20 @@ /decl/surgery_step/internal/remove_organ/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) user.visible_message("\The [user] has removed \the [target]'s [LAZYACCESS(global.surgeries_in_progress["\ref[target]"], target_zone)] with \the [tool].", \ "You have removed \the [target]'s [LAZYACCESS(global.surgeries_in_progress["\ref[target]"], target_zone)] with \the [tool].") - // Extract the organ! var/obj/item/organ/O = LAZYACCESS(global.surgeries_in_progress["\ref[target]"], target_zone) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) if(istype(O) && istype(affected)) //Now call remove again with detach = FALSE so we fully remove it target.remove_organ(O, TRUE, FALSE) - - // Just in case somehow the organ we're extracting from an organic is an MMI - if(istype(O, /obj/item/organ/internal/mmi_holder)) - var/obj/item/organ/internal/mmi_holder/brain = O - brain.transfer_and_delete() - log_warning("Organ removal surgery on '[target]' returned a mmi_holder '[O]' instead of a mmi!!") + ..() /decl/surgery_step/internal/remove_organ/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") affected.take_external_damage(20, used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // Organ inserting surgery step @@ -244,10 +244,7 @@ CRASH("Target ([target]) of surgery [type] has no bodytype!") else var/decl/pronouns/G = O.get_pronouns() - var/decl/bodytype/root_bodytype = target.get_bodytype() - if(O.organ_tag == BP_POSIBRAIN && !root_bodytype.has_organ[BP_POSIBRAIN]) - to_chat(user, SPAN_WARNING("There's no place in [target] to fit \the [O.organ_tag].")) - else if(O.damage > (O.max_damage * 0.75)) + if(O.damage > (O.max_damage * 0.75)) to_chat(user, SPAN_WARNING("\The [O.name] [G.is] in no state to be transplanted.")) else if(O.w_class > affected.cavity_max_w_class) to_chat(user, SPAN_WARNING("\The [O.name] [G.is] too big for [affected.cavity_name] cavity!")) @@ -273,12 +270,10 @@ if(istype(O) && user.try_unequip(O, target)) //Place the organ but don't attach it yet target.add_organ(O, affected, detached = TRUE) - - if(!BP_IS_PROSTHETIC(affected)) - playsound(target.loc, 'sound/effects/squelch1.ogg', 15, 1) - else + if(BP_IS_PROSTHETIC(affected)) playsound(target.loc, 'sound/items/Ratchet.ogg', 50, 1) - + else + ..() if(BP_IS_PROSTHETIC(O) && prob(user.skill_fail_chance(SKILL_DEVICES, 50, SKILL_ADEPT))) O.add_random_ailment() @@ -288,6 +283,7 @@ var/obj/item/organ/internal/I = tool if(istype(I)) I.take_internal_damage(rand(3,5)) + ..() ////////////////////////////////////////////////////////////////// // Organ attachment surgery step @@ -320,8 +316,8 @@ var/list/attachable_organs var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - for(var/obj/item/organ/I in affected.implants) - if(I && (I.status & ORGAN_CUT_AWAY)) + for(var/obj/item/organ/I in (affected.implants|affected.internal_organs)) + if(I.status & ORGAN_CUT_AWAY) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) radial_button.name = "Attach \the [I.name]" LAZYSET(attachable_organs, I, radial_button) @@ -372,9 +368,11 @@ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) if(istype(I) && I.parent_organ == target_zone && affected && (I in affected.implants)) target.add_organ(I, affected, detached = FALSE) + ..() /decl/surgery_step/internal/attach_organ/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") affected.take_external_damage(20, used_weapon = tool) + ..() diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 9cefd595c71..ab9fe7b5d5b 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -39,12 +39,14 @@ "You have reattached the [affected.tendon_name] in [target]'s [affected.name] with \the [tool].") affected.status &= ~ORGAN_TENDON_CUT affected.update_damages() + ..() /decl/surgery_step/fix_tendon/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") affected.take_external_damage(5, used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// // IB fix surgery step @@ -83,12 +85,14 @@ "You have patched the [affected.artery_name] in [target]'s [affected.name] with \the [tool].") affected.status &= ~ORGAN_ARTERY_CUT affected.update_damages() + ..() /decl/surgery_step/fix_vein/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") affected.take_external_damage(5, used_weapon = tool) + ..() ////////////////////////////////////////////////////////////////// @@ -137,10 +141,12 @@ rig.reset() user.visible_message("[user] has cut through the support systems of [target]'s [rig] with \the [tool].", \ "You have cut through the support systems of [target]'s [rig] with \the [tool].") + ..() /decl/surgery_step/hardsuit/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \ "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.") + ..() ////////////////////////////////////////////////////////////////// @@ -185,17 +191,11 @@ /decl/surgery_step/sterilize/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - - if (!istype(tool, /obj/item/chems)) - return - var/obj/item/chems/container = tool - var/amount = container.amount_per_transfer_from_this var/temp_holder = new/obj() var/datum/reagents/temp_reagents = new(amount, temp_holder) container.reagents.trans_to_holder(temp_reagents, amount) - var/trans = temp_reagents.trans_to_mob(target, temp_reagents.total_volume, CHEM_INJECT) //technically it's contact, but the reagents are being applied to internal tissue if (trans > 0) user.visible_message("[user] rubs [target]'s [affected.name] down with \the [tool]'s contents.", \ @@ -203,20 +203,16 @@ affected.disinfect() qdel(temp_reagents) qdel(temp_holder) + ..() /decl/surgery_step/sterilize/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - - if (!istype(tool, /obj/item/chems)) - return - var/obj/item/chems/container = tool - container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_INJECT) - user.visible_message("[user]'s hand slips, spilling \the [tool]'s contents over the [target]'s [affected.name]!" , \ "Your hand slips, spilling \the [tool]'s contents over the [target]'s [affected.name]!") affected.disinfect() + ..() /decl/surgery_step/sterilize/proc/check_chemicals(var/obj/item/chems/container) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index e07d21f4e22..e4c55f59a1d 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -1,4 +1,4 @@ -//Procedures in this file: Robotic surgery steps, organ removal, replacement. MMI insertion, synthetic organ repair. +//Procedures in this file: Robotic surgery steps, organ removal, replacement, synthetic organ repair. ////////////////////////////////////////////////////////////////// // ROBOTIC SURGERY // ////////////////////////////////////////////////////////////////// @@ -10,6 +10,7 @@ can_infect = 0 surgery_candidate_flags = SURGERY_NO_CRYSTAL | SURGERY_NO_FLESH abstract_type = /decl/surgery_step/robotics + end_step_sound = 'sound/items/Screwdriver.ogg' /decl/surgery_step/robotics/get_skill_reqs(mob/living/user, mob/living/target, obj/item/tool) return SURGERY_SKILLS_ROBOTIC @@ -56,11 +57,13 @@ user.visible_message("[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ "You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",) affected.hatch_state = HATCH_UNSCREWED + ..() /decl/surgery_step/robotics/unscrew_hatch/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("\The [user]'s [tool.name] slips, failing to unscrew \the [target]'s [affected.name].", \ "Your [tool.name] slips, failing to unscrew [target]'s [affected.name].") + ..() ////////////////////////////////////////////////////////////////// // screw robotic limb hatch surgery step @@ -88,11 +91,13 @@ user.visible_message("[user] has screwed down the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ "You have screwed down the maintenance hatch on [target]'s [affected.name] with \the [tool].",) affected.hatch_state = HATCH_CLOSED + ..() /decl/surgery_step/robotics/screw_hatch/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s [tool.name] slips, failing to screw down [target]'s [affected.name].", \ "Your [tool] slips, failing to screw down [target]'s [affected.name].") + ..() ////////////////////////////////////////////////////////////////// // open robotic limb surgery step @@ -123,11 +128,13 @@ user.visible_message("[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ "You open the maintenance hatch on [target]'s [affected.name] with \the [tool].") affected.hatch_state = HATCH_OPENED + ..() /decl/surgery_step/robotics/open_hatch/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].", "Your [tool] slips, failing to open the hatch on [target]'s [affected.name].") + ..() ////////////////////////////////////////////////////////////////// // close robotic limb surgery step @@ -160,11 +167,13 @@ "You close the hatch on [target]'s [affected.name] with \the [tool].") affected.hatch_state = HATCH_UNSCREWED affected.germ_level = 0 + ..() /decl/surgery_step/robotics/close_hatch/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].", "Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].") + ..() ////////////////////////////////////////////////////////////////// // robotic limb brute damage repair surgery step @@ -219,12 +228,14 @@ "You finish patching damage to [target]'s [affected.name] with \the [tool].") affected.heal_damage(rand(30,50),0,1,1) affected.status &= ~ORGAN_DISFIGURED + ..() /decl/surgery_step/robotics/repair_brute/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].", "Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].") target.apply_damage(rand(5,10), BURN, affected) + ..() ////////////////////////////////////////////////////////////////// // robotic limb brittleness repair surgery step @@ -257,12 +268,14 @@ user.visible_message("[user] finishes repairing the brittle interior of \the [target]'s [affected.name].", \ "You finish repairing the brittle interior of \the [target]'s [affected.name].") affected.status &= ~ORGAN_BRITTLE + ..() /decl/surgery_step/robotics/repair_brittle/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user] causes some of \the [target]'s [affected.name] to crumble!", "You cause some of \the [target]'s [affected.name] to crumble!") target.apply_damage(rand(5,10), BRUTE, affected) + ..() ////////////////////////////////////////////////////////////////// // robotic limb burn damage repair surgery step @@ -314,12 +327,14 @@ "You finishes splicing new cable into [target]'s [affected.name].") affected.heal_damage(0,rand(30,50),1,1) affected.status &= ~ORGAN_DISFIGURED + ..() /decl/surgery_step/robotics/repair_burn/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message("[user] causes a short circuit in [target]'s [affected.name]!", "You cause a short circuit in [target]'s [affected.name]!") target.apply_damage(rand(5,10), BURN, affected) + ..() ////////////////////////////////////////////////////////////////// // artificial organ repair surgery step @@ -369,6 +384,7 @@ user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \ "You repair [target]'s [I.name] with [tool]." ) I.damage = 0 + ..() /decl/surgery_step/robotics/fix_organ_robotic/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) @@ -380,6 +396,7 @@ var/obj/item/organ/internal/I = internal if(I) I.take_internal_damage(rand(3,5)) + ..() ////////////////////////////////////////////////////////////////// // robotic organ detachment surgery step @@ -418,10 +435,12 @@ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) if(I && istype(I) && istype(affected)) target.remove_organ(I, detach = TRUE) + ..() /decl/surgery_step/robotics/detach_organ_robotic/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips, unseating \the [tool].", \ "Your hand slips, unseating \the [tool].") + ..() ////////////////////////////////////////////////////////////////// // robotic organ transplant finalization surgery step @@ -468,76 +487,13 @@ if (I.organ_tag == current_organ) target.add_organ(I, affected, detached = FALSE) break + ..() /decl/surgery_step/robotics/attach_organ_robotic/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips, unseating \the [tool].", \ "Your hand slips, unseating \the [tool].") - -////////////////////////////////////////////////////////////////// -// mmi installation surgery step -////////////////////////////////////////////////////////////////// -/decl/surgery_step/robotics/install_mmi - name = "Install MMI" - description = "This procedure installs an MMI within a prosthetic organ." - allowed_tools = list( - /obj/item/mmi = 100 - ) - min_duration = 60 - max_duration = 80 - surgery_candidate_flags = SURGERY_NO_CRYSTAL | SURGERY_NO_FLESH | SURGERY_NEEDS_ENCASEMENT - -/decl/surgery_step/robotics/install_mmi/pre_surgery_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/mmi/M = tool - var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - if(affected && istype(M)) - if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) - to_chat(user, SPAN_WARNING("That brain is not usable.")) - else if(BP_IS_CRYSTAL(affected)) - to_chat(user, SPAN_WARNING("The crystalline interior of \the [affected] is incompatible with \the [M].")) - else if(!target.isSynthetic()) - to_chat(user, SPAN_WARNING("You cannot install a computer brain into a meat body.")) - else if(!target.should_have_organ(BP_BRAIN)) - var/decl/species/species = target.get_species() - to_chat(user, SPAN_WARNING("You're pretty sure [species ? "[species.name_plural] don't" : "\the [target] doesn't"] normally have a brain.")) - else if(target.has_brain()) - to_chat(user, SPAN_WARNING("Your subject already has a brain.")) - else - return TRUE - return FALSE - -/decl/surgery_step/robotics/install_mmi/assess_bodypart(mob/living/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = ..() - if(affected && target_zone == BP_HEAD) - return affected - -/decl/surgery_step/robotics/install_mmi/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \ - "You start installing \the [tool] into [target]'s [affected.name].") ..() -/decl/surgery_step/robotics/install_mmi/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) - if(!user.try_unequip(tool) || !ishuman(target)) - return - var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - user.visible_message("[user] has installed \the [tool] into [target]'s [affected.name].", \ - "You have installed \the [tool] into [target]'s [affected.name].") - - var/obj/item/mmi/M = tool - var/obj/item/organ/internal/mmi_holder/holder = new(target, 1) - var/mob/living/carbon/human/H = target - H.add_organ(holder, affected, TRUE) - tool.forceMove(holder) - holder.stored_mmi = tool - holder.update_from_mmi() - - if(M.brainmob && M.brainmob.mind) - M.brainmob.mind.transfer_to(target) - -/decl/surgery_step/robotics/install_mmi/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) - user.visible_message("[user]'s hand slips.", \ - "Your hand slips.") - /decl/surgery_step/internal/remove_organ/robotic name = "Remove robotic component" description = "This procedure removes a robotic component." @@ -550,52 +506,3 @@ can_infect = 0 robotic_surgery = TRUE surgery_candidate_flags = SURGERY_NO_CRYSTAL | SURGERY_NO_FLESH | SURGERY_NEEDS_ENCASEMENT - -/decl/surgery_step/remove_mmi - name = "Remove MMI" - description = "This procedure removes an MMI from a prosthetic organ." - min_duration = 60 - max_duration = 80 - allowed_tools = list( - TOOL_HEMOSTAT = 100, - TOOL_WIRECUTTERS = 75, - ) - can_infect = 0 - surgery_candidate_flags = SURGERY_NO_CRYSTAL | SURGERY_NO_FLESH | SURGERY_NEEDS_ENCASEMENT - -/decl/surgery_step/remove_mmi/get_skill_reqs(mob/living/user, mob/living/target, obj/item/tool) - return SURGERY_SKILLS_ROBOTIC - -/decl/surgery_step/remove_mmi/assess_bodypart(mob/living/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = ..() - if(affected && (locate(/obj/item/mmi) in affected.implants)) - return affected - -/decl/surgery_step/remove_mmi/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - user.visible_message( \ - "\The [user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ - "You start poking around inside [target]'s [affected.name] with \the [tool]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1,affecting = affected) - ..() - -/decl/surgery_step/remove_mmi/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - if(affected) - var/obj/item/mmi/mmi = locate() in affected.implants - if(affected && mmi) - user.visible_message( \ - SPAN_NOTICE("\The [user] removes \the [mmi] from \the [target]'s [affected.name] with \the [tool]."), \ - SPAN_NOTICE("You remove \the [mmi] from \the [target]'s [affected.name] with \the [tool].")) - target.remove_implant(mmi, TRUE, affected) - else - user.visible_message( \ - SPAN_NOTICE("\The [user] could not find anything inside [target]'s [affected.name]."), \ - SPAN_NOTICE("You could not find anything inside [target]'s [affected.name].")) - -/decl/surgery_step/remove_mmi/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - user.visible_message( \ - SPAN_WARNING("\The [user]'s hand slips, damaging \the [target]'s [affected.name] with \the [tool]!"), \ - SPAN_WARNING("Your hand slips, damaging \the [target]'s [affected.name] with \the [tool]!")) - affected.take_external_damage(3, 0, used_weapon = tool) diff --git a/code/modules/surgery/suture_wounds.dm b/code/modules/surgery/suture_wounds.dm index f1b34698add..98710756830 100644 --- a/code/modules/surgery/suture_wounds.dm +++ b/code/modules/surgery/suture_wounds.dm @@ -44,9 +44,11 @@ W.clamped = 1 break affected.update_damages() + ..() /decl/surgery_step/suture_wounds/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) user.visible_message(SPAN_DANGER("[user]'s hand slips, tearing [target]'s [affected.name] with \the [tool]!"), \ SPAN_DANGER("Your hand slips, tearing [target]'s [affected.name] with \the [tool]!")) - target.apply_damage(3, BRUTE, affected) \ No newline at end of file + target.apply_damage(3, BRUTE, affected) + ..() diff --git a/code/modules/synthesized_instruments/event_manager.dm b/code/modules/synthesized_instruments/event_manager.dm index 8ca067e6716..182ab68b3b0 100644 --- a/code/modules/synthesized_instruments/event_manager.dm +++ b/code/modules/synthesized_instruments/event_manager.dm @@ -68,7 +68,7 @@ if (active) return 0 src.active = 1 - addtimer(CALLBACK(src, .proc/handle_events), 0) + addtimer(CALLBACK(src, PROC_REF(handle_events)), 0) /datum/musical_event_manager/proc/deactivate() if (src.kill_loop) return 0 diff --git a/code/modules/synthesized_instruments/real_instruments.dm b/code/modules/synthesized_instruments/real_instruments.dm index 21d9c061214..9324dc19c50 100644 --- a/code/modules/synthesized_instruments/real_instruments.dm +++ b/code/modules/synthesized_instruments/real_instruments.dm @@ -254,7 +254,7 @@ /obj/item/synthesized_instrument var/datum/real_instrument/real_instrument icon = 'icons/obj/musician.dmi' - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic var/list/instruments = list() var/path = /datum/instrument var/sound_player = /datum/sound_player diff --git a/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm b/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm index 262b10abe7f..e8332774a9e 100644 --- a/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm +++ b/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD sound_player = /datum/sound_player/synthesizer path = /datum/instrument/guitar/clean_crisis - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) slot_flags = SLOT_BACK @@ -16,7 +16,7 @@ icon_state = "eguitar" sound_player = /datum/sound_player/synthesizer path = /datum/instrument/guitar - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/copper = MATTER_AMOUNT_TRACE, diff --git a/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm b/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm index 9282175f64c..43e2e59720c 100644 --- a/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm +++ b/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm @@ -1,6 +1,6 @@ /obj/structure/synthesized_instrument/synthesizer/piano name = "space piano" - desc = "A surprisingly high-tech piano with a digital display for modifying sound output" + desc = "A surprisingly high-tech piano with a digital display for modifying sound output." icon_state = "piano" path = /datum/instrument/piano diff --git a/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm b/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm index 7b045438466..ef2caaa8bb4 100644 --- a/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm +++ b/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm @@ -4,4 +4,4 @@ icon_state = "trumpet" sound_player = /datum/sound_player/synthesizer path = /datum/instrument/brass - material = /decl/material/solid/metal/brass \ No newline at end of file + material = /decl/material/solid/metal/brass diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index 15d8f8d9eef..d73ee46400a 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -8,7 +8,7 @@ icon_state = "violin" sound_player = /datum/sound_player/violin path = /datum/instrument/obsolete/violin - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) /obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) diff --git a/code/modules/synthesized_instruments/song.dm b/code/modules/synthesized_instruments/song.dm index f24bdf289f1..090324ac2af 100644 --- a/code/modules/synthesized_instruments/song.dm +++ b/code/modules/synthesized_instruments/song.dm @@ -191,7 +191,7 @@ var/list/allowed_suff = list("b", "n", "#", "s") var/list/note_off_delta = list("a"=91, "b"=91, "c"=98, "d"=98, "e"=98, "f"=98, "g"=98) var/list/lines_copy = src.lines.Copy() - addtimer(CALLBACK(src, .proc/play_lines, user, allowed_suff, note_off_delta, lines_copy), 0) + addtimer(CALLBACK(src, PROC_REF(play_lines), user, allowed_suff, note_off_delta, lines_copy), 0) #undef CP #undef IS_DIGIT diff --git a/code/modules/synthesized_instruments/sound_player.dm b/code/modules/synthesized_instruments/sound_player.dm index 2224721e424..20df81d5456 100644 --- a/code/modules/synthesized_instruments/sound_player.dm +++ b/code/modules/synthesized_instruments/sound_player.dm @@ -26,7 +26,7 @@ src.actual_instrument = where src.echo = global.musical_config.echo_default.Copy() src.env = global.musical_config.env_default.Copy() - src.proxy_listener = new(src.actual_instrument, /datum/sound_player/proc/on_turf_entered_relay, /datum/sound_player/proc/on_turfs_changed_relay, range, proc_owner = src) + src.proxy_listener = new(src.actual_instrument, TYPE_PROC_REF(/datum/sound_player, on_turf_entered_relay), TYPE_PROC_REF(/datum/sound_player, on_turfs_changed_relay), range, proc_owner = src) proxy_listener.register_turfs() /datum/sound_player/Destroy() diff --git a/code/modules/synthesized_instruments/sound_token.dm b/code/modules/synthesized_instruments/sound_token.dm index 3de8c409edf..a495fe3dd3c 100644 --- a/code/modules/synthesized_instruments/sound_token.dm +++ b/code/modules/synthesized_instruments/sound_token.dm @@ -32,7 +32,7 @@ listeners = list() listener_status = list() - events_repository.register(/decl/observ/destroyed, source, src, /datum/proc/qdel_self) + events_repository.register(/decl/observ/destroyed, source, src, TYPE_PROC_REF(/datum, qdel_self)) player.subscribe(src) diff --git a/code/modules/tools/tool_archetype_definition_pen.dm b/code/modules/tools/tool_archetype_definition_pen.dm index 87c7aae992c..59c4e08d875 100644 --- a/code/modules/tools/tool_archetype_definition_pen.dm +++ b/code/modules/tools/tool_archetype_definition_pen.dm @@ -21,14 +21,16 @@ else . = "Anonymous" -/decl/tool_archetype/pen/proc/decrement_uses(var/mob/user, var/obj/item/tool, var/decrement = 1) +/decl/tool_archetype/pen/proc/decrement_uses(var/mob/user, var/obj/item/tool, var/decrement = 1, var/destroy_on_zero = TRUE) . = tool.get_tool_property(TOOL_PEN, TOOL_PROP_USES) if(. < 0) return TRUE . -= decrement tool.set_tool_property(TOOL_PEN, TOOL_PROP_USES, max(0, .)) //Prevent negatives and turning the pen into an infinite uses pen if(. <= 0 && (tool.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) & PEN_FLAG_DEL_EMPTY)) - qdel(tool) + . = 0 + if(destroy_on_zero) + qdel(tool) /**Toggles the active/inactive state of some pens */ /decl/tool_archetype/pen/proc/toggle_active(var/mob/user, var/obj/item/pen/tool) diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 6ff51f087a4..edd50670dce 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -88,7 +88,7 @@ Notes: queueHide = !!showing if (queueHide) - addtimer(CALLBACK(src, .proc/do_hide), 1) + addtimer(CALLBACK(src, PROC_REF(do_hide)), 1) else do_hide() diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm index 7005f2f332c..96c8276a2af 100644 --- a/code/modules/turbolift/turbolift.dm +++ b/code/modules/turbolift/turbolift.dm @@ -40,11 +40,11 @@ /datum/turbolift/proc/open_doors(var/datum/turbolift_floor/use_floor = current_floor) for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) - INVOKE_ASYNC(door, /obj/machinery/door/proc/open) + INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door, open)) /datum/turbolift/proc/close_doors(var/datum/turbolift_floor/use_floor = current_floor) for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) - INVOKE_ASYNC(door, /obj/machinery/door/proc/close) + INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door, close)) #define LIFT_MOVING 1 #define LIFT_WAITING_A 2 diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index dfa7c14bb52..e570d0421ea 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -6,7 +6,7 @@ density = FALSE layer = ABOVE_OBJ_LAYER obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + directional_offset = @'{"NORTH":{"y":-32}, "SOUTH":{"y":32}, "EAST":{"x":-32}, "WEST":{"x":32}}' var/datum/turbolift/lift /obj/structure/lift/proc/pressed(var/mob/user) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 9c4398a49ea..0f17bacd3e6 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -8,7 +8,7 @@ load_item_visible = 1 buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 5) health = 100 - maxhealth = 100 + max_health = 100 locked = 0 fire_dam_coeff = 0.6 @@ -124,7 +124,7 @@ return 1 return ..() -/obj/vehicle/bike/receive_mouse_drop(var/atom/dropping, mob/user) +/obj/vehicle/bike/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && istype(dropping, /atom/movable)) if(!load(dropping)) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index a1143b5a075..e995266e03f 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -6,19 +6,20 @@ on = 0 powered = 1 locked = 0 - load_item_visible = 1 load_offset_x = 0 buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 7) - - var/car_limit = 3 //how many cars an engine can pull before performance degrades charge_use = 1 KILOWATTS active_engines = 1 + var/car_limit = 3 //how many cars an engine can pull before performance degrades var/obj/item/key/cargo_train/key /obj/item/key/cargo_train - name = "key" - desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"." + desc = "A small key on a yellow fob reading \"Choo Choo!\"." + material = /decl/material/solid/metal/steel + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT + ) icon = 'icons/obj/vehicles.dmi' icon_state = "train_keys" w_class = ITEM_SIZE_TINY @@ -149,29 +150,27 @@ else verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine -/obj/vehicle/train/cargo/RunOver(var/mob/living/carbon/human/H) - var/list/parts = list(BP_HEAD, BP_CHEST, BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM) - - H.apply_effects(5, 5) - for(var/i = 0, i < rand(1,5), i++) - var/def_zone = pick(parts) - H.apply_damage(rand(5,10), BRUTE, def_zone) +/obj/vehicle/train/cargo/crossed_mob(var/mob/living/victim) + victim.apply_effects(5, 5) + for(var/i = 1 to rand(1,5)) + var/obj/item/organ/external/E = pick(victim.get_external_organs()) + if(E) + victim.apply_damage(rand(5,10), BRUTE, E.organ_tag) -/obj/vehicle/train/cargo/trolley/RunOver(var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/trolley/crossed_mob(var/mob/living/victim) ..() - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])") + attack_log += text("\[[time_stamp()]\] ran over [victim.name] ([victim.ckey])") -/obj/vehicle/train/cargo/engine/RunOver(var/mob/living/carbon/human/H) +/obj/vehicle/train/cargo/engine/crossed_mob(var/mob/living/victim) ..() - if(is_train_head() && ishuman(load)) var/mob/living/carbon/human/D = load - to_chat(D, "You ran over [H]!") - visible_message("\The [src] ran over [H]!") - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])") - msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)") + to_chat(D, "You ran over \the [victim]!") + visible_message("\The [src] ran over \the [victim]!") + attack_log += text("\[[time_stamp()]\] ran over [victim.name] ([victim.ckey]), driven by [D.name] ([D.ckey])") + msg_admin_attack("[D.name] ([D.ckey]) ran over [victim.name] ([victim.ckey]). (JMP)") else - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])") + attack_log += text("\[[time_stamp()]\] ran over [victim.name] ([victim.ckey])") //------------------------------------------- @@ -362,10 +361,10 @@ if(!is_train_head() || !on) move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind else - move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains - move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines) - move_delay += config.run_delay //base reference speed - move_delay *= 1.1 //makes cargo trains 10% slower than running when not overweight + move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) // limits base overweight so you cant overspeed trains + move_delay *= (1 / max(1, active_engines)) * 2 // overweight penalty (scaled by the number of engines) + move_delay += get_config_value(/decl/config/num/movement_run) // base reference speed + move_delay *= 1.1 // makes cargo trains 10% slower than running when not overweight /obj/vehicle/train/cargo/trolley/update_car(var/train_length, var/active_engines) src.train_length = train_length diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 61e579a188e..804dea26ff9 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -5,7 +5,7 @@ move_delay = 1 health = 100 - maxhealth = 100 + max_health = 100 fire_dam_coeff = 0.7 brute_dam_coeff = 0.5 @@ -103,14 +103,14 @@ to_chat(user, "You climb down from [src].") return 1 -/obj/vehicle/train/handle_mouse_drop(atom/over, mob/user) +/obj/vehicle/train/handle_mouse_drop(atom/over, mob/user, params) if(istype(over, /obj/vehicle/train)) var/obj/vehicle/train/beep = over beep.latch(src, user) return TRUE . = ..() -/obj/vehicle/train/receive_mouse_drop(var/atom/dropping, mob/user) +/obj/vehicle/train/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && istype(dropping, /atom/movable)) if(!load(dropping)) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index af200c686d8..2386d664bbb 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -19,8 +19,6 @@ var/attack_log = null var/on = 0 - var/health = 0 //do not forget to set health for your vehicle! - var/maxhealth = 0 var/fire_dam_coeff = 1.0 var/brute_dam_coeff = 1.0 var/open = 0 //Maint panel @@ -86,9 +84,9 @@ else if(IS_WELDER(W)) var/obj/item/weldingtool/T = W if(T.welding) - if(health < maxhealth) + if(health < max_health) if(open) - health = min(maxhealth, health+10) + health = min(max_health, health+10) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message("\The [user] repairs \the [src]!","You repair \the [src]!") else @@ -242,9 +240,6 @@ cell = null powercheck() -/obj/vehicle/proc/RunOver(var/mob/living/carbon/human/H) - return //write specifics for different vehicles - //------------------------------------------- // Loading/unloading procs // diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index 7f653fc0950..7f27ab62ca1 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -1,21 +1,21 @@ /* * Notes on weather: * - * - Weather is a single object that sits in the vis_contents of all outside turfs on - * its associated z-levels and is removed or added by /turf/proc/update_weather(), + * - Weather is a single object that sits in the vis_contents of all outside turfs on + * its associated z-levels and is removed or added by /turf/proc/update_weather(), * which is usually called from /turf/proc/set_outside(). * * - Weather generally assumes any atom that cares about it will ask it directly and * mobs do this in /mob/living/proc/handle_environment(). * - * - For this system to be scalable, it should minimize the amount of list-based - * processing it does and be primarily passive, allowing mobs to ignore it or + * - For this system to be scalable, it should minimize the amount of list-based + * processing it does and be primarily passive, allowing mobs to ignore it or * poll it on their own time. * * - The weather object is queued on SSweather and is polled every fifteen seconds at time * of writing. This is handled in /obj/abstract/weather_system/proc/tick(). * - * - When evaluating, weather will generally get more intense or more severe rather than + * - When evaluating, weather will generally get more intense or more severe rather than * jumping around randomly. Each state will set a minimum duration based on min/max time. * * - If polled between weather updates there is a chance of modifying wind speed and direction @@ -23,12 +23,13 @@ */ /obj/abstract/weather_system - plane = DEFAULT_PLANE - layer = ABOVE_PROJECTILE_LAYER - icon = 'icons/effects/weather.dmi' - icon_state = "blank" - invisibility = 0 - appearance_flags = (RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) + plane = DEFAULT_PLANE + layer = ABOVE_PROJECTILE_LAYER + icon = 'icons/effects/weather.dmi' + icon_state = "blank" + invisibility = INVISIBILITY_NONE + appearance_flags = (RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) + is_spawnable_type = FALSE var/water_material = /decl/material/liquid/water // Material to use for the properties of rain. var/ice_material = /decl/material/solid/ice // Material to use for the properties of snow and hail. @@ -91,12 +92,10 @@ // Dummy object for lightning flash animation. /obj/abstract/lightning_overlay - plane = EMISSIVE_PLANE - layer = ABOVE_LIGHTING_LAYER - icon = 'icons/effects/weather.dmi' - icon_state = "full" - alpha = 0 - -/obj/abstract/lightning_overlay/Initialize() - . = ..() - invisibility = 0 // This is set to maximum in parent regardless of what we set, because we can't have nice things. \ No newline at end of file + plane = EMISSIVE_PLANE + layer = ABOVE_LIGHTING_LAYER + icon = 'icons/effects/weather.dmi' + icon_state = "full" + alpha = 0 + invisibility = INVISIBILITY_NONE + is_spawnable_type = FALSE diff --git a/code/modules/weather/weather_debug.dm b/code/modules/weather/weather_debug.dm index 0fbf244f098..e182179bc15 100644 --- a/code/modules/weather/weather_debug.dm +++ b/code/modules/weather/weather_debug.dm @@ -11,7 +11,7 @@ to_chat(usr, SPAN_WARNING("You need to have a turf to use this verb.")) return - var/obj/abstract/weather_system/weather = T.weather || SSweather.get_weather_for_level(T.z) + var/obj/abstract/weather_system/weather = T.weather || SSweather.weather_by_z[T.z] if(!weather) to_chat(usr, SPAN_WARNING("This z-level does not have weather.")) return @@ -28,15 +28,17 @@ return var/turf/T = get_turf(usr) + while(T && HasAbove(T.z)) + T = GetAbove(T) if(!istype(T)) to_chat(usr, SPAN_WARNING("You need to have a turf to use this verb.")) return - var/obj/abstract/weather_system/weather = T.weather || SSweather.get_weather_for_level(T.z) + var/obj/abstract/weather_system/weather = T.weather || SSweather.weather_by_z[T.z] if(weather) to_chat(usr, SPAN_WARNING("This z-level already has weather.")) return - new /obj/abstract/weather_system(null, T.z) + SSweather.setup_weather_system(SSmapping.levels_by_z[T.z]) to_chat(usr, SPAN_NOTICE("Weather created for z[T.z].")) /datum/admins/proc/force_weather_state() @@ -52,13 +54,13 @@ to_chat(usr, SPAN_WARNING("You need to have a turf to use this verb.")) return - var/obj/abstract/weather_system/weather = T.weather || SSweather.get_weather_for_level(T.z) + var/obj/abstract/weather_system/weather = T.weather || SSweather.weather_by_z[T.z] if(!weather) to_chat(usr, SPAN_WARNING("This z-level has no weather. Use Initialize Weather For Level if you want to create it.")) return var/use_state = input(usr, "Which state do you wish to use?", "Target State") as null|anything in decls_repository.get_decl_paths_of_subtype(/decl/state/weather) - if(!use_state || weather != (T.weather || SSweather.get_weather_for_level(T.z))) + if(!use_state || weather != (T.weather || SSweather.weather_by_z[T.z])) return weather.weather_system.set_state(use_state) var/decl/state/weather/weather_state = GET_DECL(use_state) diff --git a/code/modules/weather/weather_init.dm b/code/modules/weather/weather_init.dm index 2a933ac9cb5..d5fdc4e5632 100644 --- a/code/modules/weather/weather_init.dm +++ b/code/modules/weather/weather_init.dm @@ -4,7 +4,7 @@ INITIALIZE_IMMEDIATE(/obj/abstract/weather_system) . = ..() - invisibility = 0 + set_invisibility(INVISIBILITY_NONE) // Bookkeeping/rightclick guards. verbs.Cut() @@ -21,17 +21,18 @@ INITIALIZE_IMMEDIATE(/obj/abstract/weather_system) // If we're post-init, init immediately. if(SSweather.initialized) - addtimer(CALLBACK(src, .proc/init_weather), 0) + addtimer(CALLBACK(src, PROC_REF(init_weather)), 0) // Start the weather effects from the highest point; they will propagate downwards during update. /obj/abstract/weather_system/proc/init_weather() // Track all z-levels. - var/highest_z = affecting_zs[1] - for(var/tz in affecting_zs) - if(tz > highest_z) - highest_z = tz - - // Update turf weather. - for(var/turf/T as anything in block(locate(1, 1, highest_z), locate(world.maxx, world.maxy, highest_z))) - T.update_weather(src) - CHECK_TICK + for(var/highest_z in affecting_zs) + var/turfcount = 0 + if(HasAbove(highest_z)) + continue + // Update turf weather. + for(var/turf/T as anything in block(locate(1, 1, highest_z), locate(world.maxx, world.maxy, highest_z))) + T.update_weather(src) + turfcount++ + CHECK_TICK + log_debug("Initialized weather for [turfcount] turf\s from z[highest_z].") diff --git a/code/modules/weather/weather_mob_tracking.dm b/code/modules/weather/weather_mob_tracking.dm index 0a1a318700b..4355918aa8f 100644 --- a/code/modules/weather/weather_mob_tracking.dm +++ b/code/modules/weather/weather_mob_tracking.dm @@ -2,8 +2,8 @@ var/global/list/current_mob_ambience = list() /obj/abstract/weather_system - // Weakref lists used to track mobs within our weather - // system; alternative to keeping big lists of actual mobs or + // Weakref lists used to track mobs within our weather + // system; alternative to keeping big lists of actual mobs or // having mobs constantly poked by weather systems. var/tmp/list/mobs_on_cooldown = list() // Has this mob recently been messed with by the weather? @@ -15,7 +15,7 @@ var/global/list/current_mob_ambience = list() var/mobref = weakref(M) if(!(mobref in mobs_on_cooldown)) mobs_on_cooldown[mobref] = TRUE - addtimer(CALLBACK(src, .proc/clear_cooldown, mobref), delay) + addtimer(CALLBACK(src, PROC_REF(clear_cooldown), mobref), delay) return TRUE return FALSE diff --git a/code/modules/webhooks/_webhook.dm b/code/modules/webhooks/_webhook.dm index e7cfb646cd7..ed5087c06bd 100644 --- a/code/modules/webhooks/_webhook.dm +++ b/code/modules/webhooks/_webhook.dm @@ -10,7 +10,7 @@ if (!target_url) return -1 - var/result = call(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json"))) + var/result = LIBCALL(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json"))) result = cached_json_decode(result) if (result["error_code"]) @@ -27,7 +27,7 @@ if(!length(message)) return FALSE - if(config.disable_webhook_embeds) + if(get_config_value(/decl/config/toggle/disable_webhook_embeds)) var/list/embed_content for(var/list/embed in message["embeds"]) if(embed["title"]) diff --git a/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm b/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm index 65d4f5775d6..08df28860c2 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm @@ -50,7 +50,7 @@ /obj/effect/energy_field/artifact strength = 1 density = TRUE - invisibility = 0 + invisibility = INVISIBILITY_NONE is_spawnable_type = FALSE var/datum/artifact_effect/forcefield/owner diff --git a/code/modules/xenoarcheaology/finds/find_types/guns.dm b/code/modules/xenoarcheaology/finds/find_types/guns.dm index bad46a6a963..fa6de524561 100644 --- a/code/modules/xenoarcheaology/finds/find_types/guns.dm +++ b/code/modules/xenoarcheaology/finds/find_types/guns.dm @@ -64,13 +64,16 @@ //10% chance to have an unchargeable cell //15% chance to gain a random amount of starting energy, otherwise start with an empty cell - if(prob(10)) - new_gun.power_supply.maxcharge = 0 - if(prob(15)) - new_gun.power_supply.charge = rand(0, new_gun.power_supply.maxcharge) - else - new_gun.power_supply.charge = 0 - + var/obj/item/cell/power_supply = new_gun.get_cell() + if(power_supply) + if(prob(10)) + power_supply.maxcharge = 0 + if(prob(15)) + power_supply.charge = rand(0, power_supply.maxcharge) + else + power_supply.charge = 0 + power_supply.update_icon() + new_gun.update_icon() return new_gun /decl/archaeological_find/laser/new_icon() diff --git a/code/modules/xenoarcheaology/finds/find_types/statuette.dm b/code/modules/xenoarcheaology/finds/find_types/statuette.dm index c2f480dd53f..beb93d05fa3 100644 --- a/code/modules/xenoarcheaology/finds/find_types/statuette.dm +++ b/code/modules/xenoarcheaology/finds/find_types/statuette.dm @@ -41,7 +41,7 @@ //see if we've identified anyone nearby if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len) var/mob/living/carbon/human/M = pop(nearby_mobs) - if(M in view(7,src) && M.health > 20) + if(M in view(7,src) && M.current_health > 20) if(prob(50)) bloodcall(M) nearby_mobs.Add(M) diff --git a/code/modules/xenoarcheaology/finds/strange_rock.dm b/code/modules/xenoarcheaology/finds/strange_rock.dm index e30753a5abb..73a4009878f 100644 --- a/code/modules/xenoarcheaology/finds/strange_rock.dm +++ b/code/modules/xenoarcheaology/finds/strange_rock.dm @@ -4,7 +4,7 @@ desc = "Seems to have some unusal strata evident throughout it." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "strange" - origin_tech = "{'materials':5}" + origin_tech = @'{"materials":5}' material = /decl/material/solid/stone/sandstone var/obj/item/inside diff --git a/code/modules/xenoarcheaology/machinery/artifact_analyser.dm b/code/modules/xenoarcheaology/machinery/artifact_analyser.dm index 5cf1f67dc33..af753c97347 100644 --- a/code/modules/xenoarcheaology/machinery/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/machinery/artifact_analyser.dm @@ -29,7 +29,7 @@ if(!owned_scanner) owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) if(owned_scanner) - events_repository.register(/decl/observ/destroyed, owned_scanner, src, /obj/machinery/artifact_analyser/proc/clear_scanner) + events_repository.register(/decl/observ/destroyed, owned_scanner, src, TYPE_PROC_REF(/obj/machinery/artifact_analyser, clear_scanner)) /obj/machinery/artifact_analyser/proc/clear_scanner() if(owned_scanner) @@ -39,7 +39,7 @@ /obj/machinery/artifact_analyser/proc/set_object(var/obj/O) if(O != scanned_object && O) clear_object() - events_repository.register(/decl/observ/destroyed, O, src, /obj/machinery/artifact_analyser/proc/clear_object) + events_repository.register(/decl/observ/destroyed, O, src, TYPE_PROC_REF(/obj/machinery/artifact_analyser, clear_object)) scanned_object = O /obj/machinery/artifact_analyser/proc/clear_object() diff --git a/code/modules/xenoarcheaology/machinery/artifact_harvester.dm b/code/modules/xenoarcheaology/machinery/artifact_harvester.dm index e04ff905dac..3b7f727b735 100644 --- a/code/modules/xenoarcheaology/machinery/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/machinery/artifact_harvester.dm @@ -31,7 +31,7 @@ if(!owned_scanner) owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) if(owned_scanner) - events_repository.register(/decl/observ/destroyed, owned_scanner, src, /obj/machinery/artifact_analyser/proc/clear_scanner) + events_repository.register(/decl/observ/destroyed, owned_scanner, src, TYPE_PROC_REF(/obj/machinery/artifact_analyser, clear_scanner)) /obj/machinery/artifact_harvester/Destroy() clear_scanner() @@ -53,7 +53,7 @@ if(cur_artifact == new_artifact || !new_artifact) return clear_artifact() - events_repository.register(/decl/observ/destroyed, new_artifact, src, /obj/machinery/artifact_harvester/proc/clear_artifact) + events_repository.register(/decl/observ/destroyed, new_artifact, src, TYPE_PROC_REF(/obj/machinery/artifact_harvester, clear_artifact)) cur_artifact = new_artifact /obj/machinery/artifact_harvester/attackby(var/obj/I, var/mob/user) diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 5e597f56249..03510f0db9e 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -3,7 +3,7 @@ desc = "Curious device that can replicate the effects of anomalies without needing to understand their inner workings." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "anobattery0" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/chromium = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/zinc = MATTER_AMOUNT_REINFORCEMENT, @@ -40,7 +40,7 @@ desc = "APU allows users to safely (relatively) harness powers beyond their understanding, as long as they've been stored in anomaly power cells." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "anodev_empty" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/chromium = MATTER_AMOUNT_SECONDARY, /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, @@ -134,7 +134,7 @@ activated = 1 current_tick = 0 START_PROCESSING(SSobj, src) - events_repository.register(/decl/observ/moved, src, src, /obj/item/anodevice/proc/on_move) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/obj/item/anodevice, on_move)) if(inserted_battery?.battery_effect?.activated == 0) inserted_battery.battery_effect.ToggleActivate(1) diff --git a/code/modules/xenoarcheaology/tools/anomaly_container.dm b/code/modules/xenoarcheaology/tools/anomaly_container.dm index 3ad102b8aeb..19f0e781d94 100644 --- a/code/modules/xenoarcheaology/tools/anomaly_container.dm +++ b/code/modules/xenoarcheaology/tools/anomaly_container.dm @@ -37,7 +37,7 @@ underlays.Cut() desc = initial(desc) -/obj/structure/artifact/handle_mouse_drop(atom/over, mob/user) +/obj/structure/artifact/handle_mouse_drop(atom/over, mob/user, params) if(istype(over, /obj/structure/anomaly_container)) Bumped(user) var/obj/structure/anomaly_container/box = over diff --git a/code/modules/xenoarcheaology/tools/anomaly_scanner.dm b/code/modules/xenoarcheaology/tools/anomaly_scanner.dm index f94730f625f..94555b7c17c 100644 --- a/code/modules/xenoarcheaology/tools/anomaly_scanner.dm +++ b/code/modules/xenoarcheaology/tools/anomaly_scanner.dm @@ -3,8 +3,8 @@ desc = "A device which aids in triangulation of exotic particles." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "flashgun" - item_state = "lampgreen" - origin_tech = "{'wormholes':3,'magnets':3}" + item_state = "flashgun" + origin_tech = @'{"wormholes":3,"magnets":3}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/xenoarcheaology/tools/core_sampler.dm b/code/modules/xenoarcheaology/tools/core_sampler.dm index d8190632573..d022291f335 100644 --- a/code/modules/xenoarcheaology/tools/core_sampler.dm +++ b/code/modules/xenoarcheaology/tools/core_sampler.dm @@ -6,7 +6,7 @@ item_state = "screwdriver_brown" w_class = ITEM_SIZE_TINY material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) var/obj/item/sample /obj/item/core_sampler/examine(mob/user, distance) @@ -43,7 +43,7 @@ . = ..() if(proximity_flag) sample_item(target, user) - + /obj/item/rocksliver name = "rock sliver" desc = "It looks extremely delicate." @@ -54,7 +54,7 @@ sharp = 1 material = /decl/material/solid/stone/sandstone material_health_multiplier = 0.25 - + /obj/item/rocksliver/Initialize(ml, material_key, geodata) . = ..() icon_state = "sliver[rand(1, 3)]" diff --git a/code/modules/xenoarcheaology/tools/depth_scanner.dm b/code/modules/xenoarcheaology/tools/depth_scanner.dm index b086667c265..c09dedbda44 100644 --- a/code/modules/xenoarcheaology/tools/depth_scanner.dm +++ b/code/modules/xenoarcheaology/tools/depth_scanner.dm @@ -2,9 +2,8 @@ name = "depth analysis scanner" desc = "A device used to check spatial depth and density of rock outcroppings." icon = 'icons/obj/items/device/depth_scanner.dmi' - icon_state = "crap" - item_state = "analyzer" - origin_tech = "{'magnets':2,'engineering':2,'wormholes':2}" + icon_state = ICON_STATE_WORLD + origin_tech = @'{"magnets":2,"engineering":2,"wormholes":2}' material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm index 8e5e4c38dd6..c238e300741 100644 --- a/code/modules/xenoarcheaology/tools/equipment.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -36,7 +36,6 @@ ARMOR_RAD = ARMOR_RAD_SHIELDED ) anomaly_shielding = 0.2 - light_overlay = "hardhat_light" /obj/item/clothing/suit/space/void/excavation/prepared helmet = /obj/item/clothing/head/helmet/space/void/excavation @@ -71,4 +70,4 @@ /obj/item/ano_scanner, /obj/item/stack/tape_roll/barricade_tape/research, /obj/item/pickaxe/xeno/hand) - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth diff --git a/code/modules/xenoarcheaology/tools/misc.dm b/code/modules/xenoarcheaology/tools/misc.dm index 868128238e7..d16e0d69e92 100644 --- a/code/modules/xenoarcheaology/tools/misc.dm +++ b/code/modules/xenoarcheaology/tools/misc.dm @@ -5,10 +5,10 @@ return list( /obj/item/book/manual/excavation, /obj/item/book/manual/mass_spectrometry, - /obj/item/book/manual/materials_chemistry_analysis, - /obj/item/book/manual/anomaly_testing, - /obj/item/book/manual/anomaly_spectroscopy, - /obj/item/book/manual/stasis, + /obj/item/book/fluff/materials_chemistry_analysis, + /obj/item/book/fluff/anomaly_testing, + /obj/item/book/fluff/anomaly_spectroscopy, + /obj/item/book/fluff/stasis, ) /obj/structure/closet/secure_closet/xenoarchaeologist @@ -66,9 +66,10 @@ // //Structures -/decl/material/solid/metal/chromium/generate_recipes(reinforce_material) +/decl/material/solid/metal/chromium/generate_recipes(stack_type, reinforce_material) . = ..() - . += /datum/stack_recipe/structure/anomaly_container + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += /datum/stack_recipe/structure/anomaly_container /datum/stack_recipe/structure/anomaly_container title = "anomaly container" diff --git a/code/modules/xenoarcheaology/tools/picks.dm b/code/modules/xenoarcheaology/tools/picks.dm index cf126c9cc4b..1d9eea8282e 100644 --- a/code/modules/xenoarcheaology/tools/picks.dm +++ b/code/modules/xenoarcheaology/tools/picks.dm @@ -29,7 +29,7 @@ drill_sound = 'sound/weapons/thudswoosh.ogg' drill_verb = "brushing" sharp = 0 - material = /decl/material/solid/wood + material = /decl/material/solid/organic/wood matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) /obj/item/pickaxe/xeno/one_pick @@ -99,7 +99,7 @@ max_storage_space = 18 max_w_class = ITEM_SIZE_NORMAL use_to_pickup = 1 - material = /decl/material/solid/leather/synth + material = /decl/material/solid/organic/leather/synth /obj/item/storage/excavation/WillContain() return list( diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 23d6ca0a389..d2daf82b18d 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -3,7 +3,7 @@ desc = "A coiled metallic tape used to check dimensions and lengths." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "measuring" - origin_tech = "{'materials':1}" + origin_tech = @'{"materials":1}' material = /decl/material/solid/metal/steel w_class = ITEM_SIZE_SMALL @@ -18,4 +18,4 @@ max_storage_space = 200 max_w_class = ITEM_SIZE_NORMAL can_hold = list(/obj/item/fossil) - material = /decl/material/solid/leather/synth \ No newline at end of file + material = /decl/material/solid/organic/leather/synth \ No newline at end of file diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index b2eb73feaae..ae9f0a4d90f 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -322,9 +322,9 @@ //Copies gas and temperature from another gas_mixture. /datum/gas_mixture/proc/copy_from(const/datum/gas_mixture/sample) gas = sample.gas.Copy() - graphic = sample.graphic.Copy() temperature = sample.temperature update_values() + check_tile_graphic() return 1 /datum/gas_mixture/GetCloneArgs() diff --git a/code/procs/AStar.dm b/code/procs/AStar.dm index e3cf62730d7..01e4213f805 100644 --- a/code/procs/AStar.dm +++ b/code/procs/AStar.dm @@ -12,7 +12,7 @@ And for the distance one i wrote: /turf/proc/Distance So an example use might be: -src.path_list = AStar(src.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance) +src.path_list = AStar(src.loc, target.loc, TYPE_PROC_REF(/turf, AdjacentTurfs), TYPE_PROC_REF(/turf, Distance)) Note: The path is returned starting at the END node, so i wrote reverselist to reverse it for ease of use. diff --git a/code/procs/hud.dm b/code/procs/hud.dm index c42577190d2..760d1b2fb37 100644 --- a/code/procs/hud.dm +++ b/code/procs/hud.dm @@ -28,9 +28,9 @@ the HUD updates properly! */ P.Client.images += patient.hud_list[STATUS_HUD] else var/sensor_level = getsensorlevel(patient) - if(sensor_level >= SUIT_SENSOR_VITAL) + if(sensor_level >= VITALS_SENSOR_VITAL) P.Client.images += patient.hud_list[HEALTH_HUD] - if(sensor_level >= SUIT_SENSOR_BINARY) + if(sensor_level >= VITALS_SENSOR_BINARY) P.Client.images += patient.hud_list[LIFE_HUD] //Security HUDs. Pass a value for the second argument to enable implant viewing or other special features. diff --git a/code/unit_tests/chemistry_tests.dm b/code/unit_tests/chemistry_tests.dm index 3f7c27a9c31..6b16b290696 100644 --- a/code/unit_tests/chemistry_tests.dm +++ b/code/unit_tests/chemistry_tests.dm @@ -173,4 +173,60 @@ else pass("No reactions had conflicts.") + return 1 + +/datum/unit_test/chemistry_premade_bottles_shall_not_melt + name = "CHEMISTRY: Reagent containers shall not be destroyed by their contents" + // List of master types that can be reasonably expected to spawn with chems inside them. + var/static/list/master_types = list( + /obj/item/chems, + /obj/structure/reagent_dispensers + ) + // Types to be skipped for reasons other than abstraction/spawnability. + var/static/list/excepted_types = list() + +/datum/unit_test/chemistry_premade_bottles_shall_not_melt/start_test() + + // Main test. + var/list/chem_refs = list() + var/turf/spawn_spot = get_safe_turf() + var/list/failures = list() + for(var/master_type in master_types) + for(var/chem_type in subtypesof(master_type)) + if(chem_type in excepted_types) + continue + var/atom/chem = chem_type + if(TYPE_IS_ABSTRACT(chem)) + continue + chem = new chem(spawn_spot) + if(QDELETED(chem)) + failures += "- [type] qdeleted after Initialize()" + continue + chem_refs[chem.type] = weakref(chem) + + // Let SSmaterials process chemical reactions and solvents. + sleep(SSmaterials.wait * 2) + + // Followup status checking. + for(var/chem_type in chem_refs) + var/weakref/chem_ref = chem_refs[chem_type] + var/atom/chem_instance = istype(chem_ref) && chem_ref.resolve() + if(QDELETED(chem_instance) || !istype(chem_instance, chem_type) || chem_instance.loc != spawn_spot) + failures += "- [chem_type] qdeleted after reacting" + else + // Cleanup pt. 1 + qdel(chem_instance) + + // Cleanup pt. 2 + chem_refs.Cut() + var/obj/effect/fluid/fluid = locate() in spawn_spot + if(fluid) + qdel(fluid) + failures += "- spawn turf had fluids post-test" + + // Report status. + if(length(failures)) + fail("At least one subtype was qdeleted:\n[jointext(failures, "\n")]") + else + pass("No subtypes melted.") return 1 \ No newline at end of file diff --git a/code/unit_tests/closets.dm b/code/unit_tests/closets.dm index 4c268a2c6f5..9bc236f8ff9 100644 --- a/code/unit_tests/closets.dm +++ b/code/unit_tests/closets.dm @@ -55,21 +55,21 @@ ) var/fail_msg = "Insane closet appearances found: " if(LAZYLEN(bad_decl)) - fail_msg += "\nDecl did not add itself to appropriate global list:\n[jointext("\t[bad_icon]", "\n")]." + fail_msg += "\nDecl did not add itself to appropriate global list:\n[jointext(bad_icon, "\n\t")]." if(LAZYLEN(bad_icon)) - fail_msg += "\nNull final icon values:\n[jointext("\t[bad_icon]", "\n")]." + fail_msg += "\nNull final icon values:\n\t[jointext(bad_icon, "\n\t")]." if(LAZYLEN(bad_colour)) - fail_msg += "\nNull color values:\n[jointext("\t[bad_colour]", "\n")]." + fail_msg += "\nNull color values:\n\t[jointext(bad_colour, "\n\t")]." if(LAZYLEN(bad_base_icon)) - fail_msg += "\nNull base icon value:\n[jointext("\t[bad_base_icon]", "\n")]." + fail_msg += "\nNull base icon value:\n\t[jointext(bad_base_icon, "\n\t")]." if(LAZYLEN(bad_base_state)) - fail_msg += "\nMissing state from base icon:\n[jointext("\t[bad_base_state]", "\n")]." + fail_msg += "\nMissing state from base icon:\n\t[jointext(bad_base_state, "\n\t")]." if(LAZYLEN(bad_decal_icon)) - fail_msg += "\nDecal icon not set but decal lists populated:\n[jointext("\t[bad_decal_icon]", "\n")]." + fail_msg += "\nDecal icon not set but decal lists populated:\n\t[jointext(bad_decal_icon, "\n\t")]." if(LAZYLEN(bad_decal_colour)) - fail_msg += "\nNull color in final decal entry:\n[jointext("\t[bad_decal_colour]", "\n")]." + fail_msg += "\nNull color in final decal entry:\n\t[jointext(bad_decal_colour, "\n\t")]." if(LAZYLEN(bad_decal_state)) - fail_msg += "\nNon-existent decal icon state:\n[jointext("\t[bad_decal_state]", "\n")]." + fail_msg += "\nNon-existent decal icon state:\n\t[jointext(bad_decal_state, "\n\t")]." fail(fail_msg) else diff --git a/code/unit_tests/culture.dm b/code/unit_tests/culture.dm index 122252e03eb..0f1d6717dd0 100644 --- a/code/unit_tests/culture.dm +++ b/code/unit_tests/culture.dm @@ -22,7 +22,7 @@ fails++ log_bad("Default cultural value '[val]' for [species_name] tag '[token]' is text, must be a type.") else - var/decl/cultural_info/culture = ispath(val, /decl/cultural_info) && GET_DECL(val) + var/decl/cultural_info/culture = GET_DECL(val) if(!istype(culture)) fails++ log_bad("Default cultural value '[val]' for [species_name] tag '[token]' is not a valid culture label.") @@ -50,7 +50,7 @@ fails++ log_bad("Forced cultural value for [species_name] tag '[token]' is text, must be a type.") else - var/decl/cultural_info/culture = ispath(val, /decl/cultural_info) && GET_DECL(val) + var/decl/cultural_info/culture = GET_DECL(val) if(!istype(culture)) fails++ log_bad("Forced cultural value '[val]' for [species_name] tag '[token]' is not a valid culture label.") @@ -77,7 +77,7 @@ if(istext(val)) log_bad("Available cultural value '[val]' for [species_name] tag '[token]' is text, must be a type.") else - var/decl/cultural_info/culture = ispath(val, /decl/cultural_info) && GET_DECL(val) + var/decl/cultural_info/culture = GET_DECL(val) if(!istype(culture)) fails++ log_bad("Available cultural value '[val]' for [species_name] tag '[token]' is not a valid culture label.") diff --git a/code/unit_tests/decls.dm b/code/unit_tests/decls.dm index 76d0ae50c03..554ca506ea6 100644 --- a/code/unit_tests/decls.dm +++ b/code/unit_tests/decls.dm @@ -5,11 +5,9 @@ var/list/failures = list() // Check decl validation. - for(var/decl_type in typesof(/decl)) - var/decl/decl = decl_type - if(TYPE_IS_ABSTRACT(decl)) - continue - decl = GET_DECL(decl_type) + var/list/decls_to_validate = decls_repository.get_decls_of_type(/decl) + for(var/decl_type in decls_to_validate) + var/decl/decl = decls_to_validate[decl_type] var/list/validation_results = decl.validate() if(length(validation_results)) failures[decl_type] = validation_results diff --git a/code/unit_tests/del_the_world.dm b/code/unit_tests/del_the_world.dm index 5b59f304391..ae7b7758f5f 100644 --- a/code/unit_tests/del_the_world.dm +++ b/code/unit_tests/del_the_world.dm @@ -6,6 +6,16 @@ /datum/unit_test/del_the_world/start_test() var/turf/spawn_loc = get_safe_turf() var/list/cached_contents = spawn_loc.contents.Copy() + + /// Types to except from GC checking tests. + var/list/gc_exceptions = list( + // I hate doing this, but until the graph tests are fixed by someone who actually understands them, + // this is the best I can do without breaking other stuff. + /datum/node/physical, + // Randomly fails to GC during CI, cause unclear. Remove this if the root cause is identified. + /obj/item/organ/external/chest + ) + var/list/ignore = typesof( // will error if the area already has one /obj/machinery/power/apc, @@ -26,10 +36,12 @@ // Fluid system related; causes issues with atoms spawned on the turf. /obj/abstract/fluid_mapped, /obj/effect/fluid, - /obj/abstract/flood, + /obj/effect/flood, // Not valid when spawned manually. /obj/effect/overmap, /obj/effect/shuttle_landmark, + // Generally not expected to be spawned outside of a mob HUD context. + /obj/screen ) + list( // Exclude only this type, since it's not meant to be spawned but its subtypes are. // TODO: Consider whether this warrants abstract_type? @@ -118,9 +130,7 @@ //Alright, time to see if anything messed up var/list/cache_for_sonic_speed = SSgarbage.items for(var/path in cache_for_sonic_speed) - if(ispath(path, /datum/node/physical)) - // I hate doing this, but until the graph tests are fixed by someone who actually understands them, - // this is the best I can do without breaking other stuff. + if(path in gc_exceptions) continue var/datum/qdel_item/item = cache_for_sonic_speed[path] if(item.failures) diff --git a/code/unit_tests/equipment_tests.dm b/code/unit_tests/equipment_tests.dm index 632ff5592df..e15fa9dbad6 100644 --- a/code/unit_tests/equipment_tests.dm +++ b/code/unit_tests/equipment_tests.dm @@ -116,7 +116,7 @@ "[slot_gloves_str]" = /obj/item/clothing/gloves/rainbow, "[slot_l_ear_str]" = /obj/item/clothing/head/hairflower, "[slot_r_ear_str]" = /obj/item/clothing/head/hairflower, - "[slot_belt_str]" = /obj/item/storage/belt/utility, + "[slot_belt_str]" = /obj/item/storage/ore, // note: this should be an item without ITEM_FLAG_IS_BELT "[slot_wear_suit_str]" = /obj/item/clothing/suit/chickensuit ) diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm index 199d599665d..3bebd89e95d 100644 --- a/code/unit_tests/icon_tests.dm +++ b/code/unit_tests/icon_tests.dm @@ -2,23 +2,41 @@ name = "ICON STATE template" template = /datum/unit_test/icon_test -/datum/unit_test/icon_test/posters_shall_have_icon_states - name = "ICON STATE - Posters Shall Have Icon States" - -/datum/unit_test/icon_test/posters_shall_have_icon_states/start_test() - var/contraband_icons = icon_states('icons/obj/contraband.dmi') - var/list/invalid_posters = list() - - var/list/all_posters = decls_repository.get_decls_of_subtype(/decl/poster_design) - for(var/poster_design in all_posters) - var/decl/poster_design/P = all_posters[poster_design] - if(!(P.icon_state in contraband_icons)) - invalid_posters += poster_design +/datum/unit_test/icon_test/turfs_shall_have_icon_states + name = "ICON STATE - Turf Subtypes Shall Have Icon States" + var/list/except_types = list( + /turf/unsimulated/mimic_edge, + /turf/exterior/mimic_edge, + /turf/simulated/mimic_edge, + /turf/exterior/open, + /turf/simulated/open + ) - if(invalid_posters.len) - fail("/decl/poster_design with missing icon states: [english_list(invalid_posters)]") +/datum/unit_test/icon_test/turfs_shall_have_icon_states/start_test() + var/list/failures = list() + for(var/turf_type in subtypesof(/turf)) + var/turf/turf_prototype = turf_type + if(TYPE_IS_ABSTRACT(turf_prototype)) + continue + var/excepted = FALSE + for(var/exception_path in except_types) + if(ispath(turf_type, exception_path)) + excepted = TRUE + break + if(excepted) + continue + var/test_icon_state = initial(turf_prototype.icon_state) + var/test_icon = initial(turf_prototype.icon) + if(isnull(test_icon_state)) + failures += "[turf_prototype] - null icon state" + if(!test_icon) + failures += "[turf_prototype] - null icon" + if(!isnull(test_icon_state) && test_icon && !check_state_in_icon(test_icon_state, test_icon)) + failures += "[turf_prototype] - state [test_icon_state] not in icon [test_icon]" + if(length(failures)) + fail("Turf subtypes had missing icons or icon states:\n[jointext(failures, "\n")].") else - pass("All /decl/poster_design subtypes have valid icon states.") + pass("All turf subtypes had valid icon states.") return 1 /datum/unit_test/icon_test/item_modifiers_shall_have_icon_states @@ -51,13 +69,27 @@ /datum/unit_test/icon_test/signs_shall_have_existing_icon_states name = "ICON STATE - Signs shall have existing icon states" + var/list/skip_types = list( + // Posters use a decl to set their icon and handle their own validation. + /obj/structure/sign/poster + ) /datum/unit_test/icon_test/signs_shall_have_existing_icon_states/start_test() var/list/failures = list() for(var/sign_type in typesof(/obj/structure/sign)) + var/obj/structure/sign/sign = sign_type if(TYPE_IS_ABSTRACT(sign)) continue + + var/skip = FALSE + for(var/skip_type in skip_types) + if(ispath(sign_type, skip_type)) + skip = TRUE + break + if(skip) + continue + var/check_state = initial(sign.icon_state) if(!check_state) failures += "[sign] - null icon_state" @@ -66,14 +98,37 @@ if(!check_icon) failures += "[sign] - null icon_state" continue - if(!check_state_in_icon(check_state, check_icon, TRUE)) + if(!check_state_in_icon(check_state, check_icon)) failures += "[sign] - missing icon_state '[check_state]' in icon '[check_icon]" if(failures.len) - fail("Signs with missing icon states: [english_list(failures)]") + fail("Signs with missing icon states:\n\t-[jointext(failures, "\n\t-")]") else pass("All signs have valid icon states.") return 1 +/datum/unit_test/icon_test/random_spawners_shall_have_existing_icon_states + name = "ICON STATE - Random spawners shall have existing icon states" + +/datum/unit_test/icon_test/random_spawners_shall_have_existing_icon_states/start_test() + var/list/failures = list() + for(var/test_type in subtypesof(/obj/random)) + var/obj/random/prototype = test_type + if(TYPE_IS_ABSTRACT(prototype)) + continue + var/test_icon = initial(prototype.icon) + if(!test_icon) + failures += "[test_type] - no icon" + var/test_icon_state = initial(prototype.icon_state) + if(!test_icon_state) + failures += "[test_type] - no icon_state" + if(test_icon_state && test_icon && !check_state_in_icon(test_icon_state, test_icon)) + failures += "[test_type] - icon_state [test_icon_state] not present in [test_icon]" + if(length(failures)) + fail("Some random spawners have an invalid icon state:\n[jointext(failures, "\n")]") + else + pass("All random spawners had a valid icon state.") + return 1 + /datum/unit_test/icon_test/floor_decals_shall_have_existing_icon_states name = "ICON STATE - Floor decals shall have existing icon states" var/static/list/excepted_types = list( @@ -94,10 +149,10 @@ if(!check_icon) failures += "[decal] - null icon_state" continue - if(!check_state_in_icon(check_state, check_icon, TRUE)) + if(!check_state_in_icon(check_state, check_icon)) failures += "[decal] - missing icon_state '[check_state]' in icon '[check_icon]" if(failures.len) - fail("Decals with missing icon states: [english_list(failures)]") + fail("Decals with missing icon states:\n\t-[jointext(failures, "\n\t-")]") else pass("All decals have valid icon states.") return 1 diff --git a/code/unit_tests/json.dm b/code/unit_tests/json.dm index 84002b7ad5c..a5be63f35bb 100644 --- a/code/unit_tests/json.dm +++ b/code/unit_tests/json.dm @@ -37,6 +37,11 @@ var/list/failures var/list/json_to_check + for(var/subtype in typesof(/obj)) + var/obj/test = subtype + var/check_json = initial(test.directional_offset) + if(!isnull(check_json)) + LAZYSET(json_to_check, "[subtype].directional_offset", check_json) for(var/subtype in typesof(/obj/item)) var/obj/item/test = subtype var/check_json = initial(test.center_of_mass) @@ -62,11 +67,17 @@ var/check_json = initial(test.possible_transfer_amounts) if(!isnull(check_json)) LAZYSET(json_to_check, "[subtype].possible_transfer_amounts", check_json) + var/list/prefabs = decls_repository.get_decls_of_subtype(/decl/prefab/ic_assembly) + for(var/assembly_path in prefabs) + var/decl/prefab/ic_assembly/assembly = prefabs[assembly_path] + var/check_json = assembly.data + if(!isnull(check_json)) + LAZYSET(json_to_check, "[assembly_path].data", check_json) // Validate JSON. for(var/check_key in json_to_check) try var/list/output = cached_json_decode(json_to_check[check_key]) - if(!islist(output) || !length(output)) + if(findtext(json_to_check[check_key], "{'") || !islist(output) || !length(output)) LAZYADD(failures, check_key) catch() LAZYADD(failures, check_key) diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index 5d47ff00659..54e56f315d0 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -78,10 +78,14 @@ continue if(!isPlayerLevel(A.z)) continue - var/obj/machinery/alarm/alarm = locate() in A // Only test areas with functional alarms - if(!alarm) - continue - if(alarm.stat & (NOPOWER | BROKEN)) + // Only test areas with functional alarms + var/obj/machinery/alarm/found_alarm + for (var/obj/machinery/alarm/alarm in A) + if(alarm.inoperable()) // must have at least one functional alarm + continue + found_alarm = alarm + + if(!found_alarm) continue //Make a list of devices that are being controlled by their air alarms @@ -97,17 +101,37 @@ for(var/tag in vents_in_area) // The point of this test is that while the names list is registered at init, the info is transmitted by radio. if(!A.air_vent_info[tag]) var/obj/machinery/atmospherics/unary/vent_pump/V = vents_in_area[tag] - var/logtext = "Vent [A.air_vent_names[tag]] ([V.x], [V.y], [V.z]) with id_tag [tag] did not update the air alarm in area [A]." - if(!V.operable()) + var/logtext = "Vent [A.air_vent_names[tag]] ([V.x], [V.y], [V.z]) with id_tag [tag] did not update [log_info_line(found_alarm)] in area [A]." + if(V.inoperable()) logtext = "[logtext] The vent was not functional." + var/alarm_dist = get_dist(found_alarm, V) + if(alarm_dist > 60) + logtext += " The vent may be out of transmission range (max 60, was [alarm_dist])." + var/V_freq + for(var/obj/item/stock_parts/radio/radio_component in V.component_parts) + V_freq ||= radio_component.frequency + if(isnull(V_freq)) + logtext += " The vent had no frequency set." + else if(V_freq != found_alarm.frequency) + logtext += " Frequencies did not match (alarm: [found_alarm.frequency], vent: [V_freq])." log_bad(logtext) failed = TRUE for(var/tag in scrubbers_in_area) if(!A.air_scrub_info[tag]) var/obj/machinery/atmospherics/unary/vent_scrubber/V = scrubbers_in_area[tag] - var/logtext = "Scrubber [A.air_scrub_names[tag]] ([V.x], [V.y], [V.z]) with id_tag [tag] did not update the air alarm in area [A]." - if(!V.operable()) + var/logtext = "Scrubber [A.air_scrub_names[tag]] ([V.x], [V.y], [V.z]) with id_tag [tag] did not update [log_info_line(found_alarm)] in area [A]." + if(V.inoperable()) logtext = "[logtext] The scrubber was not functional." + var/alarm_dist = get_dist(found_alarm, V) + if(alarm_dist > 60) + logtext += " The scrubber may be out of transmission range (max 60, was [alarm_dist])." + var/V_freq + for(var/obj/item/stock_parts/radio/radio_component in V.component_parts) + V_freq ||= radio_component.frequency + if(isnull(V_freq)) + logtext += " The scrubber had no frequency set." + else if(V_freq != found_alarm.frequency) + logtext += " Frequencies did not match (alarm: [found_alarm.frequency], scrubber: [V_freq])." log_bad(logtext) failed = TRUE @@ -275,19 +299,70 @@ //======================================================================================= /datum/unit_test/correct_allowed_spawn_test - name = "MAP: All allowed_spawns entries should have spawnpoints on map." + name = "MAP: All allowed_latejoin_spawns entries should have spawnpoints on map." /datum/unit_test/correct_allowed_spawn_test/start_test() + var/list/failed = list() - for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) - if(!length(spawnpoint.turfs)) + var/list/check_spawn_flags = list( + "SPAWN_FLAG_PRISONERS_CAN_SPAWN" = SPAWN_FLAG_PRISONERS_CAN_SPAWN, + "SPAWN_FLAG_JOBS_CAN_SPAWN" = SPAWN_FLAG_JOBS_CAN_SPAWN, + "SPAWN_FLAG_PERSISTENCE_CAN_SPAWN" = SPAWN_FLAG_PERSISTENCE_CAN_SPAWN + ) + + // Check that all flags are represented in compiled spawnpoints. + // The actual validation will happen at the end of the proc. + var/list/all_spawnpoints = decls_repository.get_decls_of_subtype(/decl/spawnpoint) + for(var/spawn_type in all_spawnpoints) + var/decl/spawnpoint/spawnpoint = all_spawnpoints[spawn_type] + // No turfs probably means it isn't mapped; if it's in the allowed list this will be picked up below. + if(!length(spawnpoint.get_spawn_turfs())) + continue + if(spawnpoint.spawn_flags) + for(var/spawn_flag in check_spawn_flags) + if(spawnpoint.spawn_flags & check_spawn_flags[spawn_flag]) + check_spawn_flags -= spawn_flag + if(!length(check_spawn_flags)) + break + + // Check if spawn points have any turfs at all associated. + for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_latejoin_spawns) + if(!length(spawnpoint.get_spawn_turfs())) log_unit_test("Map allows spawning in [spawnpoint.name], but [spawnpoint.name] has no associated spawn turfs.") failed += spawnpoint.type - if(length(failed)) - fail("Some allowed spawnpoints have no spawnpoint turfs:\n[jointext(failed, "\n")]") - else + // Validate our forced job spawnpoints since they may not be included in allowed_latejoin_spawns. + for(var/job_title in SSjobs.titles_to_datums) + var/datum/job/job = SSjobs.titles_to_datums[job_title] + if(!job.forced_spawnpoint) + continue + var/decl/spawnpoint/spawnpoint = GET_DECL(job.forced_spawnpoint) + if(!spawnpoint.check_job_spawning(job)) + log_unit_test("Forced spawnpoint for [job_title], [spawnpoint.name], does not permit the job to spawn there.") + failed += spawnpoint.type + if(!length(spawnpoint.get_spawn_turfs())) + log_unit_test("Job [job_title] forces spawning in [spawnpoint.name], but [spawnpoint.name] has no associated spawn turfs.") + failed += spawnpoint.type + + // Observer spawn is special and isn't in the using_map list. + var/decl/spawnpoint/observer_spawn = GET_DECL(/decl/spawnpoint/observer) + if(!length(observer_spawn.get_spawn_turfs())) + log_unit_test("Map has no [observer_spawn.name] spawn turfs.") + failed += observer_spawn.type + if(!(observer_spawn.spawn_flags & SPAWN_FLAG_GHOSTS_CAN_SPAWN)) + log_unit_test("[observer_spawn.name] is missing SPAWN_FLAG_GHOSTS_CAN_SPAWN.") + failed |= observer_spawn.type + + // Report test outcome. + if(!length(failed) && !length(check_spawn_flags)) pass("All allowed spawnpoints have spawnpoint turfs.") + else + var/list/failstring = list() + if(length(failed)) + failstring += "Some allowed spawnpoints have no spawnpoint turfs:\n[jointext(failed, "\n")]" + if(length(check_spawn_flags)) + failstring += "Some required spawn flags are not set on available spawnpoints:\n[jointext(check_spawn_flags, "\n")]" + fail(jointext(failstring, "\n")) return 1 //======================================================================================= @@ -395,7 +470,7 @@ pass = FALSE if(pass) - pass("Have cameras have the c_tag set.") + pass("All cameras have the c_tag set.") else fail("One or more cameras do not have the c_tag set.") @@ -688,6 +763,8 @@ continue if(is_type_in_list(sort, exempt_junctions)) continue + if(sort.sort_type in global.using_map.disconnected_disposals_tags) + continue var/obj/machinery/disposal/bin = get_bin_from_junction(sort) if(!bin) log_bad("Junction with tag [sort.sort_type] at ([sort.x], [sort.y], [sort.z]) could not find disposal.") @@ -719,6 +796,9 @@ var/datum/unit_test/networked_disposals_shall_deliver_tagged_packages/test speed = 100 +/obj/structure/disposalholder/unit_test/merge() + return FALSE + /obj/structure/disposalholder/unit_test/Destroy() test.package_delivered(src) . = ..() diff --git a/code/unit_tests/materials.dm b/code/unit_tests/materials.dm index 98bc05bc8bf..dcfbd4ed483 100644 --- a/code/unit_tests/materials.dm +++ b/code/unit_tests/materials.dm @@ -8,16 +8,23 @@ var/list/passed_designs = list() var/failed_count = 0 + var/list/stack_types = list( + null, + /obj/item/stack/material/strut, + /obj/item/stack/material/ore + ) + for(var/decl/material/mat_datum as anything in SSmaterials.materials) var/list/recipes = list() - for(var/thing in mat_datum.get_recipes()) - if(istype(thing, /datum/stack_recipe)) - recipes += thing - else if(istype(thing, /datum/stack_recipe_list)) - var/datum/stack_recipe_list/recipe_stack = thing - if(length(recipe_stack.recipes)) - recipes |= recipe_stack.recipes + for(var/stack_type in stack_types) + for(var/thing in mat_datum.get_recipes(stack_type)) + if(istype(thing, /datum/stack_recipe)) + recipes += thing + else if(istype(thing, /datum/stack_recipe_list)) + var/datum/stack_recipe_list/recipe_stack = thing + if(length(recipe_stack.recipes)) + recipes |= recipe_stack.recipes for(var/datum/stack_recipe/recipe as anything in recipes) var/obj/product = recipe.spawn_result() diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 9179e912557..4c34523b3ec 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -110,7 +110,7 @@ var/global/default_mobloc = null if(!loss && ishuman(M)) var/mob/living/carbon/human/H = M // Synthetics have robot limbs which don't report damage to getXXXLoss() if(H.isSynthetic()) // So we have to hard code this check or create a different one for them. - return H.species.total_health - H.health + return H.species.total_health - H.current_health return loss // ============================================================================================================== @@ -164,7 +164,7 @@ var/global/default_mobloc = null // Damage the mob - var/initial_health = H.health + var/initial_health = H.current_health if(damagetype == OXY && H.need_breathe()) var/obj/item/organ/internal/lungs/L = H.get_organ(H.get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -175,7 +175,7 @@ var/global/default_mobloc = null var/ending_damage = damage_check(H, damagetype) - var/ending_health = H.health + var/ending_health = H.current_health qdel(H) // Now test this stuff. diff --git a/code/unit_tests/movement_tests.dm b/code/unit_tests/movement_tests.dm index e5e7a74aa19..d86ee6585a7 100644 --- a/code/unit_tests/movement_tests.dm +++ b/code/unit_tests/movement_tests.dm @@ -50,15 +50,11 @@ /obj/test/crossed_obj var/list/crossers -/obj/test/crossed_obj/Crossed(var/crosser) - if(!crossers) - crossers = list() - crossers += crosser +/obj/test/crossed_obj/Crossed(var/atom/movable/AM) + LAZYADD(crossers, AM) /obj/test/entered_obj var/list/enterers /obj/test/entered_obj/Entered(var/enterer) - if(!enterers) - enterers = list() - enterers += enterer + LAZYADD(enterers, enterer) diff --git a/code/unit_tests/observation_tests.dm b/code/unit_tests/observation_tests.dm index 1ea0867030c..ae519cba6a7 100644 --- a/code/unit_tests/observation_tests.dm +++ b/code/unit_tests/observation_tests.dm @@ -97,7 +97,7 @@ old_name = O.name new_name = O.name + " (New)" - events_repository.register_global(/decl/observ/name_set, src, /datum/unit_test/observation/proc/receive_name_change) + events_repository.register_global(/decl/observ/name_set, src, TYPE_PROC_REF(/datum/unit_test/observation, receive_name_change)) O.SetName(new_name) if(received_name_set_events.len != 1) @@ -240,7 +240,7 @@ exosuit.occupant = holding_mob - events_repository.register(/decl/observ/moved, held_item, src, /datum/unit_test/observation/proc/receive_move) + events_repository.register(/decl/observ/moved, held_item, src, TYPE_PROC_REF(/datum/unit_test/observation, receive_move)) holding_mob.drop_from_inventory(held_item) if(received_moves.len != 1) @@ -320,7 +320,7 @@ var/turf/T = get_safe_turf() var/obj/O = get_named_instance(/obj, T) - events_repository.register_global(/decl/observ/name_set, O, /atom/movable/proc/move_to_turf) + events_repository.register_global(/decl/observ/name_set, O, TYPE_PROC_REF(/atom/movable, move_to_turf)) qdel(O) var/decl/observ/name_set/name_set_event = GET_DECL(/decl/observ/name_set) @@ -347,7 +347,7 @@ var/mob/event_source = get_named_instance(/mob, T, "Event Source") var/mob/listener = get_named_instance(/mob, T, "Event Listener") - events_repository.register(/decl/observ/moved, event_source, listener, /atom/movable/proc/recursive_move) + events_repository.register(/decl/observ/moved, event_source, listener, TYPE_PROC_REF(/atom/movable, recursive_move)) qdel(event_source) var/decl/observ/moved/moved_event = GET_DECL(/decl/observ/moved) @@ -375,7 +375,7 @@ var/mob/event_source = get_named_instance(/mob, T, "Event Source") var/mob/listener = get_named_instance(/mob, T, "Event Listener") - events_repository.register(/decl/observ/moved, event_source, listener, /atom/movable/proc/recursive_move) + events_repository.register(/decl/observ/moved, event_source, listener, TYPE_PROC_REF(/atom/movable, recursive_move)) qdel(listener) var/decl/observ/moved/moved_event = GET_DECL(/decl/observ/moved) diff --git a/code/unit_tests/offset_tests.dm b/code/unit_tests/offset_tests.dm new file mode 100644 index 00000000000..246a5fa3754 --- /dev/null +++ b/code/unit_tests/offset_tests.dm @@ -0,0 +1,92 @@ +/datum/unit_test/wall_objs_shall_face_proper_dir + name = "MAP: Wall mounted objects must face proper direction" + var/static/list/exception_types = list( + /obj/structure/sign/directions, // TODO: remove once directional/rotated subtypes have been created + /obj/structure/emergency_dispenser // these are just kind of fucked, i'll leave it to someone else to make the presets match the directional offsets + ) + +/datum/unit_test/wall_objs_shall_face_proper_dir/start_test() + var/bad_objs = 0 + for(var/obj/structure in world) // includes machinery, structures, and anchored items + if(QDELETED(structure)) + continue + if(!isStationLevel(structure.z)) + continue + if(is_type_in_list(structure, exception_types)) + continue + if(!structure.anchored) + continue + if(!isturf(structure.loc)) + continue + if(!length(structure.directional_offset)) // does not need to be offset + continue + var/list/diroff = cached_json_decode(structure.directional_offset) + var/list/curoff = diroff["[uppertext(dir2text(structure.dir))]"] + if(!curoff) // uh oh! + continue + // If the offset is unset or 0, it's allowed to be whatever. + // If it's nonzero, it must match the sign. + if( + (curoff["x"] && (SIGN(curoff["x"]) != SIGN(structure.pixel_x))) || \ + (curoff["y"] && (SIGN(curoff["y"]) != SIGN(structure.pixel_y))) + ) + bad_objs++ + log_bad("Incorrect offset direction: [log_info_line(structure)]") + continue + + if(bad_objs) + fail("Found [bad_objs] wall-mounted object\s with incorrect directions") + else + pass("All wall-mounted objects have correct directions") + return TRUE + +/datum/unit_test/wall_objs_shall_offset_onto_wall + name = "MAP: Wall mounted objects must offset over walls" + var/static/list/exception_types = list( + /obj/machinery/light, + /obj/machinery/camera, + /obj/structure/lift/button/standalone + ) + +/datum/unit_test/wall_objs_shall_offset_onto_wall/start_test() + var/bad_objs = 0 + for(var/obj/structure in world) // includes machinery, structures, and anchored items + if(QDELETED(structure)) + continue + if(!isStationLevel(structure.z)) + continue + if(is_type_in_list(structure, exception_types)) + continue + if(!structure.anchored) + continue + if(!isturf(structure.loc)) + continue + if(!length(structure.directional_offset)) // does not need to be offset + continue + var/list/diroff = cached_json_decode(structure.directional_offset) + var/list/curoff = diroff["[uppertext(dir2text(structure.dir))]"] + if(!curoff) // structure is not offset in this dir at all + continue + if(structure.loc.density) + bad_objs++ + log_bad("Wall-mounted object on dense turf: [log_info_line(structure)]") + continue + var/adj_x = structure.x + (abs(structure.pixel_x) > 12 ? SIGN(structure.pixel_x) : 0) + var/adj_y = structure.y + (abs(structure.pixel_y) > 12 ? SIGN(structure.pixel_y) : 0) + var/turf/adjusted_loc = locate(adj_x, adj_y, structure.z) + if(!adjusted_loc.density) + var/found_support = FALSE + for(var/obj/structure/S in adjusted_loc) + if(!S.density) // this will be way too forgiving with windows since it doesn't take into account directionality + continue + found_support = TRUE + if(found_support) + continue + bad_objs++ + log_bad("Offset turf did not have a wall or window: [log_info_line(structure)]") + + if(bad_objs) + fail("Found [bad_objs] wall-mounted object\s without a wall or window") + else + pass("All wall-mounted objects are on appropriate walls/windows") + return TRUE \ No newline at end of file diff --git a/code/unit_tests/proximity_tests.dm b/code/unit_tests/proximity_tests.dm index ef196a9b7a8..e9d9729c182 100644 --- a/code/unit_tests/proximity_tests.dm +++ b/code/unit_tests/proximity_tests.dm @@ -133,7 +133,7 @@ /obj/proximity_listener/proc/SetTrigger(trigger_type, listener_flags) QDEL_NULL(trigger) - trigger = new trigger_type(src, /obj/proximity_listener/proc/OnTurfEntered, /obj/proximity_listener/proc/OnTurfsChanged, 7, listener_flags, null, 90, 270) + trigger = new trigger_type(src, TYPE_PROC_REF(/obj/proximity_listener, OnTurfEntered), TYPE_PROC_REF(/obj/proximity_listener, OnTurfsChanged), 7, listener_flags, null, 90, 270) trigger.register_turfs() /obj/proximity_listener/Destroy() diff --git a/code/unit_tests/traders.dm b/code/unit_tests/traders.dm new file mode 100644 index 00000000000..e0555988530 --- /dev/null +++ b/code/unit_tests/traders.dm @@ -0,0 +1,118 @@ +/datum/unit_test/trader_subtypes_shall_have_all_needed_speech_values + name = "TRADERS: Trader Subtypes Shall Have All Needed Speech Values" + // Every trader must have these tokens defined. + var/list/all_trader_speech_tokens = list( + TRADER_HAIL_GENERIC, + TRADER_HAIL_DENY, + TRADER_NOT_ENOUGH, + TRADER_TRADE_COMPLETE, + TRADER_HOW_MUCH, + TRADER_COMPLIMENT_DENY, + TRADER_COMPLIMENT_ACCEPT, + TRADER_INSULT_GOOD, + TRADER_INSULT_BAD, + TRADER_BRIBE_REFUSAL + ) + // These tokens are situational and cannot be present if a given flag is on the datum. + var/list/tokens_invalid_with_flag = list( + TRADER_NO_MONEY = TRADER_MONEY, + TRADER_NO_GOODS = TRADER_GOODS + ) + // As above but only present with a flag. + var/list/tokens_invalid_without_flag = list( + TRADER_FOUND_UNWANTED = (TRADER_WANTED_ONLY|TRADER_WANTED_ALL), + TRADER_BRIBE_ACCEPT = TRADER_BRIBABLE + ) + // We don't care if these tokens are in the list after the above tokens are weeded out. + var/list/acceptable_additional_tokens = list( + // This will default to generic if unset, doesn't matter. + TRADER_HAIL_SILICON, + // This token can be used to respond 'I don't want anything' which is valid. + TRADER_WHAT_WANT, + // This token has bespoke validity checking and can't go into any of the above lists. + TRADER_NO_BLACKLISTED + ) + +/datum/unit_test/trader_subtypes_shall_have_all_needed_speech_values/start_test() + + // Flagged tokens are handled outside of the general extraneous token list. + for(var/token in tokens_invalid_with_flag) + acceptable_additional_tokens |= token + for(var/token in tokens_invalid_without_flag) + acceptable_additional_tokens |= token + + // Custom species hails are fine and have no strict tokens associated. + var/list/all_species = decls_repository.get_decls_of_subtype(/decl/species) + for(var/species_type in all_species) + var/decl/species/species = all_species[species_type] + acceptable_additional_tokens |= "[TRADER_HAIL_START][species.name]" + + var/list/failures = list() + for(var/trader_type in subtypesof(/datum/trader)) + var/datum/trader/trader = trader_type + if(TYPE_IS_ABSTRACT(trader)) + continue + trader = new trader + + if(trader.name_language && !ispath(trader.name_language, /decl/language)) + LAZYDISTINCTADD(failures[trader_type], "- non-/decl/language-subtype non-null name_language value") + + var/list/check_tokens = list() + + // Bespoke blacklist check because life is pain. + var/has_token = (TRADER_NO_BLACKLISTED in trader.speech) + var/has_blacklist = length(trader.blacklisted_trade_items) + if(has_token && !has_blacklist) + LAZYDISTINCTADD(failures[trader_type], "- '[TRADER_NO_BLACKLISTED]' response is set but blacklisted_trade_items is empty") + else if(!has_token && has_blacklist) + LAZYDISTINCTADD(failures[trader_type], "- '[TRADER_NO_BLACKLISTED]' response is unset but blacklisted_trade_items is populated") + + for(var/token in trader.speech) + + // Simple validity checks. + if(token in check_tokens) + LAZYDISTINCTADD(failures[trader_type], "- duplicate speech token '[token]'") + if(!istext(trader.speech[token])) + LAZYDISTINCTADD(failures[trader_type], "- non-text speech value for token '[token]'") + + // Keep track of non-additional tokens seen so we can validate them against the general token list later. + if(!(token in acceptable_additional_tokens)) + check_tokens |= token + + // Check for tokens that are contraindicated by trade flags. + for(var/token in tokens_invalid_with_flag) + var/has_flag = (trader.trade_flags & tokens_invalid_with_flag[token]) + has_token = (token in trader.speech) + if(has_token && has_flag) + LAZYDISTINCTADD(failures[trader_type], "- cannot have flagged token '[token]' with current trade flags") + else if(!has_token && !has_flag) + LAZYDISTINCTADD(failures[trader_type], "- missing flagged token '[token]'") + + // Check for tokens that are required by trade flags. + for(var/token in tokens_invalid_without_flag) + var/has_flag = (trader.trade_flags & tokens_invalid_without_flag[token]) + has_token = (token in trader.speech) + if(has_token && !has_flag) + LAZYDISTINCTADD(failures[trader_type], "- cannot have flagged token '[token]' with current trade flags") + else if(!has_token && has_flag) + LAZYDISTINCTADD(failures[trader_type], "- missing flagged token '[token]'") + + // Check for missing generic tokens. + for(var/token in all_trader_speech_tokens) + if(!(token in trader.speech)) + LAZYDISTINCTADD(failures[trader_type], "- missing speech value for token '[token]'") + check_tokens -= token + + // Check for extraneous (probably malformed) tokens not caught by the above checks. + if(length(check_tokens)) + LAZYDISTINCTADD(failures[trader_type], "- extraneous or incorrect tokens: [english_list(check_tokens)]") + + if(length(failures)) + var/list/fail_strings = list() + for(var/failed_type in failures) + fail_strings += "[failed_type]:\n[jointext(failures[failed_type], "\n")]" + fail("[length(failures)] trader datum subtypes have issues:\n[jointext(fail_strings, "\n")]") + else + pass("All trader datum subtypes had valid speech tokens and values.") + + return 1 \ No newline at end of file diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 89a85254d1e..12d8fb5217f 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -209,7 +209,7 @@ return TRUE /datum/unit_test/aspects_shall_have_unique_names - name = "ASPECTS: All Aspects Shall Have Unique Names" + name = "UNIQUENESS: All Aspects Shall Have Unique Names" /datum/unit_test/aspects_shall_have_unique_names/start_test() var/list/aspects_by_name = list() @@ -229,7 +229,7 @@ return 1 /datum/unit_test/submaps_shall_have_a_unique_descriptor - name = "SUBMAPS: Archetypes shall have a valid, unique descriptor." + name = "UNIQUENESS: Archetypes shall have a valid, unique descriptor." /datum/unit_test/submaps_shall_have_a_unique_descriptor/start_test() var/list/submaps_by_name = list() @@ -271,3 +271,29 @@ for(var/entry in entries) pretty_print += log_info_line(entry) priv_print(ut, type, key, jointext(pretty_print, "\n")) + +/datum/unit_test/holopad_id_uniqueness + name = "UNIQUENESS: Holopads Shall Have Unique Valid IDs" + +/datum/unit_test/holopad_id_uniqueness/start_test() + + var/list/failures = list() + + var/list/seen_holopad_ids = list() + for(var/obj/machinery/hologram/holopad/holopad in global.holopads) + var/area/area = get_area(holopad) + var/holopad_loc = "x[holopad.x],y[holopad.y],z[holopad.z] - [area?.proper_name || "Unknown"]" + if(istext(holopad.holopad_id)) + LAZYDISTINCTADD(seen_holopad_ids[holopad.holopad_id], holopad_loc) + else + failures += "[holopad_loc] - null or non-text holopad_id ([isnull(holopad.holopad_id) ? "NULL" : holopad.holopad_id])" + + for(var/holopad_id in seen_holopad_ids) + if(length(seen_holopad_ids[holopad_id]) > 1) + failures += "overlapping holopad_id ([holopad_id]) - [jointext(seen_holopad_ids[holopad_id], ", ")]" + + if(length(failures)) + fail("Some holopads had overlapping or invalid ID values:\n[jointext(failures,"\n")]") + else + pass("All holopads had unique valid ID values.") + return 1 diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index f23f690b8b9..ac232116fb8 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -151,14 +151,6 @@ var/global/ascii_reset = "[ascii_esc]\[0m" /datum/unit_test/proc/subsystems_to_await() return list() -/proc/load_unit_test_changes() -/* - //This takes about 60 seconds to run during unit testing and is only used for the ZAS vacume check on The Asteroid. - if(config.roundstart_level_generation != 1) - log_unit_test("Overiding Configuration option for Asteroid Generation to ENABLED") - config.roundstart_level_generation = 1 // The default map requires it, the example config doesn't have this enabled. - */ - /proc/get_test_datums() . = list() for(var/test in subtypesof(/datum/unit_test)) diff --git a/config/example/config.txt b/config/example/config.txt deleted file mode 100644 index f7edfa0499e..00000000000 --- a/config/example/config.txt +++ /dev/null @@ -1,464 +0,0 @@ -## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice -# SERVERNAME spacestation13 - -## Hub visibility: If you want to be visible on the hub, uncomment the below line and be sure that Dream Daemon is set to "Visible." This can be changed in-round as well with toggle-hub-visibility if Dream Daemon is set correctly. -# HUB - -## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. -ADMIN_LEGACY_SYSTEM - -## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. -BAN_LEGACY_SYSTEM - -## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. -JOBS_HAVE_MINIMAL_ACCESS - -## Uncomment this and set it to a file path relative to the executing binary to prefix all custom item icon locations with this location ie. '[CUSTOM_ITEM_ICON_LOCATION]/[custom item icon path value]' -# CUSTOM_ITEM_ICON_LOCATION config/custom_items/icons - -## Uncomment this and set it to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '[CUSTOM_ICON_ICON_LOCATION]/[custom icon path value]' -# CUSTOM_ICON_ICON_LOCATION config/custom_icons/icons - -## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing -## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. -## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. -## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means -## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. -#USE_AGE_RESTRICTION_FOR_JOBS - -## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. -## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. -#USE_AGE_RESTRICTION_FOR_ANTAGS - -## Unhash this to use iterative explosions, keep it hashed to use circle explosions. -#USE_ITERATIVE_EXPLOSIONS - -# The power of explosion required for it to cross Z-levels. -#EXPLOSION_Z_THRESHOLD 10 - -# What to multiply power by when crossing Z-levels. -#EXPLOSION_Z_MULT 0.75 - -## Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT -# RADIATION_LOWER_LIMIT 0.35 - -## log OOC channel -LOG_OOC - -## log client Say -LOG_SAY - -## log admin actions -LOG_ADMIN - -## log client access (logon/logoff) -LOG_ACCESS - -## log game actions (start of round, results, etc.) -LOG_GAME - -## log player votes -LOG_VOTE - -## log client Whisper -LOG_WHISPER - -## log emotes -LOG_EMOTE - -## log attack messages -LOG_ATTACK - -## log pda messages -LOG_PDA - -## log world.log messages -# LOG_WORLD_OUTPUT - -## log all Topic() calls (for use by coders in tracking down Topic issues) -# LOG_HREFS - -## log world.log and runtime errors to a file -# LOG_RUNTIME - -## log admin warning messages -##LOG_ADMINWARN ## Also duplicates a bunch of other messages. - -## disconnect players who did nothing during the set amount of minutes -# KICK_INACTIVE 10 - -## Chooses whether mods have the ability to tempban or not -MODS_CAN_TEMPBAN - -## Chooses whether mods have the ability to issue tempbans for jobs or not -MODS_CAN_JOB_TEMPBAN - -## Maximum mod tempban duration (in minutes) -MOD_TEMPBAN_MAX 1440 - -## Maximum mod job tempban duration (in minutes) -MOD_JOB_TEMPBAN_MAX 1440 - - -## probablities for game modes chosen in "secret" and "random" modes -## -## default probablity is 1, increase to make that mode more likely to be picked -## set to 0 to disable that mode -PROBABILITY EXTENDED 1 -PROBABILITY MALFUNCTION 1 -PROBABILITY MERCENARY 1 -PROBABILITY WIZARD 1 -PROBABILITY CHANGELING 1 -PROBABILITY CULT 1 -PROBABILITY EXTEND-A-TRAITORMONGOUS 6 - -## if possible round types will be hidden from players for secret rounds -#SECRET_HIDE_POSSIBILITIES - -## Hash out to disable random events during the round. -ALLOW_RANDOM_EVENTS - -## if amount of traitors scales or not -TRAITOR_SCALING - -## if objectives are disabled -#OBJECTIVES_DISABLED - -## make ERT's be only called by admins -#ERT_ADMIN_ONLY - -## If uncommented, votes can be called to add extra antags to the round. -#ALLOW_EXTRA_ANTAGS - -## If security is prohibited from being most antagonists -#PROTECT_ROLES_FROM_ANTAGONIST - -## Comment this out to stop admins being able to choose their personal ooccolor -ALLOW_ADMIN_OOCCOLOR - -## allow players to initiate a restart vote -ALLOW_VOTE_RESTART - -## allow players to initate a mode-change start -ALLOW_VOTE_MODE - -## min delay (deciseconds) between voting sessions (default 10 minutes) -VOTE_DELAY 6000 - -## time period (deciseconds) which voting session will last (default 1 minute) -VOTE_PERIOD 600 - -## autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes) -VOTE_AUTOTRANSFER_INITIAL 108000 - -##autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes) -VOTE_AUTOTRANSFER_INTERVAL 18000 - -## Time left (seconds) before round start when automatic gamemote vote is called (default 160). -VOTE_AUTOGAMEMODE_TIMELEFT 160 - -## prevents dead players from voting or starting votes -#NO_DEAD_VOTE - -## Prevents players not in-round from voting on crew transfer votes. -#NO_DEAD_VOTE_CREW_TRANSFER - -## players' votes default to "No vote" (otherwise, default to "No change") -DEFAULT_NO_VOTE - -## Allow ghosts to see antagonist through AntagHUD -ALLOW_ANTAG_HUD - -## If ghosts use antagHUD they are no longer allowed to join the round. -ANTAG_HUD_RESTRICTED - -## allow AI job -ALLOW_AI - -## disable abandon mob -# NORESPAWN - -## disables calling del(src) on newmobs if they logout before spawnin in -# DONT_DEL_NEWMOB - -## set a hosted by name for unix platforms -HOSTEDBY yournamehere - -## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Set to 1 to jobban them from those positions, set to 0 to allow them. -GUEST_JOBBAN - -## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) -GUEST_BAN -## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans) -# USEWHITELIST - -## set a server location for world reboot. Don't include the byond://, just give the address and port. -#SERVER server.net:port - -## set a server URL for the IRC bot to use; like SERVER, don't include the byond:// -## Unlike SERVER, this one shouldn't break auto-reconnect -#SERVERURL server.net:port - -## forum address -# FORUMURL http://example.com - -## discord server permanent invite address -# DISCORDURL https://discord.gg/example - -## Wiki address -# WIKIURL http://example.com - -## GitHub address -# GITHUBURL https://github.com/example-user/example-repository - -## GitHub new issue address -# ISSUEREPORTURL https://github.com/example-user/example-repository/issues/new - -## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -# BANAPPEALS http://example.com - -## In-game features -## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard -# FEATURE_OBJECT_SPELL_SYSTEM - -##Toggle for having jobs load up from the .txt -# LOAD_JOBS_FROM_TXT - -##Remove the # mark infront of this to forbid admins from posssessing the singularity. -#FORBID_SINGULO_POSSESSION - -## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. -## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) -#POPUP_ADMIN_PM - -## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR -ALLOW_HOLIDAYS - -##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. -TICKLAG 0.7 - -##Defines world FPS. Defaults to 20. -# FPS 20 - -## Whether the server will talk to other processes through socket_talk -SOCKET_TALK 0 - -## Comment this out to disable automuting -#AUTOMUTE_ON - -## How long the delay is before the Away Mission gate opens. Default is half an hour. -GATEWAY_DELAY 18000 - -## Remove the # to give assistants maint access. -#ASSISTANT_MAINT - -## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. -## Malf and Rev will let the shuttle be called when the antags/protags are dead. -#CONTINUOUS_ROUNDS - -## Uncomment to restrict non-admins from using humanoid alien races -USEALIENWHITELIST -## Uncomment to use the alien whitelist system with SQL instead. (requires the above uncommented aswell) -#USEALIENWHITELIST_SQL - -## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player. -#ALIEN_PLAYER_RATIO 0.2 -##Remove the # to let ghosts spin chairs -#GHOST_INTERACTION - -## Password used for authorizing ircbot and other external tools. -#COMMS_PASSWORD - -## Password used for authorizing external tools that can apply bans -#BAN_COMMS_PASSWORD - -## BYOND builds that will result the client using them to be banned. -#FORBIDDEN_VERSIONS 512.0001;512.0002 - -## Export address where external tools that monitor logins are located -#LOGIN_EXPORT_ADDR - -## Uncomment to enable sending data to the IRC bot. -#USE_IRC_BOT - -## Host where the IRC bot is hosted. Port 45678 needs to be open. -#IRC_BOT_HOST localhost - -## IRC channel to send information to. Leave blank to disable. -#MAIN_IRC #main - -## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. -#ADMIN_IRC #admin - -## Uncommen to allow ghosts to write in blood during Cult rounds. -ALLOW_CULT_GHOSTWRITER - -## Sets the minimum number of cultists needed for ghosts to write in blood. -REQ_CULT_GHOSTWRITER 6 - -## Sets the number of available character slots -CHARACTER_SLOTS 10 - -## Sets the number of loadout slots per character -LOADOUT_SLOTS 3 - -## Expected round length in minutes -EXPECTED_ROUND_LENGTH 180 - -## The lower delay between events in minutes. -## Affect mundane, moderate, and major events respectively -EVENT_DELAY_LOWER 10;30;50 - -## The upper delay between events in minutes. -## Affect mundane, moderate, and major events respectively -EVENT_DELAY_UPPER 15;45;70 - -## The delay until the first time an event of the given severity runs in minutes. -## Unset setting use the EVENT_DELAY_LOWER and EVENT_DELAY_UPPER values instead. -# EVENT_CUSTOM_START_MINOR 10;15 -# EVENT_CUSTOM_START_MODERATE 30;45 -EVENT_CUSTOM_START_MAJOR 80;100 - -## Uncomment to make proccall require R_ADMIN instead of R_DEBUG -## designed for environments where you have testers but don't want them -## able to use the more powerful debug options. -#DEBUG_PARANOID - -## Uncomment to allow aliens to spawn. -#ALIENS_ALLOWED - -## Uncomment to allow alien xenomorph queens to lay eggs. -#ALIEN_EGGS_ALLOWED - -## Uncomment to allow xenos to spawn. -#NINJAS_ALLOWED - -## Uncomment to disable the restrictive weldervision overlay. -#DISABLE_WELDER_VISION - -## Uncomment to prevent anyone from joining the round by default. -#DISABLE_ENTRY - -## Uncomment to disable the OOC channel by default. -#DISABLE_OOC - -## Uncomment to disable the LOOC channel by default. -#DISABLE_LOOC - -## Uncomment to disable the dead OOC channel by default. -#DISABLE_DEAD_OOC - -## Uncomment to disable the AOOC channel by default. -#DISABLE_AOOC - -## Uncomment to disable ghost chat by default. -#DISABLE_DSAY - -## Uncomment to disable respawning by default. -#DISABLE_RESPAWN - -## Respawn delay in minutes before one may respawn as a crew member. -#RESPAWN_DELAY 30 - -## Percentile strength of exterior ambient light (such as starlight). 0.5 is 50% lit. -EXTERIOR_AMBIENT_LIGHT 0 - - -## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. -# LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010 - - -## Enable/Disable random level generation. Will behave strangely if turned off with a map that expects it on. -#ROUNDSTART_LEVEL_GENERATION 1 - -## Uncomment to enable organ decay outside of a body or storage item. -#ORGANS_CAN_DECAY - -## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog -#AGGRESSIVE_CHANGELOG - -## Uncomment to make Discord webhooks send in plaintext rather than as embeds. -# DISABLE_WEBHOOK_EMBEDS - -## Uncomment to override default brain health. -#DEFAULT_BRAIN_HEALTH 400 - -## Uncomment this line to announce shuttle dock announcements to the main IRC channel, if MAIN_IRC has also been setup. -# ANNOUNCE_SHUTTLE_DOCK_TO_IRC - -## Uncomment to enable map voting; you'll need to use the script at tools/server.sh or an equivalent for it to take effect -## You'll also likely need to enable WAIT_FOR_SIGUSR1 below -# MAP_SWITCHING - -## Uncomment to enable an automatic map vote and switch at end of round. MAP_SWITCHING must also be enabled. -# AUTO_MAP_VOTE - -## Uncomment to make Dream Daemon refuse to reboot for any reason other than SIGUSR1 -# WAIT_FOR_SIGUSR1 - -## Uncomment to enable auto-stealthing staff who are AFK for more than specified minutes -# AUTOSTEALTH 30 - -## Set to 0/1 to disable/enable automatic admin rights for users connecting from the host the server is running on. -AUTO_LOCAL_ADMIN 0 - -## How many loadout points are available. Use 0 to disable loadout, and any negative number to indicate infinite points. -MAX_GEAR_COST 10 - -## How much radiation levels self-reduce by each tick. -RADIATION_DECAY_RATE 1 - -## The amount of radiation resistance on a turf is multiplied by this value -RADIATION_RESISTANCE_MULTIPLIER 1.25 - -## General material radiation resistance is divided by this value -RADIATION_MATERIAL_RESISTANCE_DIVISOR 2 - -## Below this point, radiation is ignored -RADIATION_LOWER_LIMIT 0.15 - -## Uncomment this to prevent players from printing copy/pasted circuits -#DISABLE_CIRCUIT_PRINTING - -## Uncomment this to allow admins to narrate using HTML tags -#ALLOW_UNSAFE_NARRATES - -## Uncomment this to DISABLE action spam kicking. Not recommended; this helps protect from spam attacks. -#DO_NOT_PREVENT_SPAM - -## Uncomment this to modify the length of the spam kicking interval in seconds. -#ACT_INTERVAL 0.1 - -## Uncomment this to modify the number of actions permitted per interval before being kicked for spam. -#MAX_ACTS_PER_INTERVAL 140 - -## Is the panic bunker currently on by default. -#PANIC_BUNKER - -## A message when user did not pass the panic bunker. -#PANIC_BUNKER_MESSAGE Sorry! The panic bunker is enabled. Please head to our Discord or forum to get yourself added to the panic bunker bypass. - -##Clients will be unable to connect unless their version is equal to or higher than this (a number, e.g. 511) -#MINIMUM_BYOND_VERSION - -## Clients will be unable to connect unless their build is equal to or higher than this (a number, e.g. 1000) -#MINIMUM_BYOND_BUILD - -## Direct clients to preload the server resource file from a URL pointing to a .rsc file. NOTE: At this time (byond 512), -## the client/resource_rsc var does not function as one would expect. See client_defines.dm, the "preload_rsc" var's -## comments on how to use it properly. If you use a resource URL, you must set preload_rsc to 0 at compile time or -## clients will still download from the server *too*. This will randomly select one URL if more than one is provided. -## Spaces are prohibited in each URL by spec, you must use encoded spaces. -#RESOURCE_URLS URL URL2 URL3 - -## Whether or not to make localhost immune to throttling. -## Localhost will still be throttled internally; it just won't be affected by it. -#NO_THROTTLE_LOCALHOST - -## Uncomment this to enable expanded alt interactions with objects. -#EXPANDED_ALT_INTERACTIONS - -## Uncomment this to show a typing indicator for people writing whispers. -#SHOW_TYPING_INDICATOR_FOR_WHISPERS diff --git a/config/example/configuration.txt b/config/example/configuration.txt new file mode 100644 index 00000000000..da635a98386 --- /dev/null +++ b/config/example/configuration.txt @@ -0,0 +1,624 @@ +## +# ADMIN +# Configuration options relating to administration. +## + +## Allows admin jumping. +#ALLOW_ADMIN_JUMP 1 + +## Comment this out to stop admins being able to choose their personal OOC color. Uncomment to enable. +#ALLOW_ADMIN_OOCCOLOR + +## Allows admin revives. +#ALLOW_ADMIN_REV 1 + +## Allows admin item spawning. +#ALLOW_ADMIN_SPAWNING 1 + +## Uncomment this to allow admins to narrate using HTML tags. Uncomment to enable. +#ALLOW_UNSAFE_NARRATES + +## Uncomment to enable auto-stealthing staff who are AFK for more than specified minutes. +#AUTOSTEALTH 0 + +## Set to 0/1 to disable/enable automatic admin rights for users connecting from the host the server is running on. +#AUTO_LOCAL_ADMIN 1 + +## Set to jobban 'Guest-' accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Set to 1 to jobban them from those positions, set to 0 to allow them. +#GUEST_JOBBAN 1 + +## Chooses whether mods have the ability to issue tempbans for jobs or not. Uncomment to enable. +#MODS_CAN_JOB_TEMPBAN + +## Chooses whether mods have the ability to tempban or not. Uncomment to enable. +#MODS_CAN_TEMPBAN + +## Maximum mod job tempban duration (in minutes). +#MOD_JOB_TEMPBAN_MAX 1440 + +## Maximum mod tempban duration (in minutes). +#MOD_TEMPBAN_MAX 1440 + +## +# DEBUG +# Configuration options relating to error reporting. +## + +## Uncomment to make proccall require R_ADMIN instead of R_DEBUG +## designed for environments where you have testers but don't want them +## able to use the more powerful debug options. +## Uncomment to enable. +#DEBUG_PARANOID + +## The "cooldown" time for each occurrence of a unique error. +#ERROR_COOLDOWN 600 + +## How many occurrences before the next will silence them. +#ERROR_LIMIT 50 + +## How long to wait between messaging admins about occurrences of a unique error. +#ERROR_MSG_DELAY 50 + +## How long a unique error will be silenced for. +#ERROR_SILENCE_TIME 6000 + +## +# EVENTS +# Configuration options relating to event timers and probabilities. +## + +## Hash out to disable random events during the round. Uncomment to enable. +#ALLOW_RANDOM_EVENTS + +## The lower delay between events in minutes. +## Affect mundane, moderate, and major events respectively. +#EVENT_DELAY_LOWER [10,30,50] + +## The upper delay between events in minutes. +## Affect mundane, moderate, and major events respectively. +#EVENT_DELAY_UPPER [15,45,70] + +## If the first delay has a custom start time. Defined in minutes. +#EVENT_FIRST_RUN [null,null,{"lower":80,"upper":100}] + +## Determines if objectives are disabled. +#OBJECTIVES_DISABLED 2 + +## +# GAME OPTIONS +# Configuration options relating to gameplay, such as movement, health and stamina. +## + +## Uncomment this to modify the length of the spam kicking interval in seconds. +#ACT_INTERVAL 0.1 + +## Remove the # to let aliens spawn. Uncomment to enable. +#ALIENS_ALLOWED + +## Allow multiple input keys to be pressed for diagonal movement. Uncomment to enable. +#ALLOW_DIAGONAL_MOVEMENT + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +#ANIMAL_DELAY 0 + +## Remove the # to give assistants maint access. Uncomment to enable. +#ASSISTANT_MAINT + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +#CREEP_DELAY 6 + +## The effectiveness of default darksight if above is uncommented. +#DEFAULT_DARKSIGHT_EFFECTIVENESS 0.05 + +## The range of default darksight if above is uncommented. +#DEFAULT_DARKSIGHT_RANGE 2 + +## Threshold of where brain damage begins to affect dexterity (70 brainloss above this means zero dexterity). Default is 30. +#DEX_MALUS_BRAINLOSS_THRESHOLD 30 + +## Restricted ERT to be only called by admins. Uncomment to enable. +#ERT_ADMIN_CALL_ONLY + +## Uncomment this to enable expanded alt interactions with objects. Uncomment to enable. +#EXPANDED_ALT_INTERACTIONS + +## Expected round length in hours. +#EXPECTED_ROUND_LENGTH 3 + +## Uncomment to allow ghosts to possess any animal. Uncomment to enable. +#GHOSTS_CAN_POSSESS_ANIMALS + +## Remove the # to let ghosts spin chairs. Uncomment to enable. +#GHOST_INTERACTION + +## Set this to 0 for perfectly smooth movement gliding, or 1 or more for delayed chess move style movements. +#GLIDE_SIZE_DELAY 1 + +## Whether or not all human mobs have very basic darksight by default. Uncomment to enable. +#GRANT_DEFAULT_DARKSIGHT + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +#HUMAN_DELAY 0 + +## Maximum stamina recovered per tick when resting. +#MAXIMUM_STAMINA_RECOVERY 3 + +## Uncomment this to modify the number of actions permitted per interval before being kicked for spam. +#MAX_ACTS_PER_INTERVAL 140 + +## How many loadout points are available. Use 0 to disable loadout, and any negative number to indicate infinite points. +#MAX_GEAR_COST 10 + +## Value used for expending stamina during sprinting. +#MINIMUM_SPRINT_COST 0.8 + +## Minimum stamina recovered per tick when resting. +#MINIMUM_STAMINA_RECOVERY 1 + +## Remove the # to let ninjas spawn. Uncomment to enable. +#NINJAS_ALLOWED + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +#ROBOT_DELAY 0 + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +#RUN_DELAY 2 + +## Determines the severity of athletics skill when applied to stamina cost. +#SKILL_SPRINT_COST_RANGE 0.8 + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +#WALK_DELAY 4 + +## +# GAME WORLD +# Configuration options relating to the game world and simulation. +## + +## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR Uncomment to enable. +#ALLOW_HOLIDAYS + +## Uncomment this to prevent players from printing copy/pasted circuits. +#ALLOW_IC_PRINTING 1 + +## Uncomment to allow ghosts to write in blood during Cult rounds. +#CULT_GHOSTWRITER 1 + +## The maximum duration of an exoplanet day, in minutes. +#EXOPLANET_MAX_DAY_DURATION 40 + +## The minimum duration of an exoplanet day, in minutes. +#EXOPLANET_MIN_DAY_DURATION 10 + +## Percentile strength of exterior ambient light (such as starlight). 0.5 is 50% lit. +#EXTERIOR_AMBIENT_LIGHT 0 + +## How long the delay is before the Away Mission gate opens. Default is half an hour. +#GATEWAY_DELAY 18000 + +## Humans are forced to have surnames if this is uncommented. Uncomment to enable. +#HUMANS_NEED_SURNAMES + +## What to multiply power by when crossing Z-levels. +#ITERATIVE_EXPLOSIVES_Z_MULTIPLIER 0.75 + +## The power of explosion required for it to cross Z-levels. +#ITERATIVE_EXPLOSIVES_Z_THRESHOLD 10 + +## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. +#LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010 + +## After this amount alive, walking mushrooms spawned from botany will not reproduce. +#MAXIMUM_MUSHROOMS 15 + +## How much radiation levels self-reduce by each tick. +#RADIATION_DECAY_RATE 1 + +## Below this point, radiation is ignored. +## Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. +## Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +#RADIATION_LOWER_LIMIT 0.15 + +## General material radiation resistance is divided by this value. +#RADIATION_MATERIAL_RESISTANCE_DIVISOR 2 + +## The amount of radiation resistance on a turf is multiplied by this value. +#RADIATION_RESISTANCE_MULTIPLIER 1.25 + +## Enable/Disable random level generation. Will behave strangely if turned off with a map that expects it on. Uncomment to enable. +#ROUNDSTART_LEVEL_GENERATION + +## Unhash this to use iterative explosions, keep it hashed to use circle explosions. Uncomment to enable. +#USE_ITERATIVE_EXPLOSIONS + +## Uncomment to disable the restrictive weldervision overlay. +#WELDER_VISION 1 + +## +# HEALTH +# Configuration options relating to the health simulation. +## + +## Determines whether bones can be broken through excessive damage to the organ. +## 0 means bones can't break, 1 means they can. +#BONES_CAN_BREAK 1 + +## Level of health at which a mob becomes dead. +#HEALTH_THRESHOLD_DEAD -100 + +## Determines whether limbs can be amputated through excessive damage to the organ. +## 0 means limbs can't be amputated, 1 means they can. +#LIMBS_CAN_BREAK 1 + +## Percentage multiplier that influences how damage spreads around organs. 100 means normal, 50 means half. +#ORGAN_DAMAGE_SPILLOVER_MULTIPLIER 0.5 + +## Percentage multiplier which enables organs to take more damage before bones breaking or limbs being destroyed. +#ORGAN_HEALTH_MULTIPLIER 0.9 + +## Percentage multiplier which influences how fast organs regenerate naturally. +#ORGAN_REGENERATION_MULTIPLIER 0.25 + +## Amount of time (in hundredths of seconds) for which a brain retains the 'spark of life' after the person's death (set to -1 for infinite). +#REVIVAL_BRAIN_LIFE -1 + +## A multiplier for the impact stress has on blood regeneration, as above. +#STRESS_BLOOD_RECOVERY_CONSTANT 0.3 + +## A multiplier for the impact stress has on wound passive healing, as above. +#STRESS_HEALING_RECOVERY_CONSTANT 0.3 + +## A multiplier for the impact stress has on shock recovery - 0.3 means maximum stress imposes a 30% penalty on shock recovery. +#STRESS_SHOCK_RECOVERY_CONSTANT 0.5 + +## +# LOGGING +# Configuration options relating to logging. +## + +## log client access (logon/logoff) Uncomment to enable. +#LOG_ACCESS + +## log admin actions Uncomment to enable. +#LOG_ADMIN + +## log admin chat Uncomment to enable. +#LOG_ADMINCHAT + +## Log admin warning messages. Also duplicates a bunch of other messages. Uncomment to enable. +#LOG_ADMINWARN + +## log attack messages Uncomment to enable. +#LOG_ATTACK + +## log debug output Uncomment to enable. +#LOG_DEBUG + +## log emotes Uncomment to enable. +#LOG_EMOTE + +## log game actions (start of round, results, etc.) Uncomment to enable. +#LOG_GAME + +## Log all Topic() calls (for use by coders in tracking down Topic issues). Uncomment to enable. +#LOG_HREFS + +## log OOC channel Uncomment to enable. +#LOG_OOC + +## Log PDA messages. Uncomment to enable. +#LOG_PDA + +## Log world.log and runtime errors to a file. Uncomment to enable. +#LOG_RUNTIME + +## log client Say Uncomment to enable. +#LOG_SAY + +## log player votes Uncomment to enable. +#LOG_VOTE + +## log client Whisper Uncomment to enable. +#LOG_WHISPER + +## Log world.log messages. Uncomment to enable. +#LOG_WORLD_OUTPUT + +## +# MODES +# Configuration options relating to game modes. +## + +## If uncommented, votes can be called to add extra antags to the round. Uncomment to enable. +#ALLOW_EXTRA_ANTAGS + +## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. +## Malf and Rev will let the shuttle be called when the antags/protags are dead. +## Uncomment to enable. +#CONTINUOUS_ROUNDS + +## Spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard. Uncomment to enable. +#FEATURE_OBJECT_SPELL_SYSTEM + +## Allowed modes. +#MODES [] + +## Mode names. +#MODE_NAMES [] + +## Relative probability of each mode. +#PROBABILITIES {"calamity":0,"cult":1,"extended":1,"god":0,"heist":0,"meteor":0,"crossfire":0,"siege":0,"spyvspy":0,"uprising":0,"ninja":0,"mercenary":1,"revolution":0,"traitor":0,"wizard":1} + +## If security is prohibited from being most antagonists. Uncomment to enable. +#PROTECT_ROLES_FROM_ANTAGONIST + +## If amount of traitors scales or not. Uncomment to enable. +#TRAITOR_SCALING + +## A list of modes that should be votable. +#VOTABLE_MODES ["crossfire","cult","extended","god","heist","mercenary","meteor","ninja","revolution","secret","siege","spyvspy","traitor","uprising","wizard"] + +## +# PROTECTED +# Configuration options protected from manipulation on-server. +## + +## Password used for authorizing external tools that can apply bans. +#BAN_COMMS_PASSWORD + +## Password used for authorizing ircbot and other external tools. +#COMMS_PASSWORD + +## Export address where external tools that monitor logins are located. +#LOGIN_EXPORT_ADDR + +## +# RESOURCES +# Configuration options relating to server resources. +## + +## Uncomment this and set it to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '[CUSTOM_ICON_ICON_LOCATION]/[custom icon path value]' +#CUSTOM_ICON_ICON_LOCATION config/custom_icons/icons + +## Set this to a file path relative to the executing binary to prefix all custom item icon locations with this location ie. '[CUSTOM_ITEM_ICON_LOCATION]/[custom item icon path value]' +#CUSTOM_ITEM_ICON_LOCATION config/custom_items/icons + +## Direct clients to preload the server resource file from a URL pointing to a .rsc file. NOTE: At this time (byond 512), +## the client/resource_rsc var does not function as one would expect. See client_defines.dm, the 'preload_rsc' var's +## comments on how to use it properly. If you use a resource URL, you must set preload_rsc to 0 at compile time or +## clients will still download from the server *too*. This will randomly select one URL if more than one is provided. +## Spaces are prohibited in each URL by spec, you must use encoded spaces. +## ex. RESOURCE_URLS URL URL2 URL3 +#RESOURCE_URLS [] + +## +# SERVER +# Configuration options relating to the server itself. +## + +## Comment to disable respawning by default. +#ABANDON_ALLOWED 1 + +## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. +#ADMIN_IRC + +## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. +#ADMIN_LEGACY_SYSTEM 1 + +## Allow AI job. +#ALLOW_AI 1 + +## Allow ghosts to join as maintenance drones. +#ALLOW_DRONE_SPAWN 1 + +## Uncomment this line to announce shuttle dock announcements to the main IRC channel, if MAIN_IRC has also been setup. Uncomment to enable. +#ANNOUNCE_SHUTTLE_DOCK_TO_IRC + +## Comment to disable the AOOC channel by default. +#AOOC_ALLOWED 1 + +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +#BANAPPEALS + +## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. +#BAN_LEGACY_SYSTEM 1 + +## Sets the number of available character slots. +#CHARACTER_SLOTS 10 + +## Sets the minimum number of cultists needed for ghosts to write in blood. +#CULT_GHOSTWRITER_REQ_CULTISTS 10 + +## Uncomment this to remove the server from the hub. Uncomment to enable. +#DELIST_WHEN_NO_ADMINS + +## Uncomment to enable. +#DISABLE_PLAYER_MICE + +## Uncomment to make Discord webhooks send in plaintext rather than as embeds. Uncomment to enable. +#DISABLE_WEBHOOK_EMBEDS + +## Discord server permanent invite address. +#DISCORDURL + +## Comment to disable the dead OOC channel by default. +#DOOC_ALLOWED 1 + +## Uncomment this to DISABLE action spam kicking. Not recommended; this helps protect from spam attacks. Uncomment to enable. +#DO_NOT_PREVENT_SPAM + +## A drone will become available every X ticks since last drone spawn. Default is 2 minutes. +#DRONE_BUILD_TIME 1200 + +## Comment to disable ghost chat by default. +#DSAY_ALLOWED 1 + +## Comment to prevent anyone from joining the round by default. +#ENTER_ALLOWED 1 + +## Remove the # mark infront of this to forbid admins from posssessing the singularity. Uncomment to enable. +#FORBID_SINGULO_POSSESSION + +## Discussion forum address. +#FORUMURL + +## Defines world FPS. Defaults to 20. +## Can also accept ticklag values (0.9, 0.5, etc) which will automatically be converted to FPS. +#FPS 20 + +## GitHub address. +#GITHUBURL + +## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting). Uncomment to enable. +#GUESTS_ALLOWED + +## Set a hosted by name for UNIX platforms. +#HOSTEDBY + +## Hub visibility: If you want to be visible on the hub, uncomment the below line and be sure that Dream Daemon is set to visible. This can be changed in-round as well with toggle-hub-visibility if Dream Daemon is set correctly. Uncomment to enable. +#HUB_VISIBILITY + +## Host where the IRC bot is hosted. Port 45678 needs to be open. +#IRC_BOT_HOST localhost + +## GitHub new issue address. +#ISSUEREPORTURL + +## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. +#JOBS_HAVE_MINIMAL_ACCESS 1 + +## Disconnect players who did nothing during the set amount of minutes. +#KICK_INACTIVE 0 + +## Sets the number of loadout slots per character. +#LOADOUT_SLOTS 3 + +## Toggle for having jobs load up from the .txt Uncomment to enable. +#LOAD_JOBS_FROM_TXT + +## Comment to disable the LOOC channel by default. +#LOOC_ALLOWED 1 + +## IRC channel to send information to. Leave blank to disable. +#MAIN_IRC #main + +## Remove the # to define a different cap for aspect points in chargen. +#MAX_CHARACTER_ASPECTS 5 + +## This many drones can be active at the same time. +#MAX_MAINT_DRONES 5 + +## Clients will be unable to connect unless their build is equal to or higher than this (a number, e.g. 1000). +#MINIMUM_BYOND_BUILD 0 + +## Clients will be unable to connect unless their version is equal to or higher than this (a number, e.g. 511). +#MINIMUM_BYOND_VERSION 0 + +## Uncomment to enable. +#NO_CLICK_COOLDOWN + +## Whether or not to make localhost immune to throttling. +## Localhost will still be throttled internally; it just won't be affected by it. +## Uncomment to enable. +#NO_THROTTLE_LOCALHOST + +## Comment to disable the OOC channel by default. +#OOC_ALLOWED 1 + +## Is the panic bunker currently on by default? Uncomment to enable. +#PANIC_BUNKER + +## A message when user did not pass the panic bunker. +#PANIC_BUNKER_MESSAGE Sorry! The panic bunker is enabled. Please head to our Discord or forum to get yourself added to the panic bunker bypass. + +## The maximum number of non-admin players online. +#PLAYER_LIMIT 0 + +## Respawn delay in minutes before one may respawn as a crew member. +#RESPAWN_DELAY 30 + +## Set a server location for world reboot. Don't include the byond://, just give the address and port. +#SERVER + +## Set a server URL for the IRC bot to use; like SERVER, don't include the byond:// +## Unlike SERVER, this one shouldn't break auto-reconnect. +#SERVERURL + +## Server name: This appears at the top of the screen in-game. +#SERVER_NAME Nebula 13 + +## Uncomment this to show a typing indicator for people writing whispers. Uncomment to enable. +#SHOW_TYPING_INDICATOR_FOR_WHISPERS + +## SSinitialization throttling. +#TICK_LIMIT_MC_INIT 98 + +## Set to 1 to prevent newly-spawned mice from understanding human speech. Uncomment to enable. +#UNEDUCATED_MICE + +## Uncomment to restrict non-admins from using humanoid alien races. Uncomment to enable. +#USEALIENWHITELIST + +## Uncomment to use the alien whitelist system with SQL instead. (requires the above uncommented as well). Uncomment to enable. +#USEALIENWHITELIST_SQL + +## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans). +## Uncomment to enable. +#USEWHITELIST + +## Uncomment to enable sending data to the IRC bot. Uncomment to enable. +#USE_IRC_BOT + +## Remove the # in front of this config option to have loyalty implants spawn by default on your server. Uncomment to enable. +#USE_LOYALTY_IMPLANTS + +## Uncomment to make Dream Daemon refuse to reboot for any reason other than SIGUSR1. Uncomment to enable. +#WAIT_FOR_SIGUSR1_REBOOT + +## Wiki address. +#WIKIURL + +## +# VOTING +# Configuration options relating to votes at runtime. +## + +## Uncomment to enable map voting; you'll need to use the script at tools/server.sh or an equivalent for it to take effect. +## You'll also likely need to enable WAIT_FOR_SIGUSR1 below. +## Uncomment to enable. +#ALLOW_MAP_SWITCHING + +## Allow players to initate a mode-change start. Uncomment to enable. +#ALLOW_VOTE_MODE + +## Allow players to initiate a restart vote. Uncomment to enable. +#ALLOW_VOTE_RESTART + +## Uncomment to enable an automatic map vote and switch at end of round. MAP_SWITCHING must also be enabled. Uncomment to enable. +#AUTO_MAP_VOTE + +## Time left (seconds) before round start when automatic gamemote vote is called (default 160). +#VOTE_AUTOGAMEMODE_TIMELEFT 100 + +## Autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes). +#VOTE_AUTOTRANSFER_INITIAL 108000 + +## Autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes). +#VOTE_AUTOTRANSFER_INTERVAL 18000 + +## Min delay (deciseconds) between voting sessions (default 10 minutes). +#VOTE_DELAY 6000 + +## Prevents dead players from voting or starting votes. +#VOTE_NO_DEAD 0 + +## Prevents players not in-round from voting on crew transfer votes. +#VOTE_NO_DEAD_CREW_TRANSFER 0 + +## Players' votes default to 'No vote' (otherwise, default to 'No change'). +#VOTE_NO_DEFAULT 0 + +## Time period (deciseconds) which voting session will last (default 1 minute). +#VOTE_PERIOD 600 diff --git a/config/example/game_options.txt b/config/example/game_options.txt deleted file mode 100644 index cce0a2ad04d..00000000000 --- a/config/example/game_options.txt +++ /dev/null @@ -1,109 +0,0 @@ -### HEALTH ### - -## level of health at which a mob goes into continual shock (soft crit) -HEALTH_THRESHOLD_SOFTCRIT 0 - -## level of health at which a mob becomes unconscious (crit) -HEALTH_THRESHOLD_CRIT -50 - -## level of health at which a mob becomes dead -HEALTH_THRESHOLD_DEAD -100 - -## Uncomment this line to enable humans showing a visible message upon death ('X seizes up then falls limp, eyes dead and lifeless'). -# SHOW_HUMAN_DEATH_MESSAGE - -## Determines whether bones can be broken through excessive damage to the organ -## 0 means bones can't break, 1 means they can -BONES_CAN_BREAK 1 -## Determines whether limbs can be amputated through excessive damage to the organ -## 0 means limbs can't be amputated, 1 means they can -LIMBS_CAN_BREAK 1 - -## multiplier which enables organs to take more damage before bones breaking or limbs being destroyed -## 100 means normal, 50 means half -ORGAN_HEALTH_MULTIPLIER 90 - -## multiplier which influences how fast organs regenerate naturally -## 100 means normal, 50 means half -ORGAN_REGENERATION_MULTIPLIER 25 - -### REVIVAL ### - -## whether pod plants work or not -REVIVAL_POD_PLANTS 1 - -## whether cloning tubes work or not -REVIVAL_CLONING 1 - -## amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite) -REVIVAL_BRAIN_LIFE -1 - - - -### MOB MOVEMENT ### - -## We suggest editing these variabled in-game to find a good speed for your server. To do this you must be a high level admin. Open the 'debug' tab ingame. Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. - -## These values get directly added to values and totals in-game. To speed things up make the number negative, to slow things down, make the number positive. - - -## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 2 -WALK_DELAY 4 -CREEP_DELAY 6 - -## Set this to 0 for perfectly smooth movement gliding, or 1 or more for delayed chess move style movements. -#GLIDE_SIZE_DELAY 0 - -MINIMUM_SPRINT_COST 0.8 -SKILL_SPRINT_COST_RANGE 0.8 -MINIMUM_STAMINA_RECOVERY 5 -MAXIMUM_STAMINA_RECOVERY 5 - -## The variables below affect the movement of specific mob types. -HUMAN_DELAY 0 -ROBOT_DELAY 0 -MONKEY_DELAY 0 -ALIEN_DELAY 0 -ANIMAL_DELAY 0 - - -### Miscellaneous ### - -## Config options which, of course, don't fit into previous categories. - -## Remove the # in front of this config option to have loyalty implants spawn by default on your server. -#USE_LOYALTY_IMPLANTS - -## Uncomment to lock the automatic client view scaling on the X or Y boundary. -#LOCK_CLIENT_VIEW_X 15 -#LOCK_CLIENT_VIEW_Y 15 - -## Change to set a maximum size for the client view scaling. -MAX_CLIENT_VIEW_X 30 -MAX_CLIENT_VIEW_Y 30 - -## Remove the # to define a different cap for aspect points in chargen. -#MAX_CHARACTER_ASPECTS 5 - -## Allow multiple input keys to be pressed for diagonal movement. -#ALLOW_DIAGONAL_MOVEMENT - -## Threshold of where brain damage begins to affect dexterity (70 brainloss above this means zero dexterity). Default is 30. -#DEXTERITY_MALUS_BRAINLOSS_THRESHOLD 30 - -## Whether or not all human mobs have very basic darksight by default. -#GRANT_DEFAULT_DARKSIGHT - -## The range and effectiveness of default darksight if above is uncommented. -#DEFAULT_DARKSIGHT_EFFECTIVENESS 0.05 -#DEFAULT_DARKSIGHT_RANGE 2 - -## Uncomment to allow stressors to impact shock, healing and blood recovery. -#ADJUST_HEALING_FROM_STRESS -## A multiplier for the impact stress has on shock recovery - 0.3 means maximum stress imposes a 30% penalty on shock recovery. -#STRESS_SHOCK_RECOVERY_CONSTANT 0.5 -## A multiplier for the impact stress has on wound passive healing, as above. -#STRESS_HEALING_RECOVERY_CONSTANT 0.3 -## A multiplier for the impact stress has on blood regeneration, as above. -#STRESS_BLOOD_RECOVERY_CONSTANT 0.3 diff --git a/html/changelog.html b/html/changelog.html index 6c90c3e8251..79e860ded45 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,32 +52,98 @@ -->
    -

    11 September 2023

    -

    LenSkozzy updated:

    +

    24 January 2024

    +

    MistakeNot4892 updated:

    +
      +
    • All living mobs can now hallucinate.
    • +
    + +

    23 January 2024

    +

    MistakeNot4892 updated:

      -
    • Fixed ID object initialization
    • +
    • All living mobs can now dream.
    + +

    16 January 2024

    +

    MistakeNot4892 updated:

    +
      +
    • Configuration has been rewritten to a new format. Servers with configuration changes from defaults will need to run the server to generate the new config file, then mirror their configuration changes in the new config system. Check the PR body for details.
    • +
    + +

    15 January 2024

    +

    MistakeNot4892 updated:

    +
      +
    • You can now use arrow buttons to adjust markings and hair in character setup.
    • +
    + +

    14 January 2024

    +

    MistakeNot4892 updated:

    +
      +
    • Manuals have been rewritten to pull information from the codex instead of the wiki.
    • +
    + +

    12 January 2024

    NataKilar updated:

      -
    • Fixed water tanks being unable to be refilled
    • +
    • Eases contamination protection requirements slightly
    • +
    + +

    09 January 2024

    +

    MistakeNot4892 updated:

    +
      +
    • Simple mobs will now show a windup before hitting you in melee, allowing you to dodge.
    • +
    + +

    08 January 2024

    +

    Greenjoe12345 updated:

    +
      +
    • Pew sprites from Aurorastation
    -

    04 September 2023

    -

    LenSkozzy updated:

    +

    28 December 2023

    +

    MistakeNot4892 updated:

      -
    • fixed folding@home
    • +
    • Some mech equipment origin tech has changed. Please report any missing or odd values.
    -

    02 September 2023

    -

    AliceDTRH updated:

    +

    27 December 2023

    +

    MistakeNot4892 updated:

    +
      +
    • Heating atoms like beakers with fire or a welding torch should be more consistent now.
    • +
    + +

    19 December 2023

    +

    CheeseDogg0 updated:

    +
      +
    • Changed some of the more ridiculous numbers to bring them more in line with real life
    • +
    + +

    18 December 2023

    +

    MistakeNot4892 updated:

    +
      +
    • Updated ministation from ScavStation. Lots of changes, see PR.
    • +
    • Jump is now handled by selecting jump from the prepare button on the bottom right of the UI, then clicking the target.
    • +
    + +

    14 December 2023

    +

    MistakeNot4892 updated:

    +
      +
    • Neo-avian icons have been reindexed so may look slightly different.
    • +
    • Drills now function as shovels.
    • +
    • Clay can now be dug up from stationary drills.
    • +
    • Duct tape can be used to repair prosthetic faults.
    • +
    + +

    09 December 2023

    +

    MistakeNot4892 updated:

      -
    • Fixed the job whitelist not reading keys properly
    • +
    • Examining batons and energy guns should now show you the cell they have loaded, or require loading.
    -

    28 July 2023

    +

    07 December 2023

    MistakeNot4892 updated:

      -
    • Paramount Coercion is now 'Beguile', and does not have a channel or a risk of backblast. It also prompts the target to join willingly, knocking them unconscious and dealing brain damage so you can escape if they refuse.
    • +
    • Suit sensors are now an accessory on your uniform that can be removed.
    [name_column][treatment_column]
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3843bdd5100..4e226106114 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14528,3 +14528,87 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fixed ID object initialization NataKilar: - bugfix: Fixed water tanks being unable to be refilled +2023-10-01: + John: + - tweak: Lifepods avoid location they are escaping from. +2023-10-05: + MistakeNot4892: + - tweak: Surgery now has more/different sounds. +2023-10-15: + MistakeNot4892: + - tweak: You will now be able to tell if you can equip an item by mousing over the + equipment slot with the item in your active hand. +2023-10-18: + MistakeNot4892: + - tweak: Falling a longer distance will now cause more damage. +2023-10-20: + MistakeNot4892: + - tweak: Acid resistance has been tweaked; report things melting or not melting + unexpectedly on the bug tracker. + - tweak: Flashlights, flares and lamps have new overlays and some new states. +2023-10-24: + MistakeNot4892: + - tweak: Exterior turfs and lighting blend across z-level transitions now. +2023-11-09: + MistakeNot4892: + - tweak: Taj can now cycle voidsuits and have custom icons for them. +2023-12-07: + MistakeNot4892: + - tweak: Suit sensors are now an accessory on your uniform that can be removed. +2023-12-09: + MistakeNot4892: + - tweak: Examining batons and energy guns should now show you the cell they have + loaded, or require loading. +2023-12-14: + MistakeNot4892: + - tweak: Neo-avian icons have been reindexed so may look slightly different. + - tweak: Drills now function as shovels. + - tweak: Clay can now be dug up from stationary drills. + - tweak: Duct tape can be used to repair prosthetic faults. +2023-12-18: + MistakeNot4892: + - tweak: Updated ministation from ScavStation. Lots of changes, see PR. + - tweak: Jump is now handled by selecting jump from the prepare button on the bottom + right of the UI, then clicking the target. +2023-12-19: + CheeseDogg0: + - tweak: Changed some of the more ridiculous numbers to bring them more in line + with real life +2023-12-27: + MistakeNot4892: + - tweak: Heating atoms like beakers with fire or a welding torch should be more + consistent now. +2023-12-28: + MistakeNot4892: + - tweak: Some mech equipment origin tech has changed. Please report any missing + or odd values. +2024-01-08: + Greenjoe12345: + - imageadd: Pew sprites from Aurorastation +2024-01-09: + MistakeNot4892: + - tweak: Simple mobs will now show a windup before hitting you in melee, allowing + you to dodge. +2024-01-12: + NataKilar: + - tweak: Eases contamination protection requirements slightly +2024-01-14: + MistakeNot4892: + - tweak: Manuals have been rewritten to pull information from the codex instead + of the wiki. +2024-01-15: + MistakeNot4892: + - tweak: You can now use arrow buttons to adjust markings and hair in character + setup. +2024-01-16: + MistakeNot4892: + - tweak: Configuration has been rewritten to a new format. Servers with configuration + changes from defaults will need to run the server to generate the new config + file, then mirror their configuration changes in the new config system. Check + the PR body for details. +2024-01-23: + MistakeNot4892: + - tweak: All living mobs can now dream. +2024-01-24: + MistakeNot4892: + - tweak: All living mobs can now hallucinate. diff --git a/icons/clothing/accessories/vitals_sensor.dmi b/icons/clothing/accessories/vitals_sensor.dmi new file mode 100644 index 00000000000..173a293306a Binary files /dev/null and b/icons/clothing/accessories/vitals_sensor.dmi differ diff --git a/icons/clothing/head/hardhat/medic.dmi b/icons/clothing/head/hardhat/medic.dmi index 92c875a6d31..d6a350b74c0 100644 Binary files a/icons/clothing/head/hardhat/medic.dmi and b/icons/clothing/head/hardhat/medic.dmi differ diff --git a/icons/clothing/head/pumpkin.dmi b/icons/clothing/head/pumpkin.dmi index c38d51b6d7f..de6ac8af04e 100644 Binary files a/icons/clothing/head/pumpkin.dmi and b/icons/clothing/head/pumpkin.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet.dmi b/icons/clothing/rigs/helmets/helmet.dmi index e1c45ca7a4c..14285e33acf 100644 Binary files a/icons/clothing/rigs/helmets/helmet.dmi and b/icons/clothing/rigs/helmets/helmet.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_engineering.dmi b/icons/clothing/rigs/helmets/helmet_engineering.dmi index 1e8b629140d..7e29a7f6a6d 100644 Binary files a/icons/clothing/rigs/helmets/helmet_engineering.dmi and b/icons/clothing/rigs/helmets/helmet_engineering.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_eva.dmi b/icons/clothing/rigs/helmets/helmet_eva.dmi index 1f857d75eba..f121efa0475 100644 Binary files a/icons/clothing/rigs/helmets/helmet_eva.dmi and b/icons/clothing/rigs/helmets/helmet_eva.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_hacker.dmi b/icons/clothing/rigs/helmets/helmet_hacker.dmi index 2c9bd94cc48..7a281642597 100644 Binary files a/icons/clothing/rigs/helmets/helmet_hacker.dmi and b/icons/clothing/rigs/helmets/helmet_hacker.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_hazard.dmi b/icons/clothing/rigs/helmets/helmet_hazard.dmi index 9cad81f4e81..1d43df8e1ed 100644 Binary files a/icons/clothing/rigs/helmets/helmet_hazard.dmi and b/icons/clothing/rigs/helmets/helmet_hazard.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_light.dmi b/icons/clothing/rigs/helmets/helmet_light.dmi index f5a47e560fb..bf6d09979b8 100644 Binary files a/icons/clothing/rigs/helmets/helmet_light.dmi and b/icons/clothing/rigs/helmets/helmet_light.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_medical.dmi b/icons/clothing/rigs/helmets/helmet_medical.dmi index e67ac770e0f..be2e63201bd 100644 Binary files a/icons/clothing/rigs/helmets/helmet_medical.dmi and b/icons/clothing/rigs/helmets/helmet_medical.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_merc.dmi b/icons/clothing/rigs/helmets/helmet_merc.dmi index 9983084a717..ca3c374bfbe 100644 Binary files a/icons/clothing/rigs/helmets/helmet_merc.dmi and b/icons/clothing/rigs/helmets/helmet_merc.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_merc_heavy.dmi b/icons/clothing/rigs/helmets/helmet_merc_heavy.dmi index 4709c046408..ce785a1ffeb 100644 Binary files a/icons/clothing/rigs/helmets/helmet_merc_heavy.dmi and b/icons/clothing/rigs/helmets/helmet_merc_heavy.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_military.dmi b/icons/clothing/rigs/helmets/helmet_military.dmi index 0d5a6fde18c..47087a31ca3 100644 Binary files a/icons/clothing/rigs/helmets/helmet_military.dmi and b/icons/clothing/rigs/helmets/helmet_military.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_ninja.dmi b/icons/clothing/rigs/helmets/helmet_ninja.dmi index 2a8bd061c63..7ca2eb42227 100644 Binary files a/icons/clothing/rigs/helmets/helmet_ninja.dmi and b/icons/clothing/rigs/helmets/helmet_ninja.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_null.dmi b/icons/clothing/rigs/helmets/helmet_null.dmi index 8911b076d16..ceb0366983c 100644 Binary files a/icons/clothing/rigs/helmets/helmet_null.dmi and b/icons/clothing/rigs/helmets/helmet_null.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_science.dmi b/icons/clothing/rigs/helmets/helmet_science.dmi index b3d88ce7053..269036f0438 100644 Binary files a/icons/clothing/rigs/helmets/helmet_science.dmi and b/icons/clothing/rigs/helmets/helmet_science.dmi differ diff --git a/icons/clothing/rigs/helmets/helmet_security.dmi b/icons/clothing/rigs/helmets/helmet_security.dmi index cf8b399e9d3..d121e4748fa 100644 Binary files a/icons/clothing/rigs/helmets/helmet_security.dmi and b/icons/clothing/rigs/helmets/helmet_security.dmi differ diff --git a/icons/effects/landmarks.dmi b/icons/effects/landmarks.dmi index ee024440fb3..c69935c2a6d 100644 Binary files a/icons/effects/landmarks.dmi and b/icons/effects/landmarks.dmi differ diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index 99588092d08..c732f54cafd 100644 Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ diff --git a/icons/mecha/mecha_preview.dmi b/icons/mecha/mecha_preview.dmi new file mode 100644 index 00000000000..98f4a9985de Binary files /dev/null and b/icons/mecha/mecha_preview.dmi differ diff --git a/icons/misc/beach.dmi b/icons/misc/beach.dmi index 09bee586d7b..847054aa8ce 100644 Binary files a/icons/misc/beach.dmi and b/icons/misc/beach.dmi differ diff --git a/icons/mob/human_races/species/human/facial.dmi b/icons/mob/human_races/species/human/facial.dmi index 25fde2d870d..d3e78a757bf 100644 Binary files a/icons/mob/human_races/species/human/facial.dmi and b/icons/mob/human_races/species/human/facial.dmi differ diff --git a/icons/mob/human_races/species/human/hair.dmi b/icons/mob/human_races/species/human/hair.dmi index 459e4531714..b7b020740f3 100644 Binary files a/icons/mob/human_races/species/human/hair.dmi and b/icons/mob/human_races/species/human/hair.dmi differ diff --git a/icons/mob/human_races/species/monkey/monkey_tail.dmi b/icons/mob/human_races/species/monkey/monkey_tail.dmi new file mode 100644 index 00000000000..e958e219866 Binary files /dev/null and b/icons/mob/human_races/species/monkey/monkey_tail.dmi differ diff --git a/icons/mob/light_overlays.dmi b/icons/mob/light_overlays.dmi deleted file mode 100644 index 904cefc9679..00000000000 Binary files a/icons/mob/light_overlays.dmi and /dev/null differ diff --git a/icons/mob/onmob/items/lefthand.dmi b/icons/mob/onmob/items/lefthand.dmi index 5c2bb5e820b..e7d4591ed17 100644 Binary files a/icons/mob/onmob/items/lefthand.dmi and b/icons/mob/onmob/items/lefthand.dmi differ diff --git a/icons/mob/onmob/items/righthand.dmi b/icons/mob/onmob/items/righthand.dmi index 7981f010723..15b3a9482c0 100644 Binary files a/icons/mob/onmob/items/righthand.dmi and b/icons/mob/onmob/items/righthand.dmi differ diff --git a/icons/mob/screen/midnight.dmi b/icons/mob/screen/midnight.dmi index 01dbd6c6479..e1dab709439 100644 Binary files a/icons/mob/screen/midnight.dmi and b/icons/mob/screen/midnight.dmi differ diff --git a/icons/mob/screen/minimalist.dmi b/icons/mob/screen/minimalist.dmi index e87aebf1312..27659edeaa8 100644 Binary files a/icons/mob/screen/minimalist.dmi and b/icons/mob/screen/minimalist.dmi differ diff --git a/icons/mob/screen/old-noborder.dmi b/icons/mob/screen/old-noborder.dmi index 18e49fc9c88..7b480232459 100644 Binary files a/icons/mob/screen/old-noborder.dmi and b/icons/mob/screen/old-noborder.dmi differ diff --git a/icons/mob/screen/old.dmi b/icons/mob/screen/old.dmi index cc52abc3909..c2dec58411a 100644 Binary files a/icons/mob/screen/old.dmi and b/icons/mob/screen/old.dmi differ diff --git a/icons/mob/screen/orange.dmi b/icons/mob/screen/orange.dmi index cb94ada06c8..e04a5729f4d 100644 Binary files a/icons/mob/screen/orange.dmi and b/icons/mob/screen/orange.dmi differ diff --git a/icons/mob/screen/white.dmi b/icons/mob/screen/white.dmi index 10d35d02cff..709ff0cab01 100644 Binary files a/icons/mob/screen/white.dmi and b/icons/mob/screen/white.dmi differ diff --git a/icons/mob/simple_animal/crow.dmi b/icons/mob/simple_animal/crow.dmi index 965a19a2f3d..3841efb01ba 100644 Binary files a/icons/mob/simple_animal/crow.dmi and b/icons/mob/simple_animal/crow.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 93f5bb50f6f..26ee3a4c8d6 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/assemblies/circuit_analyzer.dmi b/icons/obj/assemblies/circuit_analyzer.dmi new file mode 100644 index 00000000000..67d7e19c830 Binary files /dev/null and b/icons/obj/assemblies/circuit_analyzer.dmi differ diff --git a/icons/obj/assemblies/electronic_tools.dmi b/icons/obj/assemblies/electronic_tools.dmi index 0998abef918..971683f0743 100644 Binary files a/icons/obj/assemblies/electronic_tools.dmi and b/icons/obj/assemblies/electronic_tools.dmi differ diff --git a/icons/obj/autoinjector.dmi b/icons/obj/autoinjector.dmi new file mode 100644 index 00000000000..95efaa7d773 Binary files /dev/null and b/icons/obj/autoinjector.dmi differ diff --git a/icons/obj/basketball.dmi b/icons/obj/basketball.dmi index e938d8d7201..35e72d142ab 100644 Binary files a/icons/obj/basketball.dmi and b/icons/obj/basketball.dmi differ diff --git a/icons/obj/beachball.dmi b/icons/obj/beachball.dmi new file mode 100644 index 00000000000..f011f7cbfac Binary files /dev/null and b/icons/obj/beachball.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 981749b6e7a..66424d09ad8 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/doors/Doorglass.dmi b/icons/obj/doors/Doorglass.dmi index f4afd02c99d..5582b2739b6 100644 Binary files a/icons/obj/doors/Doorglass.dmi and b/icons/obj/doors/Doorglass.dmi differ diff --git a/icons/obj/doors/blast_doors/door.dmi b/icons/obj/doors/blast_doors/door.dmi index 2d5f56b079e..f339de89e21 100644 Binary files a/icons/obj/doors/blast_doors/door.dmi and b/icons/obj/doors/blast_doors/door.dmi differ diff --git a/icons/obj/doors/centcomm/door.dmi b/icons/obj/doors/centcomm/door.dmi index 49f386ff380..58c8af1f6e2 100644 Binary files a/icons/obj/doors/centcomm/door.dmi and b/icons/obj/doors/centcomm/door.dmi differ diff --git a/icons/obj/doors/elevator/door.dmi b/icons/obj/doors/elevator/door.dmi index 3cfbc002d33..53e6937830e 100644 Binary files a/icons/obj/doors/elevator/door.dmi and b/icons/obj/doors/elevator/door.dmi differ diff --git a/icons/obj/doors/shutters/door.dmi b/icons/obj/doors/shutters/door.dmi index a87a4c14d22..84639f15fcc 100644 Binary files a/icons/obj/doors/shutters/door.dmi and b/icons/obj/doors/shutters/door.dmi differ diff --git a/icons/obj/furniture.dmi b/icons/obj/furniture.dmi index 5b98322c935..fa465cbfe4c 100644 Binary files a/icons/obj/furniture.dmi and b/icons/obj/furniture.dmi differ diff --git a/icons/obj/guns/bolt_action.dmi b/icons/obj/guns/bolt_action.dmi index 75979dec624..54b224bd7ca 100644 Binary files a/icons/obj/guns/bolt_action.dmi and b/icons/obj/guns/bolt_action.dmi differ diff --git a/icons/obj/guns/capacitor_rifle.dmi b/icons/obj/guns/capacitor_rifle.dmi index 02e0ccc712b..442f54df852 100644 Binary files a/icons/obj/guns/capacitor_rifle.dmi and b/icons/obj/guns/capacitor_rifle.dmi differ diff --git a/icons/obj/guns/pistol.dmi b/icons/obj/guns/pistol.dmi index cc84d7e40ef..e6e1deb6149 100644 Binary files a/icons/obj/guns/pistol.dmi and b/icons/obj/guns/pistol.dmi differ diff --git a/icons/obj/hypospray.dmi b/icons/obj/hypospray.dmi new file mode 100644 index 00000000000..7f737ccff7c Binary files /dev/null and b/icons/obj/hypospray.dmi differ diff --git a/icons/obj/hypospray_borg.dmi b/icons/obj/hypospray_borg.dmi new file mode 100644 index 00000000000..1774157a002 Binary files /dev/null and b/icons/obj/hypospray_borg.dmi differ diff --git a/icons/obj/id/id.dmi b/icons/obj/id/id.dmi index 91eece20501..235cf5f1c60 100644 Binary files a/icons/obj/id/id.dmi and b/icons/obj/id/id.dmi differ diff --git a/icons/obj/inhaler.dmi b/icons/obj/inhaler.dmi new file mode 100644 index 00000000000..33ef5595759 Binary files /dev/null and b/icons/obj/inhaler.dmi differ diff --git a/icons/obj/items/air_horn.dmi b/icons/obj/items/air_horn.dmi new file mode 100644 index 00000000000..1b00e02134a Binary files /dev/null and b/icons/obj/items/air_horn.dmi differ diff --git a/icons/obj/items/brain_interface_organic.dmi b/icons/obj/items/brain_interface_organic.dmi new file mode 100644 index 00000000000..940f246aecd Binary files /dev/null and b/icons/obj/items/brain_interface_organic.dmi differ diff --git a/icons/obj/items/brain_interface_robotic.dmi b/icons/obj/items/brain_interface_robotic.dmi new file mode 100644 index 00000000000..065f7a2cf2f Binary files /dev/null and b/icons/obj/items/brain_interface_robotic.dmi differ diff --git a/icons/obj/items/credstick.dmi b/icons/obj/items/credstick.dmi index cb16bdbbff2..82edc07683e 100644 Binary files a/icons/obj/items/credstick.dmi and b/icons/obj/items/credstick.dmi differ diff --git a/icons/obj/items/device/boombox.dmi b/icons/obj/items/device/boombox.dmi index e49b198a7b0..41efdeca09a 100644 Binary files a/icons/obj/items/device/boombox.dmi and b/icons/obj/items/device/boombox.dmi differ diff --git a/icons/obj/items/device/depth_scanner.dmi b/icons/obj/items/device/depth_scanner.dmi index 92d1cd080f7..b859bb8d164 100644 Binary files a/icons/obj/items/device/depth_scanner.dmi and b/icons/obj/items/device/depth_scanner.dmi differ diff --git a/icons/obj/items/device/parts_replacer.dmi b/icons/obj/items/device/parts_replacer.dmi index c3cb8d13a65..43672a4ca23 100644 Binary files a/icons/obj/items/device/parts_replacer.dmi and b/icons/obj/items/device/parts_replacer.dmi differ diff --git a/icons/obj/items/device/parts_replacer_advanced.dmi b/icons/obj/items/device/parts_replacer_advanced.dmi new file mode 100644 index 00000000000..a09ec9706fe Binary files /dev/null and b/icons/obj/items/device/parts_replacer_advanced.dmi differ diff --git a/icons/obj/items/device/radio/key.dmi b/icons/obj/items/device/radio/key.dmi index 458a6376067..565d78b8e0f 100644 Binary files a/icons/obj/items/device/radio/key.dmi and b/icons/obj/items/device/radio/key.dmi differ diff --git a/icons/obj/items/device/radio/spybug.dmi b/icons/obj/items/device/radio/spybug.dmi new file mode 100644 index 00000000000..549907f2a59 Binary files /dev/null and b/icons/obj/items/device/radio/spybug.dmi differ diff --git a/icons/obj/items/device/robot_analyzer.dmi b/icons/obj/items/device/robot_analyzer.dmi index f194a04505f..b424ea8e012 100644 Binary files a/icons/obj/items/device/robot_analyzer.dmi and b/icons/obj/items/device/robot_analyzer.dmi differ diff --git a/icons/obj/items/device/scanner/advanced_spectrometer.dmi b/icons/obj/items/device/scanner/advanced_spectrometer.dmi new file mode 100644 index 00000000000..4028fa27810 Binary files /dev/null and b/icons/obj/items/device/scanner/advanced_spectrometer.dmi differ diff --git a/icons/obj/items/device/scanner/atmos_scanner.dmi b/icons/obj/items/device/scanner/atmos_scanner.dmi index cd5eb16d359..7d0e56c54bc 100644 Binary files a/icons/obj/items/device/scanner/atmos_scanner.dmi and b/icons/obj/items/device/scanner/atmos_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/breath_scanner.dmi b/icons/obj/items/device/scanner/breath_scanner.dmi index 648bf78f29f..bb4b2df70dc 100644 Binary files a/icons/obj/items/device/scanner/breath_scanner.dmi and b/icons/obj/items/device/scanner/breath_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/health_scanner.dmi b/icons/obj/items/device/scanner/health_scanner.dmi index a1038003dfc..3005c19577d 100644 Binary files a/icons/obj/items/device/scanner/health_scanner.dmi and b/icons/obj/items/device/scanner/health_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/network_scanner.dmi b/icons/obj/items/device/scanner/network_scanner.dmi index 72d932c35f6..cfc537ef585 100644 Binary files a/icons/obj/items/device/scanner/network_scanner.dmi and b/icons/obj/items/device/scanner/network_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/ore_scanner.dmi b/icons/obj/items/device/scanner/ore_scanner.dmi index 85aec06a907..04095564900 100644 Binary files a/icons/obj/items/device/scanner/ore_scanner.dmi and b/icons/obj/items/device/scanner/ore_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/plant_scanner.dmi b/icons/obj/items/device/scanner/plant_scanner.dmi index 90f5e598521..88f1577fa36 100644 Binary files a/icons/obj/items/device/scanner/plant_scanner.dmi and b/icons/obj/items/device/scanner/plant_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/price_scanner.dmi b/icons/obj/items/device/scanner/price_scanner.dmi index bacb7862305..cfd7c670fe5 100644 Binary files a/icons/obj/items/device/scanner/price_scanner.dmi and b/icons/obj/items/device/scanner/price_scanner.dmi differ diff --git a/icons/obj/items/device/scanner/spectrometer.dmi b/icons/obj/items/device/scanner/spectrometer.dmi index f453dcd4d22..4923cc18a5f 100644 Binary files a/icons/obj/items/device/scanner/spectrometer.dmi and b/icons/obj/items/device/scanner/spectrometer.dmi differ diff --git a/icons/obj/items/device/scanner/xenobio_scanner.dmi b/icons/obj/items/device/scanner/xenobio_scanner.dmi index 28fdf5cbf85..dab11129286 100644 Binary files a/icons/obj/items/device/scanner/xenobio_scanner.dmi and b/icons/obj/items/device/scanner/xenobio_scanner.dmi differ diff --git a/icons/obj/items/device/tape_casette.dmi b/icons/obj/items/device/tape_casette.dmi deleted file mode 100644 index e42c3a2bf8a..00000000000 Binary files a/icons/obj/items/device/tape_casette.dmi and /dev/null differ diff --git a/icons/obj/items/device/tape_recorder.dmi b/icons/obj/items/device/tape_recorder.dmi deleted file mode 100644 index 0e00542aeef..00000000000 Binary files a/icons/obj/items/device/tape_recorder.dmi and /dev/null differ diff --git a/icons/obj/items/device/tape_recorder/tape_casette_blue.dmi b/icons/obj/items/device/tape_recorder/tape_casette_blue.dmi new file mode 100644 index 00000000000..62a06955566 Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_casette_blue.dmi differ diff --git a/icons/obj/items/device/tape_recorder/tape_casette_loose.dmi b/icons/obj/items/device/tape_recorder/tape_casette_loose.dmi new file mode 100644 index 00000000000..0c8b4b50258 Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_casette_loose.dmi differ diff --git a/icons/obj/items/device/tape_recorder/tape_casette_purple.dmi b/icons/obj/items/device/tape_recorder/tape_casette_purple.dmi new file mode 100644 index 00000000000..8db366b35ed Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_casette_purple.dmi differ diff --git a/icons/obj/items/device/tape_recorder/tape_casette_red.dmi b/icons/obj/items/device/tape_recorder/tape_casette_red.dmi new file mode 100644 index 00000000000..20a14a5706f Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_casette_red.dmi differ diff --git a/icons/obj/items/device/tape_recorder/tape_casette_white.dmi b/icons/obj/items/device/tape_recorder/tape_casette_white.dmi new file mode 100644 index 00000000000..9efb2b0e1e4 Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_casette_white.dmi differ diff --git a/icons/obj/items/device/tape_recorder/tape_casette_yellow.dmi b/icons/obj/items/device/tape_recorder/tape_casette_yellow.dmi new file mode 100644 index 00000000000..2c1419a26da Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_casette_yellow.dmi differ diff --git a/icons/obj/items/device/tape_recorder/tape_recorder.dmi b/icons/obj/items/device/tape_recorder/tape_recorder.dmi new file mode 100644 index 00000000000..90efe6e8b59 Binary files /dev/null and b/icons/obj/items/device/tape_recorder/tape_recorder.dmi differ diff --git a/icons/obj/items/horn.dmi b/icons/obj/items/horn.dmi index 06ecc94f199..f521160d4dd 100644 Binary files a/icons/obj/items/horn.dmi and b/icons/obj/items/horn.dmi differ diff --git a/icons/obj/items/messenger_bag.dmi b/icons/obj/items/messenger_bag.dmi deleted file mode 100644 index d558e52a5f1..00000000000 Binary files a/icons/obj/items/messenger_bag.dmi and /dev/null differ diff --git a/icons/obj/contraband.dmi b/icons/obj/items/posters.dmi similarity index 100% rename from icons/obj/contraband.dmi rename to icons/obj/items/posters.dmi diff --git a/icons/obj/items/stock_parts/stock_parts.dmi b/icons/obj/items/stock_parts/stock_parts.dmi index c5232faf88d..24e82a36cea 100644 Binary files a/icons/obj/items/stock_parts/stock_parts.dmi and b/icons/obj/items/stock_parts/stock_parts.dmi differ diff --git a/icons/obj/items/storage/backpack/corvid.dmi b/icons/obj/items/storage/backpack/corvid.dmi new file mode 100644 index 00000000000..9435ec56523 Binary files /dev/null and b/icons/obj/items/storage/backpack/corvid.dmi differ diff --git a/icons/obj/items/storage/lunchbox.dmi b/icons/obj/items/storage/lunchbox.dmi deleted file mode 100644 index 8d283cc8369..00000000000 Binary files a/icons/obj/items/storage/lunchbox.dmi and /dev/null differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_cat.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_cat.dmi new file mode 100644 index 00000000000..c1f76eb3d6f Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_cat.dmi differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_cti.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_cti.dmi new file mode 100644 index 00000000000..012aa094669 Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_cti.dmi differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_evil.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_evil.dmi new file mode 100644 index 00000000000..0c8fea6284c Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_evil.dmi differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_heart.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_heart.dmi new file mode 100644 index 00000000000..4410d4f354a Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_heart.dmi differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_mars.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_mars.dmi new file mode 100644 index 00000000000..d5842898985 Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_mars.dmi differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_rainbow.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_rainbow.dmi new file mode 100644 index 00000000000..de5a0587e2d Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_rainbow.dmi differ diff --git a/icons/obj/items/storage/lunchboxes/lunchbox_tcc.dmi b/icons/obj/items/storage/lunchboxes/lunchbox_tcc.dmi new file mode 100644 index 00000000000..4d008c3237d Binary files /dev/null and b/icons/obj/items/storage/lunchboxes/lunchbox_tcc.dmi differ diff --git a/icons/obj/items/storage/toolbox.dmi b/icons/obj/items/storage/toolbox.dmi deleted file mode 100644 index f3b61cd4763..00000000000 Binary files a/icons/obj/items/storage/toolbox.dmi and /dev/null differ diff --git a/icons/obj/items/storage/toolboxes/toolbox_black_red.dmi b/icons/obj/items/storage/toolboxes/toolbox_black_red.dmi new file mode 100644 index 00000000000..b04e3356d9f Binary files /dev/null and b/icons/obj/items/storage/toolboxes/toolbox_black_red.dmi differ diff --git a/icons/obj/items/storage/toolboxes/toolbox_blue.dmi b/icons/obj/items/storage/toolboxes/toolbox_blue.dmi new file mode 100644 index 00000000000..94dc99ec379 Binary files /dev/null and b/icons/obj/items/storage/toolboxes/toolbox_blue.dmi differ diff --git a/icons/obj/items/storage/toolboxes/toolbox_green.dmi b/icons/obj/items/storage/toolboxes/toolbox_green.dmi new file mode 100644 index 00000000000..37c24f0e718 Binary files /dev/null and b/icons/obj/items/storage/toolboxes/toolbox_green.dmi differ diff --git a/icons/obj/items/storage/toolboxes/toolbox_red.dmi b/icons/obj/items/storage/toolboxes/toolbox_red.dmi new file mode 100644 index 00000000000..f26ba27fab1 Binary files /dev/null and b/icons/obj/items/storage/toolboxes/toolbox_red.dmi differ diff --git a/icons/obj/items/storage/toolboxes/toolbox_yellow.dmi b/icons/obj/items/storage/toolboxes/toolbox_yellow.dmi new file mode 100644 index 00000000000..6a68ee9fd47 Binary files /dev/null and b/icons/obj/items/storage/toolboxes/toolbox_yellow.dmi differ diff --git a/icons/obj/items/storage/toolboxes/toolbox_yellow_striped.dmi b/icons/obj/items/storage/toolboxes/toolbox_yellow_striped.dmi new file mode 100644 index 00000000000..559fcabba2a Binary files /dev/null and b/icons/obj/items/storage/toolboxes/toolbox_yellow_striped.dmi differ diff --git a/icons/obj/items/tanks/tank_emergency_double.dmi b/icons/obj/items/tanks/tank_emergency_double.dmi index c8c9a03f69a..de7aeee9ac7 100644 Binary files a/icons/obj/items/tanks/tank_emergency_double.dmi and b/icons/obj/items/tanks/tank_emergency_double.dmi differ diff --git a/icons/obj/items/tanks/tank_emergency_engineer.dmi b/icons/obj/items/tanks/tank_emergency_engineer.dmi index 3d8309f917c..05d8ed2fba0 100644 Binary files a/icons/obj/items/tanks/tank_emergency_engineer.dmi and b/icons/obj/items/tanks/tank_emergency_engineer.dmi differ diff --git a/icons/obj/light_overlays.dmi b/icons/obj/light_overlays.dmi deleted file mode 100644 index 4440f265523..00000000000 Binary files a/icons/obj/light_overlays.dmi and /dev/null differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 8a35e9974fa..bc8876bdf83 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/lighting/biglight.dmi b/icons/obj/lighting/biglight.dmi new file mode 100644 index 00000000000..a648e65cc5d Binary files /dev/null and b/icons/obj/lighting/biglight.dmi differ diff --git a/icons/obj/lighting/flare.dmi b/icons/obj/lighting/flare.dmi new file mode 100644 index 00000000000..4b22743fcd4 Binary files /dev/null and b/icons/obj/lighting/flare.dmi differ diff --git a/icons/obj/lighting/flashdark.dmi b/icons/obj/lighting/flashdark.dmi new file mode 100644 index 00000000000..e170d7557c7 Binary files /dev/null and b/icons/obj/lighting/flashdark.dmi differ diff --git a/icons/obj/lighting/flashlight.dmi b/icons/obj/lighting/flashlight.dmi new file mode 100644 index 00000000000..125baa0191b Binary files /dev/null and b/icons/obj/lighting/flashlight.dmi differ diff --git a/icons/obj/lighting/floodlamp.dmi b/icons/obj/lighting/floodlamp.dmi new file mode 100644 index 00000000000..f83030c1a33 Binary files /dev/null and b/icons/obj/lighting/floodlamp.dmi differ diff --git a/icons/obj/lighting/glowstick.dmi b/icons/obj/lighting/glowstick.dmi new file mode 100644 index 00000000000..104783f5822 Binary files /dev/null and b/icons/obj/lighting/glowstick.dmi differ diff --git a/icons/obj/lighting/greenfloodlamp.dmi b/icons/obj/lighting/greenfloodlamp.dmi new file mode 100644 index 00000000000..2ff64bb8be1 Binary files /dev/null and b/icons/obj/lighting/greenfloodlamp.dmi differ diff --git a/icons/obj/lighting/greenlamp.dmi b/icons/obj/lighting/greenlamp.dmi new file mode 100644 index 00000000000..f752728b1eb Binary files /dev/null and b/icons/obj/lighting/greenlamp.dmi differ diff --git a/icons/obj/lighting/lamp.dmi b/icons/obj/lighting/lamp.dmi new file mode 100644 index 00000000000..eb34046610b Binary files /dev/null and b/icons/obj/lighting/lamp.dmi differ diff --git a/icons/obj/lighting/lantern.dmi b/icons/obj/lighting/lantern.dmi new file mode 100644 index 00000000000..6a41f129f1a Binary files /dev/null and b/icons/obj/lighting/lantern.dmi differ diff --git a/icons/obj/lighting/lavalamp.dmi b/icons/obj/lighting/lavalamp.dmi new file mode 100644 index 00000000000..062aabeba29 Binary files /dev/null and b/icons/obj/lighting/lavalamp.dmi differ diff --git a/icons/obj/lighting/maglight.dmi b/icons/obj/lighting/maglight.dmi new file mode 100644 index 00000000000..fcdd3fdb7d6 Binary files /dev/null and b/icons/obj/lighting/maglight.dmi differ diff --git a/icons/obj/lighting/partylight.dmi b/icons/obj/lighting/partylight.dmi new file mode 100644 index 00000000000..8d17a66f5b8 Binary files /dev/null and b/icons/obj/lighting/partylight.dmi differ diff --git a/icons/obj/lighting/penlight.dmi b/icons/obj/lighting/penlight.dmi new file mode 100644 index 00000000000..a7652eb693e Binary files /dev/null and b/icons/obj/lighting/penlight.dmi differ diff --git a/icons/obj/lighting/slime.dmi b/icons/obj/lighting/slime.dmi new file mode 100644 index 00000000000..202cf12ad41 Binary files /dev/null and b/icons/obj/lighting/slime.dmi differ diff --git a/icons/obj/machines/floodlight.dmi b/icons/obj/machines/floodlight.dmi index 3a5fb7a901d..8dca92897cd 100644 Binary files a/icons/obj/machines/floodlight.dmi and b/icons/obj/machines/floodlight.dmi differ diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi index 2a92c2ee889..7406a94168a 100644 Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ diff --git a/icons/obj/materials.dmi b/icons/obj/materials.dmi index de1dd479c04..665ee9d0a44 100644 Binary files a/icons/obj/materials.dmi and b/icons/obj/materials.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 91732f2782a..4a50ad97576 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/rubber_duck.dmi b/icons/obj/rubber_duck.dmi new file mode 100644 index 00000000000..3fdc0b9e2e1 Binary files /dev/null and b/icons/obj/rubber_duck.dmi differ diff --git a/icons/obj/structures/basketball.dmi b/icons/obj/structures/basketball.dmi new file mode 100644 index 00000000000..625efebe12d Binary files /dev/null and b/icons/obj/structures/basketball.dmi differ diff --git a/icons/obj/structures/pit.dmi b/icons/obj/structures/pit.dmi index 76ac50d185a..dcd845908e0 100644 Binary files a/icons/obj/structures/pit.dmi and b/icons/obj/structures/pit.dmi differ diff --git a/icons/obj/structures/volleyball.dmi b/icons/obj/structures/volleyball.dmi new file mode 100644 index 00000000000..269f60a1926 Binary files /dev/null and b/icons/obj/structures/volleyball.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index 41e04593521..18428a668c8 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/icons/obj/syringe_advanced.dmi b/icons/obj/syringe_advanced.dmi new file mode 100644 index 00000000000..e0d9a221e90 Binary files /dev/null and b/icons/obj/syringe_advanced.dmi differ diff --git a/icons/obj/syringe_cryo.dmi b/icons/obj/syringe_cryo.dmi new file mode 100644 index 00000000000..10d3697cca8 Binary files /dev/null and b/icons/obj/syringe_cryo.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi new file mode 100644 index 00000000000..b8b8d5b867c Binary files /dev/null and b/icons/obj/toy.dmi differ diff --git a/icons/obj/turbolift_preview_5x5.dmi b/icons/obj/turbolift_preview_5x5.dmi new file mode 100644 index 00000000000..e054a6b9aac Binary files /dev/null and b/icons/obj/turbolift_preview_5x5.dmi differ diff --git a/icons/obj/volleyball.dmi b/icons/obj/volleyball.dmi new file mode 100644 index 00000000000..33edf34da7e Binary files /dev/null and b/icons/obj/volleyball.dmi differ diff --git a/icons/obj/water_balloon.dmi b/icons/obj/water_balloon.dmi new file mode 100644 index 00000000000..6fa5a8d1407 Binary files /dev/null and b/icons/obj/water_balloon.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 54547dd45c3..f7fcf2dd7e3 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/screen/maneuver.dmi b/icons/screen/maneuver.dmi new file mode 100644 index 00000000000..0a4676979c2 Binary files /dev/null and b/icons/screen/maneuver.dmi differ diff --git a/icons/turf/exterior/rock.dmi b/icons/turf/exterior/rock.dmi new file mode 100644 index 00000000000..8a715fd501a Binary files /dev/null and b/icons/turf/exterior/rock.dmi differ diff --git a/icons/turf/flooring/crystal.dmi b/icons/turf/flooring/crystal.dmi index 00c7a13cb7e..7ff20fb8744 100644 Binary files a/icons/turf/flooring/crystal.dmi and b/icons/turf/flooring/crystal.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index ab24d9266ab..a6edc47a759 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi index 12b1b6d038b..2d201155326 100644 Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index 9c821ae2d4a..e615c30d407 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/icons/turf/walls/_previews.dmi b/icons/turf/walls/_previews.dmi index 9089954cdd2..0ce6dd767e2 100644 Binary files a/icons/turf/walls/_previews.dmi and b/icons/turf/walls/_previews.dmi differ diff --git a/icons/turf/walls/cult.dmi b/icons/turf/walls/cult.dmi index 1a790b768c1..5b2dd836c3b 100644 Binary files a/icons/turf/walls/cult.dmi and b/icons/turf/walls/cult.dmi differ diff --git a/icons/turf/walls/debug.dmi b/icons/turf/walls/debug.dmi index 2de94776c40..76e8845f752 100644 Binary files a/icons/turf/walls/debug.dmi and b/icons/turf/walls/debug.dmi differ diff --git a/icons/turf/walls/metal.dmi b/icons/turf/walls/metal.dmi index a8ab0f10d86..8199a29f39d 100644 Binary files a/icons/turf/walls/metal.dmi and b/icons/turf/walls/metal.dmi differ diff --git a/icons/turf/walls/natural.dmi b/icons/turf/walls/natural.dmi index 40cf525581f..d8509d2f1ba 100644 Binary files a/icons/turf/walls/natural.dmi and b/icons/turf/walls/natural.dmi differ diff --git a/icons/turf/walls/plastic.dmi b/icons/turf/walls/plastic.dmi index 899f2a30a72..034c494a357 100644 Binary files a/icons/turf/walls/plastic.dmi and b/icons/turf/walls/plastic.dmi differ diff --git a/icons/turf/walls/reinforced.dmi b/icons/turf/walls/reinforced.dmi index b889f3c8327..ec9936fe157 100644 Binary files a/icons/turf/walls/reinforced.dmi and b/icons/turf/walls/reinforced.dmi differ diff --git a/icons/turf/walls/solid.dmi b/icons/turf/walls/solid.dmi index d961715cf64..ea504b65330 100644 Binary files a/icons/turf/walls/solid.dmi and b/icons/turf/walls/solid.dmi differ diff --git a/icons/turf/walls/stone.dmi b/icons/turf/walls/stone.dmi index 313bca3b564..285201a5e8b 100644 Binary files a/icons/turf/walls/stone.dmi and b/icons/turf/walls/stone.dmi differ diff --git a/icons/turf/walls/wood.dmi b/icons/turf/walls/wood.dmi index c1ee1f9eec1..9b2304dcec8 100644 Binary files a/icons/turf/walls/wood.dmi and b/icons/turf/walls/wood.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index d3bc6dcb54d..9f1e923dc44 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -3,10 +3,10 @@ set name = "Wiki" set desc = "Visit the wiki." set hidden = 1 - if(config.wikiurl) + if(get_config_value(/decl/config/text/wikiurl)) if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") return - send_link(src, config.wikiurl) + send_link(src, get_config_value(/decl/config/text/wikiurl)) else to_chat(src, SPAN_WARNING("The wiki URL is not set in the server configuration.")) return @@ -15,10 +15,10 @@ set name = "GitHub" set desc = "Visit the GitHub repository." set hidden = 1 - if(config.githuburl) + if(get_config_value(/decl/config/text/githuburl)) if(alert("This will open GitHub in your browser. Are you sure?",,"Yes","No")=="No") return - send_link(src, config.githuburl) + send_link(src, get_config_value(/decl/config/text/githuburl)) else to_chat(src, SPAN_WARNING("The github URL is not set in the server configuration.")) return @@ -27,10 +27,10 @@ set name = "Bug Report" set desc = "Visit the GitHub repository to report an issue or bug." set hidden = 1 - if(config.issuereporturl) + if(get_config_value(/decl/config/text/issuereporturl)) if(alert("This will open GitHub in your browser. Are you sure?",,"Yes","No")=="No") return - send_link(src, config.issuereporturl) + send_link(src, get_config_value(/decl/config/text/issuereporturl)) else to_chat(src, SPAN_WARNING("The issue report URL is not set in the server configuration.")) return @@ -39,10 +39,10 @@ set name = "Forum" set desc = "Visit the forum." set hidden = 1 - if(config.forumurl) + if(get_config_value(/decl/config/text/forumurl)) if(alert("This will open the forum in your browser. Are you sure?",,"Yes","No")=="No") return - send_link(src, config.forumurl) + send_link(src, get_config_value(/decl/config/text/forumurl)) else to_chat(src, SPAN_WARNING("The forum URL is not set in the server configuration.")) return @@ -51,10 +51,10 @@ set name = "Discord" set desc = "Visit the Discord server." set hidden = 1 - if(config.discordurl) + if(get_config_value(/decl/config/text/discordurl)) if(alert("This will open the Discord invition link in your browser. Are you sure?",,"Yes","No")=="No") return - send_link(src, config.discordurl) + send_link(src, get_config_value(/decl/config/text/discordurl)) else to_chat(src, SPAN_WARNING("The Discord server URL is not set in the server configuration.")) return diff --git a/interface/skin.dmf b/interface/skin.dmf index 1201b778688..3778ffcd7c1 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -148,6 +148,7 @@ window "mainwindow" anchor1 = 0,0 anchor2 = 100,100 saved-params = "splitter" + left = "mapwindow" right = "rpane" is-vert = true elem "asset_cache_browser" @@ -192,8 +193,6 @@ window "mapwindow" font-size = 7 is-default = true saved-params = "icon-size;zoom-mode" - on-show = ".winset\"mainwindow.split.left=mapwindow\"" - on-hide = ".winset\"mainwindow.split.left=\"" elem "lobbybrowser" type = BROWSER pos = 0,0 @@ -276,11 +275,12 @@ window "rpane" is-pane = true elem "rpanewindow" type = CHILD - pos = 0,0 - size = 640x474 + pos = 0,30 + size = 0x0 anchor1 = 0,0 anchor2 = 100,100 saved-params = "splitter" + left = "infowindow" right = "outputwindow" is-vert = false elem "github" @@ -357,7 +357,6 @@ window "rpane" size = 60x15 anchor1 = none anchor2 = none - is-visible = false saved-params = "is-checked" text = "Text" command = ".winset \"rpanewindow.left=;\"" @@ -370,7 +369,6 @@ window "rpane" size = 60x15 anchor1 = none anchor2 = none - is-visible = false saved-params = "is-checked" text = "Info" command = ".winset \"rpanewindow.left=infowindow\"" @@ -432,6 +430,6 @@ window "infowindow" is-default = true saved-params = "" highlight-color = #00aa00 - on-show = ".winset\"rpane.infob.is-visible=true;rpane.textb.is-visible=true rpane.infob.is-checked=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=infowindow\"" - on-hide = ".winset\"rpane.infob.is-visible=false;rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=\"" + on-show = ".winset\"rpane.infob.is-checked=true\"" + on-hide = ".winset\"rpane.infob.is-checked=false\"" diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index fa63eb870b3..0fc7ced3293 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -1272,14 +1272,14 @@ /area/map_template/rescue_base/base) "cG" = ( /obj/structure/table/reinforced, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /obj/item/bodybag/cryobag, /obj/item/bodybag/cryobag, /obj/item/bodybag/cryobag, @@ -2449,24 +2449,18 @@ /turf/simulated/wall/titanium, /area/map_template/rescue_base/start) "eV" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "rescuebridge"; name = "Cockpit Blast Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, /turf/simulated/floor/plating, /area/map_template/rescue_base/start) "eW" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "rescuedock"; name = "Blast Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2483,7 +2477,6 @@ "eY" = ( /obj/structure/table/steel_reinforced, /obj/machinery/button/blast_door{ - icon_state = "doorctrl0"; id_tag = "rescuebridge"; name = "Window Shutters Control"; pixel_y = -4 @@ -2580,7 +2573,6 @@ /area/map_template/rescue_base/start) "fl" = ( /obj/machinery/button/blast_door{ - icon_state = "doorctrl0"; id_tag = "rescuedock"; name = "Window Shutters Control"; pixel_x = 24; @@ -2697,13 +2689,10 @@ }, /area/map_template/rescue_base/base) "fC" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "rescuebridge"; name = "Cockpit Blast Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2759,13 +2748,10 @@ /turf/simulated/floor/tiled/dark, /area/map_template/rescue_base/start) "fJ" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "rescueeva"; name = "Blast Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2878,7 +2864,6 @@ /obj/item/tank/jetpack/carbondioxide, /obj/item/tank/jetpack/carbondioxide, /obj/machinery/button/blast_door{ - icon_state = "doorctrl0"; id_tag = "rescueeva"; name = "Window Shutters Control"; pixel_x = 24; @@ -3040,8 +3025,8 @@ /obj/item/chems/syringe, /obj/item/chems/syringe/antibiotic, /obj/item/chems/syringe/antibiotic, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /turf/simulated/floor/tiled/white, /area/map_template/rescue_base/start) "gD" = ( @@ -3150,7 +3135,6 @@ }, /obj/structure/iv_drip, /obj/machinery/button/blast_door{ - icon_state = "doorctrl0"; id_tag = "rescueinfirm"; name = "Window Shutters Control"; pixel_x = 24; @@ -3166,13 +3150,10 @@ /area/map_template/rescue_base/base) "gU" = ( /obj/effect/wallframe_spawn/reinforced/titanium, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "rescuebridge"; name = "Blast Shutters"; - opacity = FALSE }, /obj/effect/paint/blue, /turf/simulated/floor/plating, @@ -3219,13 +3200,10 @@ /area/map_template/rescue_base/start) "hb" = ( /obj/effect/wallframe_spawn/reinforced/titanium, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "rescueinfirm"; name = "Blast Shutters"; - opacity = FALSE }, /obj/effect/paint/blue, /turf/simulated/floor/plating, diff --git a/maps/antag_spawn/heist/heist_antag.dm b/maps/antag_spawn/heist/heist_antag.dm index cceadf3044b..13d4d0f48ef 100644 --- a/maps/antag_spawn/heist/heist_antag.dm +++ b/maps/antag_spawn/heist/heist_antag.dm @@ -64,6 +64,6 @@ return 0 return 1 -/decl/special_role/raider/equip(var/mob/living/carbon/human/player) +/decl/special_role/raider/equip_role(var/mob/living/carbon/human/player) default_outfit = LAZYACCESS(outfits_per_species, player.species.name) || initial(default_outfit) . = ..() diff --git a/maps/antag_spawn/heist/heist_base.dmm b/maps/antag_spawn/heist/heist_base.dmm index a23708880ab..520ef47eb46 100644 --- a/maps/antag_spawn/heist/heist_base.dmm +++ b/maps/antag_spawn/heist/heist_base.dmm @@ -1002,7 +1002,6 @@ /area/map_template/skipjack_station/start) "cx" = ( /obj/machinery/door/airlock/external{ - icon_state = "door_closed"; id_tag = "raider_northwest_lock" }, /obj/machinery/shield_diffuser, @@ -1017,12 +1016,9 @@ /turf/simulated/wall/raidershuttle, /area/map_template/skipjack_station/start) "cz" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "SkipjackShuttersNorth"; name = "Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1179,7 +1175,6 @@ /area/map_template/skipjack_station/start) "cS" = ( /obj/machinery/door/airlock/external{ - icon_state = "door_closed"; id_tag = "raider_southwest_lock" }, /obj/machinery/atmospherics/pipe/simple/visible, @@ -1383,13 +1378,10 @@ /turf/simulated/floor/plating, /area/map_template/skipjack_station/start) "dt" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1412,13 +1404,10 @@ /turf/simulated/floor/plating, /area/map_template/skipjack_station/start) "dy" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 8; - icon_state = "shutter0"; id_tag = "SkipjackShuttersEast"; name = "Skipjack Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1486,13 +1475,10 @@ /turf/simulated/floor/plating, /area/map_template/skipjack_station/start) "dI" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced/titanium, /turf/simulated/floor/plating, diff --git a/maps/antag_spawn/heist/heist_outfit.dm b/maps/antag_spawn/heist/heist_outfit.dm index 5f78a675d5d..feadc94aa71 100644 --- a/maps/antag_spawn/heist/heist_outfit.dm +++ b/maps/antag_spawn/heist/heist_outfit.dm @@ -69,7 +69,7 @@ randomize_clothing() . = ..() -/decl/hierarchy/outfit/raider/equip(mob/living/carbon/human/H, rank, assignment, equip_adjustments) +/decl/hierarchy/outfit/raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) randomize_clothing() . = ..() if(. && H) diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index b16f6bf63f4..d04ede53ceb 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -44,8 +44,6 @@ }, /obj/effect/paint/red, /obj/machinery/door/blast/regular/open{ - density = FALSE; - icon_state = "pdoor0"; id_tag = "merc_external" }, /turf/simulated/floor/plating, @@ -60,8 +58,6 @@ }, /obj/effect/paint/red, /obj/machinery/door/blast/regular/open{ - density = FALSE; - icon_state = "pdoor0"; id_tag = "merc_external" }, /turf/simulated/floor/plating, @@ -83,9 +79,7 @@ icon_state = "0-2" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -136,9 +130,7 @@ icon_state = "1-4" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -194,9 +186,7 @@ icon_state = "0-8" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -211,9 +201,7 @@ icon_state = "0-2" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/black, @@ -228,9 +216,7 @@ "av" = ( /obj/effect/wallframe_spawn/reinforced/titanium, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_bsa_shutters" }, /obj/effect/paint/black, @@ -267,9 +253,7 @@ icon_state = "0-4" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/black, @@ -337,8 +321,6 @@ dir = 8 }, /obj/machinery/door/blast/regular/open{ - density = FALSE; - icon_state = "pdoor0"; id_tag = "merc_bsa" }, /turf/simulated/floor/reinforced, @@ -460,9 +442,7 @@ icon_state = "0-8" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -486,13 +466,13 @@ /obj/item/clothing/gloves/latex, /obj/item/clothing/mask/surgical, /obj/item/bodybag/cryobag, -/obj/item/chems/ivbag/nanoblood, +/obj/item/chems/ivbag/blood/nanoblood, /obj/item/storage/firstaid/adv, /turf/simulated/floor/tiled/white, /area/map_template/merc_shuttle) "aT" = ( /obj/structure/iv_drip, -/obj/item/chems/ivbag/nanoblood, +/obj/item/chems/ivbag/blood/nanoblood, /obj/structure/window/reinforced/crescent{ dir = 4 }, @@ -549,9 +529,7 @@ "aY" = ( /obj/effect/wallframe_spawn/reinforced_borosilicate, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 8; - icon_state = "pdoor0"; id_tag = "merc_fuel" }, /obj/effect/paint/black, @@ -612,9 +590,7 @@ /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/red, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_airlock" }, /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -637,9 +613,7 @@ "bi" = ( /obj/effect/wallframe_spawn/reinforced/titanium, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -835,9 +809,7 @@ "bz" = ( /obj/effect/wallframe_spawn/reinforced/titanium, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_airlock" }, /obj/effect/paint/red, @@ -1001,8 +973,6 @@ /obj/effect/wallframe_spawn/reinforced_borosilicate, /obj/machinery/atmospherics/pipe/manifold4w/visible/fuel, /obj/machinery/door/blast/regular/open{ - density = FALSE; - icon_state = "pdoor0"; id_tag = "merc_fuel" }, /obj/effect/paint/black, @@ -1015,8 +985,6 @@ dir = 4 }, /obj/machinery/door/blast/regular/open{ - density = FALSE; - icon_state = "pdoor0"; id_tag = "merc_fuel" }, /obj/effect/paint/black, @@ -1118,9 +1086,7 @@ icon_state = "0-2" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -1288,9 +1254,7 @@ icon_state = "1-8" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -1432,9 +1396,7 @@ icon_state = "0-4" }, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/structure/cable{ @@ -2408,9 +2370,7 @@ "HZ" = ( /obj/effect/wallframe_spawn/reinforced/titanium, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "merc_external" }, /obj/effect/paint/red, @@ -2559,7 +2519,7 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/merc_spawn) "NX" = ( -/obj/item/chems/ivbag/nanoblood, +/obj/item/chems/ivbag/blood/nanoblood, /turf/space, /area/space) "NZ" = ( diff --git a/maps/antag_spawn/ninja/ninja_base.dmm b/maps/antag_spawn/ninja/ninja_base.dmm index d28ec0ce3a6..25dc5a784af 100644 --- a/maps/antag_spawn/ninja/ninja_base.dmm +++ b/maps/antag_spawn/ninja/ninja_base.dmm @@ -78,8 +78,8 @@ /area/map_template/ninja_dojo/dojo) "an" = ( /obj/structure/table/glass, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /obj/structure/window/reinforced/crescent{ dir = 4 }, @@ -1232,12 +1232,9 @@ id_tag = "ninja_shuttle_outer"; name = "Ship External Access" }, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "ninjadoor"; name = "Blast Door"; - opacity = FALSE }, /turf/unsimulated/floor{ icon_state = "dark" diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index 2a4d997800d..de8053cb18f 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -8,13 +8,10 @@ /area/space) "ac" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/space) @@ -58,11 +55,8 @@ /turf/simulated/wall, /area/ship/scrap/escape_port) "ai" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "engwindow"; - opacity = FALSE }, /turf/simulated/floor/airless, /area/ship/scrap/escape_port) @@ -93,13 +87,10 @@ /turf/simulated/wall/r_wall, /area/ship/scrap/cargo/lower) "am" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -109,11 +100,8 @@ /turf/simulated/wall, /area/ship/scrap/cargo/lower) "ap" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "engwindow"; - opacity = FALSE }, /turf/simulated/floor/airless, /area/ship/scrap/escape_star) @@ -130,13 +118,10 @@ /area/ship/scrap/escape_port) "at" = ( /obj/machinery/atmospherics/pipe/simple/hidden, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/ship/scrap/cargo/lower) @@ -146,13 +131,10 @@ pixel_x = 25 }, /obj/machinery/atmospherics/pipe/simple/hidden, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/ship/scrap/cargo/lower) @@ -532,12 +514,9 @@ /turf/simulated/floor/tiled/dark/airless, /area/ship/scrap/crew/dorms1) "bi" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -702,12 +681,9 @@ /turf/simulated/floor/tiled/dark/airless, /area/ship/scrap/crew/dorms1) "bA" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -782,7 +758,7 @@ }, /obj/structure/closet/coffin, /obj/random/drinkbottle, -/obj/item/contraband/poster, +/obj/item/poster, /turf/simulated/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "bJ" = ( @@ -1057,12 +1033,9 @@ /turf/simulated/wall/r_wall, /area/ship/scrap/crew/dorms2) "cm" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -1208,12 +1181,9 @@ /turf/simulated/floor/tiled/dark/airless, /area/ship/scrap/crew/dorms2) "cC" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -1513,12 +1483,9 @@ /turf/simulated/floor/tiled/dark/airless, /area/ship/scrap/crew/dorms3) "dk" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -1628,12 +1595,9 @@ /turf/simulated/floor/tiled/dark/airless, /area/ship/scrap/crew/dorms3) "dw" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -2193,13 +2157,10 @@ pixel_x = -12; pixel_y = 20 }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/ship/scrap/maintenance/eva) @@ -2454,13 +2415,10 @@ /turf/simulated/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "eY" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 8ebf33ec165..e8b24a4f380 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -4,25 +4,19 @@ /area/space) "ab" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, /area/ship/scrap/command/bridge) "ac" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -30,13 +24,10 @@ "ad" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/ship/scrap/command/bridge) @@ -207,13 +198,10 @@ /area/ship/scrap/command/captain) "aD" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -324,12 +312,9 @@ /area/ship/scrap/command/captain) "aN" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -418,12 +403,9 @@ /area/ship/scrap/command/captain) "aW" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -503,13 +485,10 @@ /area/ship/scrap/command/captain) "bd" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -532,13 +511,10 @@ /area/space) "bh" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -586,12 +562,9 @@ /area/ship/scrap/dock) "bm" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/space) @@ -731,12 +704,9 @@ /turf/simulated/floor/tiled/usedup, /area/ship/scrap/dock) "bx" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/button/access/interior{ id_tag = "bearcat_dock_port"; @@ -834,12 +804,9 @@ /turf/simulated/floor/tiled/usedup, /area/ship/scrap/dock) "bF" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/button/access/interior{ id_tag = "bearcat_starboard_dock"; @@ -908,12 +875,9 @@ /area/ship/scrap/dock) "bK" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -925,12 +889,9 @@ /obj/machinery/atmospherics/portables_connector{ dir = 4 }, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/portable_atmospherics/canister/empty/air, /obj/structure/window/reinforced{ @@ -991,12 +952,9 @@ /obj/machinery/atmospherics/portables_connector{ dir = 8 }, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/portable_atmospherics/canister/empty/air, /obj/structure/window/reinforced{ @@ -1007,12 +965,9 @@ "bS" = ( /obj/structure/lattice, /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/usedup, /area/space) @@ -1028,12 +983,9 @@ /area/ship/scrap/dock) "bV" = ( /obj/structure/lattice, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/usedup, @@ -1051,12 +1003,9 @@ /turf/space, /area/space) "bZ" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/usedup, @@ -1065,23 +1014,17 @@ /turf/simulated/floor/tiled/usedup, /area/ship/scrap/crew/hallway/port) "cc" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/usedup, /area/ship/scrap/dock) "ce" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/usedup, @@ -1165,13 +1108,10 @@ /area/ship/scrap/crew/toilets) "cs" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -1239,13 +1179,10 @@ /area/ship/scrap/crew/cryo) "cC" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/usedup, @@ -1377,12 +1314,9 @@ /area/ship/scrap/crew/cryo) "cQ" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -1393,7 +1327,7 @@ dir = 4; icon_state = "right"; name = "Reception Window"; - opacity = TRUE + opacity = 1 }, /obj/machinery/light/small{ dir = 8; @@ -1409,7 +1343,7 @@ dir = 4; icon_state = "right"; name = "Reception Window"; - opacity = TRUE + opacity = 1 }, /obj/effect/floor_decal/corner/white/diagonal, /turf/simulated/floor/tiled/usedup, @@ -1572,12 +1506,9 @@ /area/ship/scrap/crew/cryo) "dh" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -1928,12 +1859,9 @@ /area/ship/scrap/maintenance/engine/port) "dS" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -2069,24 +1997,17 @@ /area/ship/scrap/crew/medbay) "eg" = ( /obj/structure/iv_drip, -/obj/structure/closet/medical_wall{ - name = "pill cabinet"; +/obj/structure/closet/secure_closet/medical_wall/pills{ + req_access = null; pixel_x = 26 }, -/obj/item/storage/pill_bottle/antibiotics, -/obj/item/storage/pill_bottle/painkillers, -/obj/item/storage/pill_bottle/antitox, -/obj/item/storage/pill_bottle/burn_meds, /turf/simulated/floor/tiled/white, /area/ship/scrap/crew/medbay) "ei" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -2331,12 +2252,9 @@ /area/ship/scrap/crew/medbay) "ez" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -2409,8 +2327,8 @@ dir = 1 }, /obj/effect/floor_decal/corner/red/diagonal, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /turf/simulated/floor/tiled/usedup, /area/ship/scrap/crew/kitchen) "eG" = ( @@ -2930,12 +2848,9 @@ /turf/simulated/wall, /area/ship/scrap/maintenance/engine/starboard) "fE" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/port) @@ -2948,12 +2863,9 @@ /area/space) "fH" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ @@ -3072,12 +2984,9 @@ /area/ship/scrap/unused) "fT" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ @@ -3338,12 +3247,9 @@ /area/space) "gy" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -4300,12 +4206,9 @@ /area/ship/scrap/maintenance/power) "ic" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor/usedup, @@ -4366,11 +4269,8 @@ /turf/simulated/wall/r_wall, /area/ship/scrap/maintenance/engine/aft) "ik" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "engwindow"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4594,9 +4494,7 @@ /obj/machinery/door/window/northleft, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "radaway"; - opacity = FALSE }, /obj/structure/sign/warning/radioactive{ pixel_x = -32 @@ -4749,9 +4647,7 @@ }, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "radaway"; - opacity = FALSE }, /obj/machinery/meter/turf, /turf/simulated/floor/usedup, @@ -5078,12 +4974,9 @@ /turf/space, /area/ship/scrap/maintenance/engine/aft) "jY" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/structure/sign/warning/hot_exhaust{ pixel_y = 32 @@ -5091,12 +4984,9 @@ /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/aft) "jZ" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/aft) @@ -5164,12 +5054,9 @@ /turf/simulated/wall/r_wall, /area/ship/scrap/crew/hallway/port) "oR" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/starboard) diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index 99d6f616ca3..ddfb275ee08 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -116,9 +116,11 @@ corpse.real_name = "Captain" corpse.name = "Captain" var/decl/hierarchy/outfit/outfit = outfit_by_type(/decl/hierarchy/outfit/deadcap) - outfit.equip(corpse) - corpse.adjustOxyLoss(corpse.maxHealth) - corpse.setBrainLoss(corpse.maxHealth) + outfit.equip_outfit(corpse) + var/corpse_health = corpse.get_max_health() + corpse.adjustOxyLoss(corpse_health) + corpse.setBrainLoss(corpse_health) + corpse.death(FALSE, deathmessage = "no message", show_dead_message = FALSE) var/obj/structure/bed/chair/C = locate() in T if(C) C.buckle_mob(corpse) diff --git a/maps/away/bearcat/bearcat_areas.dm b/maps/away/bearcat/bearcat_areas.dm index 1ab4dbada43..afb062f609b 100644 --- a/maps/away/bearcat/bearcat_areas.dm +++ b/maps/away/bearcat/bearcat_areas.dm @@ -151,7 +151,7 @@ req_access = list(access_bearcat) /area/ship/scrap/command/bridge - name = "Bridge" + name = "Hauler Bridge" icon_state = "bridge" req_access = list(access_bearcat) diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index 2cc2841c9cd..1e37205ff36 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -106,13 +106,10 @@ "an" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "casino_bridge"; name = "Casino Bridge Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/plating, /area/casino/casino_bridge) @@ -138,13 +135,10 @@ "at" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "casino_bridge"; name = "Casino Bridge Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/plating, /area/casino/casino_bridge) @@ -192,7 +186,6 @@ /area/casino/casino_maintenance) "aD" = ( /obj/machinery/door/airlock/external{ - icon_state = "door_closed"; id_tag = "casino_dock_outer"; name = "Docking Port Airlock" }, @@ -284,7 +277,6 @@ "aU" = ( /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/door/airlock/external{ - icon_state = "door_closed"; id_tag = "casino_dock_inner"; name = "Docking Port Airlock" }, @@ -926,7 +918,6 @@ "cD" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "casino_shuttle_control" }, /obj/machinery/door/firedoor, @@ -1813,13 +1804,10 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/tiled, /area/casino/casino_security) @@ -1907,12 +1895,9 @@ icon_state = "4-8" }, /obj/machinery/door/blast/regular{ - density = FALSE; dir = 4; - icon_state = "pdoor0"; id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/tiled, /area/casino/casino_security) @@ -1949,9 +1934,7 @@ "fA" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ - density = FALSE; dir = 8; - icon_state = "pdoor0"; id_tag = "casino_main" }, /obj/machinery/door/firedoor, @@ -2153,13 +2136,10 @@ /obj/machinery/door/airlock{ name = "Casino" }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Doors"; - opacity = FALSE }, /turf/simulated/floor/plating, /area/casino/casino_security) @@ -4574,7 +4554,6 @@ "mZ" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "Starboard wide window BD" }, /turf/simulated/floor/plating, diff --git a/maps/away/derelict/derelict-station.dmm b/maps/away/derelict/derelict-station.dmm index c6a72c97365..a2da531d305 100644 --- a/maps/away/derelict/derelict-station.dmm +++ b/maps/away/derelict/derelict-station.dmm @@ -1829,7 +1829,6 @@ /area/constructionsite/maintenance) "gf" = ( /obj/machinery/door/airlock/highsecurity{ - icon_state = "door_closed"; name = "AI Upload Access" }, /turf/simulated/floor/bluegrid/airless, @@ -1861,7 +1860,6 @@ /area/constructionsite/ai) "gn" = ( /obj/machinery/door/airlock/highsecurity{ - icon_state = "door_closed"; name = "AI Upload" }, /turf/simulated/floor/bluegrid/airless, @@ -2043,7 +2041,6 @@ /area/constructionsite/hallway/aft) "gZ" = ( /obj/machinery/door/airlock/highsecurity{ - icon_state = "door_closed"; name = "AI Upload Access" }, /turf/simulated/floor/bluegrid/airless, @@ -2169,7 +2166,7 @@ "hz" = ( /obj/item/chems/ivbag, /obj/item/chems/ivbag, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, /obj/structure/closet/medical_wall{ name = "Blood Closet" }, @@ -3382,7 +3379,7 @@ /area/AIsattele) "lZ" = ( /obj/machinery/emitter{ - anchored = TRUE; + anchored = 1; dir = 4; state = 2 }, @@ -3394,7 +3391,7 @@ /area/constructionsite/engineering) "mb" = ( /obj/machinery/emitter{ - anchored = TRUE; + anchored = 1; dir = 8; state = 2 }, diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index b969cde4ae1..9371428eada 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -24,8 +24,7 @@ turns_per_move = 5 meat_type = /obj/item/chems/food/sharkmeat speed = 2 - maxHealth = 100 - health = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/bite/strong break_stuff_probability = 35 faction = "shark" @@ -64,7 +63,7 @@ desc = "A fillet of cosmoshark meat." icon_state = "fishfillet" filling_color = "#cecece" - center_of_mass = @"{'x':17,'y':13}" + center_of_mass = @'{"x":17,"y":13}' bitesize = 8 /obj/item/chems/food/sharkmeat/populate_reagents() @@ -80,7 +79,7 @@ icon_state = "net_f" anchored = TRUE layer = CATWALK_LAYER//probably? Should cover cables, pipes and the rest of objects that are secured on the floor - maxhealth = 100 + max_health = 100 /obj/structure/net/Initialize(var/mapload) . = ..() @@ -93,16 +92,17 @@ continue N.update_connections() -/obj/structure/net/get_examined_damage_string(health_ratio) - if(maxhealth == -1) +/obj/structure/net/get_examined_damage_string() + if(!can_take_damage()) return - if(health_ratio >= 1) + var/health_percent = get_percent_health() + if(health_percent >= 100) return SPAN_NOTICE("It looks fully intact.") - else if (health_ratio < 0.2) + else if (health_percent < 20) return SPAN_DANGER("\The [src] is barely hanging on by the last few threads.") - else if (health_ratio < 0.5) + else if (health_percent < 50) return SPAN_WARNING("Large swathes of \the [src] have been cut.") - else if (health_ratio < 0.9) + else return SPAN_NOTICE("A few strands of \the [src] have been severed.") /obj/structure/net/attackby(obj/item/W, mob/user) @@ -176,7 +176,7 @@ throwforce = 5 throw_speed = 5 throw_range = 10 - material = /decl/material/solid/cloth + material = /decl/material/solid/organic/cloth matter = list(/decl/material/solid/metal/plasteel = MATTER_AMOUNT_REINFORCEMENT) max_amount = 30 center_of_mass = null diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index e1ecd33f77a..9e437c95ab5 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -1289,7 +1289,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /turf/simulated/floor/plating, @@ -1411,7 +1410,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /turf/simulated/floor/plating, @@ -1503,7 +1501,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /obj/machinery/button/access/exterior{ @@ -1717,7 +1714,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /obj/machinery/button/access/exterior{ @@ -2046,7 +2042,6 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /turf/simulated/floor/plating, @@ -2232,7 +2227,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /turf/simulated/floor/plating, @@ -3956,8 +3950,8 @@ dir = 1 }, /obj/structure/bookcase, -/obj/item/book/manual/anomaly_testing, -/obj/item/book/manual/anomaly_spectroscopy, +/obj/item/book/fluff/anomaly_testing, +/obj/item/book/fluff/anomaly_spectroscopy, /turf/simulated/floor/tiled, /area/errant_pisces/science_wing) "kB" = ( @@ -3968,7 +3962,7 @@ /area/errant_pisces/science_wing) "kC" = ( /obj/structure/bookcase, -/obj/item/book/manual/materials_chemistry_analysis, +/obj/item/book/fluff/materials_chemistry_analysis, /turf/simulated/floor/tiled, /area/errant_pisces/science_wing) "kD" = ( @@ -4884,7 +4878,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /obj/machinery/door/firedoor, @@ -5443,7 +5436,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /obj/machinery/door/firedoor, @@ -5789,7 +5781,6 @@ "pp" = ( /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /turf/simulated/floor/reinforced/airless, @@ -6335,7 +6326,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Harpoon_perimeter_blast" }, /obj/machinery/door/firedoor, diff --git a/maps/away/errant_pisces/errant_pisces_areas.dm b/maps/away/errant_pisces/errant_pisces_areas.dm index f40a349869b..dedee8fc025 100644 --- a/maps/away/errant_pisces/errant_pisces_areas.dm +++ b/maps/away/errant_pisces/errant_pisces_areas.dm @@ -86,7 +86,7 @@ icon_state = "fishing_wing" /area/errant_pisces/bridge - name = "Bridge" + name = "Trawler Bridge" icon_state = "bridge" /area/errant_pisces/prod_storage diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index dd5d4ad95e5..505f535ae28 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -177,9 +177,7 @@ "ay" = ( /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "merch_radaway"; - opacity = FALSE }, /obj/machinery/door/window/northleft{ dir = 8; @@ -207,9 +205,7 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "merch_radaway"; - opacity = FALSE }, /turf/simulated/floor, /area/liberia/engineeringreactor) @@ -324,7 +320,7 @@ dir = 9 }, /obj/structure/closet/emcloset{ - anchored = TRUE; + anchored = 1; name = "anchored emergency closet" }, /turf/simulated/floor/tiled/techfloor/grid, @@ -643,13 +639,10 @@ /area/liberia/hallway) "bo" = ( /obj/effect/wallframe_spawn/reinforced/titanium, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; - opacity = FALSE }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, @@ -738,12 +731,12 @@ req_access = newlist() }, /obj/item/storage/secure/briefcase, -/obj/item/contraband/poster, -/obj/item/contraband/poster, -/obj/item/contraband/poster, -/obj/item/contraband/poster, -/obj/item/contraband/poster, -/obj/item/contraband/poster, +/obj/item/poster, +/obj/item/poster, +/obj/item/poster, +/obj/item/poster, +/obj/item/poster, +/obj/item/poster, /obj/item/knife/folding/combat/balisong, /obj/item/knife/folding/combat/balisong, /turf/simulated/floor/tiled/steel_grid, @@ -835,13 +828,10 @@ /area/liberia/mule) "bC" = ( /obj/effect/wallframe_spawn/reinforced/titanium, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; - opacity = FALSE }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, @@ -1270,13 +1260,10 @@ /area/liberia/mule) "cp" = ( /obj/effect/wallframe_spawn/reinforced/titanium, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "merchantdesk"; name = "Merchant Desk Shutters"; - opacity = FALSE }, /obj/effect/paint/silver, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1578,13 +1565,10 @@ }, /obj/structure/table/steel, /obj/effect/paint/silver, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "merchantdesk"; name = "Merchant Desk Shutters"; - opacity = FALSE }, /obj/structure/cable/blue{ icon_state = "4-8" @@ -2454,7 +2438,7 @@ }, /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/closet/emcloset{ - anchored = TRUE; + anchored = 1; name = "anchored emergency closet" }, /turf/simulated/floor/tiled/monotile, @@ -3078,10 +3062,10 @@ pixel_x = 24; pixel_y = 4 }, -/obj/item/chems/ivbag/blood/OPlus, -/obj/item/chems/ivbag/blood/OPlus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/oplus, +/obj/item/chems/ivbag/blood/oplus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /obj/item/chems/food/candy/donor, /obj/item/chems/food/candy/donor, /obj/item/chems/food/candy/donor, @@ -5017,7 +5001,7 @@ /area/liberia/bridge) "jD" = ( /obj/structure/table/glass, -/obj/machinery/faxmachine{ +/obj/machinery/faxmachine/mapped{ req_access = list("ACCESS_MERCHANT"); }, /obj/effect/floor_decal/corner/blue/mono, @@ -7984,7 +7968,7 @@ dir = 6 }, /obj/structure/closet/emcloset{ - anchored = TRUE; + anchored = 1; name = "anchored emergency closet" }, /turf/simulated/floor/tiled/techfloor, @@ -8094,13 +8078,10 @@ /area/liberia/dockinghall) "QE" = ( /obj/effect/wallframe_spawn/reinforced/titanium, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; - opacity = FALSE }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 296b2fb57a3..7fc94480626 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -25,7 +25,7 @@ SKILL_PILOT = SKILL_BASIC ) -/datum/job/submap/merchant/equip(var/mob/living/carbon/human/H) +/datum/job/submap/merchant/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) to_chat(H, "Your connections helped you learn about the words that will help you identify a locals... Particularly interested buyers:") to_chat(H, "Code phases: [syndicate_code_phrase]") to_chat(H, "Responses to phrases: [syndicate_code_response]") diff --git a/maps/away/magshield/magshield.dm b/maps/away/magshield/magshield.dm index 5a32a7b5dfe..35415658d07 100644 --- a/maps/away/magshield/magshield.dm +++ b/maps/away/magshield/magshield.dm @@ -141,40 +141,24 @@ icon_state = "nav_light_red" -/obj/item/book/manual/magshield_manual +/obj/item/book/fluff/magshield_manual name = "SOP for Planetary Shield Orbital Station" icon = 'magshield_sprites.dmi' icon_state = "mg_guide" author = "Terraforms Industrial" title = "Standard operating procedures for Planetary Shield Orbital Station" - - dat = {" - - - - - -

    Introduction

    - Terraforms Industrial is happy to see you as our customer! Please read this guide before using and operating with your custom PSOS - Planetary Shield Orbital Statiion. -

    Best uses for PSOS

    - PSOS is intended for protecting exoplanets from high energy space radiation rays and particles. Best used for planets lacking active geomagnetic field so PSOS would compensate its absence.
    -

    Applied technologies

    - Terraforms Industrial is delivering you your new PSOS with set of four (4) high-strength magnetic field generators. Those devices use rotating supeconducter hands to create magnetic field with strength up to 5 Tesla effectively deflecting up to 99% of space radiation spectrum.
    -
    - Special modified vacuum radiation sensors will help you evaluate radiation level and adjust power input of PSOS magnetic generators for best efficiency and power saving. -


    - rest of the book pages are gone - - - "} + fluff_text = {" +

    Introduction

    + Terraforms Industrial is happy to see you as our customer! Please read this guide before using and operating with your custom PSOS - Planetary Shield Orbital Statiion. +

    Best uses for PSOS

    + PSOS is intended for protecting exoplanets from high energy space radiation rays and particles. Best used for planets lacking active geomagnetic field so PSOS would compensate its absence.
    +

    Applied technologies

    + Terraforms Industrial is delivering you your new PSOS with set of four (4) high-strength magnetic field generators. Those devices use rotating supeconducter hands to create magnetic field with strength up to 5 Tesla effectively deflecting up to 99% of space radiation spectrum.
    +
    + Special modified vacuum radiation sensors will help you evaluate radiation level and adjust power input of PSOS magnetic generators for best efficiency and power saving. +


    + The rest of the pages have been torn out... + "} /obj/item/paper/magshield/tornpage name = "torn book page" diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index 213b07ec325..ad2e9e971bd 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -214,7 +214,6 @@ /obj/effect/wingrille_spawn/reinforced_borosilicate/full, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /turf/simulated/floor/airless, @@ -341,7 +340,6 @@ /obj/machinery/door/airlock/hatch, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /turf/simulated/floor/airless, @@ -355,7 +353,6 @@ /area/magshield/engine) "bb" = ( /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /turf/simulated/floor/airless, @@ -466,7 +463,6 @@ "bu" = ( /obj/effect/wingrille_spawn/reinforced_borosilicate/full, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /obj/machinery/atmospherics/pipe/simple/visible/cyan, @@ -475,7 +471,6 @@ "bv" = ( /obj/effect/wingrille_spawn/reinforced_borosilicate/full, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /turf/simulated/floor/airless, @@ -674,20 +669,17 @@ /turf/simulated/floor/airless, /area/magshield/engine) "cc" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, /area/magshield/engine) "cd" = ( /obj/machinery/atmospherics/binary/circulator{ - anchored = TRUE; + anchored = 1; dir = 4 }, /turf/simulated/floor/plating, @@ -736,13 +728,10 @@ /turf/simulated/floor/airless, /area/magshield/engine) "ck" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; - opacity = FALSE }, /obj/effect/wallframe_spawn/reinforced, /obj/structure/cable/yellow{ @@ -775,7 +764,7 @@ icon_state = "0-8" }, /obj/machinery/generator{ - anchored = TRUE + anchored = 1 }, /turf/simulated/floor/plating, /area/magshield/engine) @@ -856,7 +845,7 @@ /area/magshield/engine) "cx" = ( /obj/machinery/atmospherics/binary/circulator{ - anchored = TRUE; + anchored = 1; dir = 8 }, /turf/simulated/floor/plating, @@ -2570,7 +2559,7 @@ /turf/simulated/floor/tiled, /area/magshield/west) "hD" = ( -/obj/item/book/manual/magshield_manual, +/obj/item/book/fluff/magshield_manual, /turf/simulated/floor/tiled/white, /area/magshield/west) "hE" = ( diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 82df10e9087..4b91f7e6864 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -965,17 +965,13 @@ /turf/simulated/floor/tiled/dark, /area/outpost/abandoned) "ds" = ( -/obj/machinery/door/airlock/medical{ - density = FALSE; - icon_state = "door_open"; - opacity = FALSE - }, +/obj/machinery/door/airlock/medical/open, /obj/machinery/holosign/surgery, /turf/simulated/floor/tiled/airless, /area/outpost/abandoned) "dt" = ( /obj/structure/door_assembly{ - anchored = TRUE + anchored = 1 }, /turf/simulated/floor, /area/outpost/abandoned) @@ -1243,7 +1239,7 @@ /area/mine/explored) "el" = ( /obj/structure/firedoor_assembly{ - anchored = TRUE + anchored = 1 }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -1845,7 +1841,7 @@ /area/mine/explored) "gd" = ( /obj/structure/windoor_assembly{ - anchored = TRUE; + anchored = 1; dir = 8 }, /turf/simulated/floor/tiled/dark, @@ -1987,11 +1983,7 @@ /turf/simulated/floor/tiled/airless, /area/outpost/abandoned) "gz" = ( -/obj/machinery/door/airlock/external{ - density = FALSE; - icon_state = "door_open"; - opacity = FALSE - }, +/obj/machinery/door/airlock/external/open, /obj/machinery/door/blast/regular/open, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -2080,7 +2072,7 @@ /obj/effect/decal/cleanable/blood/tracks/footprints, /obj/effect/decal/cleanable/dirt, /obj/structure/firedoor_assembly{ - anchored = TRUE + anchored = 1 }, /turf/simulated/floor/plating{ icon_state = "dmg2" diff --git a/maps/away/mining/mining.dm b/maps/away/mining/mining.dm index 7aba5faa245..06238419a8d 100644 --- a/maps/away/mining/mining.dm +++ b/maps/away/mining/mining.dm @@ -208,7 +208,7 @@ icon_state = "totem" density = TRUE anchored = TRUE - unacidable = 1 + material = /decl/material/solid/metal/aliumium var/number /obj/structure/totem/Initialize() diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm index b7b2cf50157..e83c80e7cd7 100644 --- a/maps/away/slavers/slavers_base.dm +++ b/maps/away/slavers/slavers_base.dm @@ -134,17 +134,16 @@ turns_per_move = 5 speed = 4 stop_automated_movement_when_pulled = 0 - maxHealth = 100 - health = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/punch can_escape = TRUE unsuitable_atmos_damage = 15 - var/corpse = /obj/abstract/landmark/corpse/abolitionist - var/weapon = /obj/item/gun/energy/laser projectilesound = 'sound/weapons/laser.ogg' ranged = 1 projectiletype = /obj/item/projectile/beam faction = "extremist abolitionists" + var/corpse = /obj/abstract/landmark/corpse/abolitionist + var/weapon = /obj/item/gun/energy/laser /mob/living/simple_animal/hostile/abolition_extremist/death(gibbed, deathmessage, show_dead_message) . = ..(gibbed, deathmessage, show_dead_message) diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index 432c70fa5cb..c7ffa9cc4c3 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -2323,7 +2323,7 @@ icon_state = "1-2" }, /obj/item/stock_parts/circuitboard/broken, -/obj/item/contraband/poster, +/obj/item/poster, /obj/item/radio/shortwave, /obj/machinery/light/small{ dir = 4 @@ -2830,7 +2830,6 @@ /obj/structure/table/reinforced, /obj/random/coin, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "SC BD" }, /turf/simulated/floor/tiled/airless, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 45fbf96aa14..43b2fc8a2f5 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -20,9 +20,7 @@ /turf/simulated/wall/r_wall, /area/smugglers/base) "ag" = ( -/obj/machinery/door/airlock/external{ - icon_state = "door_closed" - }, +/obj/machinery/door/airlock/external, /turf/simulated/floor, /area/smugglers/base) "ah" = ( @@ -59,7 +57,7 @@ }, /obj/effect/floor_decal/industrial/warning/full, /obj/item/beartrap{ - anchored = TRUE; + anchored = 1; deployed = 1; icon_state = "beartrap1" }, @@ -80,7 +78,6 @@ /area/space) "aq" = ( /obj/machinery/door/airlock/external{ - icon_state = "door_closed"; name = "Internal Airlock" }, /obj/machinery/atmospherics/pipe/simple/visible/black, @@ -252,7 +249,7 @@ /area/smugglers/base) "aJ" = ( /obj/item/beartrap{ - anchored = TRUE; + anchored = 1; deployed = 1; icon_state = "beartrap1" }, diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 8083742473d..118cb9e8dbe 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -897,7 +897,6 @@ /obj/effect/wingrille_spawn/reinforced, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /obj/structure/cable/yellow{ @@ -992,7 +991,6 @@ /obj/effect/wingrille_spawn/reinforced, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /turf/simulated/floor, @@ -1121,7 +1119,6 @@ "dk" = ( /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /obj/machinery/door/airlock/glass/research{ @@ -1183,7 +1180,6 @@ "ds" = ( /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /obj/effect/wingrille_spawn/reinforced, @@ -2070,12 +2066,9 @@ /turf/simulated/wall/r_wall, /area/unishi/smresearch) "fM" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Biohazard"; name = "Biohazard Shutter"; - opacity = FALSE }, /obj/machinery/door/airlock/hatch, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -2218,13 +2211,10 @@ /turf/simulated/floor, /area/unishi/smresearch) "gf" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; - opacity = FALSE }, /turf/simulated/floor, /area/unishi/smresearch) @@ -2349,13 +2339,10 @@ /turf/space, /area/space) "gx" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; - opacity = FALSE }, /obj/item/remains, /turf/simulated/floor, @@ -2743,13 +2730,10 @@ /turf/simulated/floor/reinforced/nitrogen/engine, /area/unishi/smresearch) "hp" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; - opacity = FALSE }, /obj/item/remains, /obj/random/shoes, diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index a971dbbc36e..4504826b200 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -930,7 +930,7 @@ /obj/structure/table/woodentable, /obj/item/board, /obj/item/book/manual/mass_spectrometry, -/obj/item/book/manual/stasis, +/obj/item/book/fluff/stasis, /turf/simulated/floor/tiled, /area/unishi/living) "cM" = ( @@ -1441,7 +1441,7 @@ /area/unishi/living) "eb" = ( /obj/structure/table/woodentable, -/obj/item/contraband/poster, +/obj/item/poster, /obj/item/haircomb/random, /obj/random/advdevice, /turf/simulated/floor/tiled, diff --git a/maps/away_sites_testing/away_sites_testing_define.dm b/maps/away_sites_testing/away_sites_testing_define.dm index a75e88dd2e7..6f3a96274ee 100644 --- a/maps/away_sites_testing/away_sites_testing_define.dm +++ b/maps/away_sites_testing/away_sites_testing_define.dm @@ -5,9 +5,13 @@ path = "away_sites_testing" overmap_ids = list(OVERMAP_ID_SPACE) - allowed_spawns = list() + allowed_latejoin_spawns = list() default_spawn = null +// Set the observer spawn to include every flag so that CI flag checks pass. +/decl/spawnpoint/observer + spawn_flags = (SPAWN_FLAG_GHOSTS_CAN_SPAWN | SPAWN_FLAG_JOBS_CAN_SPAWN | SPAWN_FLAG_PRISONERS_CAN_SPAWN | SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) + /datum/map/away_sites_testing/build_away_sites() var/list/unsorted_sites = list_values(SSmapping.get_templates_by_category(MAP_TEMPLATE_CATEGORY_AWAYSITE)) var/list/sorted_sites = sortTim(unsorted_sites, /proc/cmp_sort_templates_tallest_to_shortest) diff --git a/maps/away_sites_testing/blank.dmm b/maps/away_sites_testing/blank.dmm index 6d50a5c258f..ad94ea9ecd0 100644 --- a/maps/away_sites_testing/blank.dmm +++ b/maps/away_sites_testing/blank.dmm @@ -8,6 +8,10 @@ "c" = ( /turf/simulated/floor/tiled, /area/space) +"d" = ( +/obj/abstract/landmark/latejoin/observer, +/turf/space, +/area/space) "e" = ( /obj/abstract/landmark/latejoin, /turf/simulated/floor/tiled, @@ -60,7 +64,7 @@ a a a a -a +d a a a diff --git a/maps/example/example-1.dmm b/maps/example/example-1.dmm index cbf45a8633f..396f16903f0 100644 --- a/maps/example/example-1.dmm +++ b/maps/example/example-1.dmm @@ -91,6 +91,10 @@ /obj/item/stack/material/sheet/mapped/steel/fifty, /turf/simulated/floor/tiled/steel_grid, /area/example/first) +"dK" = ( +/obj/abstract/landmark/latejoin/observer, +/turf/simulated/wall/r_wall/prepainted, +/area/example/first) "eh" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -191,7 +195,7 @@ /turf/simulated/floor/tiled/dark/monotile, /area/example/first) "kw" = ( -/obj/abstract/landmark/start, +/obj/abstract/landmark/latejoin, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -201,10 +205,6 @@ /obj/machinery/door/airlock/external/bolted{ id_tag = "lower_level_dock_hatch_internal" }, -/obj/machinery/button/access/interior{ - id_tag = "lower_level_dock"; - pixel_x = -21 - }, /turf/simulated/floor, /area/example/first) "lJ" = ( @@ -398,7 +398,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "lower_level_dock_sensor_chamber"; - pixel_x = -24 + pixel_x = -22; + dir = 4 }, /obj/machinery/embedded_controller/radio/airlock/docking_port{ id_tag = "lower_level_dock"; @@ -501,8 +502,8 @@ /area/example/first) "xq" = ( /obj/abstract/level_data_spawner/main_level{ - name = "Example First Deck"; -}, + name = "Example First Deck" + }, /turf/space, /area/space) "xR" = ( @@ -541,6 +542,14 @@ }, /turf/simulated/floor, /area/example/first) +"Ae" = ( +/obj/machinery/button/access/interior{ + id_tag = "lower_level_dock"; + pixel_x = -24; + pixel_y = 24 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/example/first) "AF" = ( /obj/effect/floor_decal/corner/orange{ dir = 10 @@ -689,7 +698,10 @@ }, /obj/machinery/button/access/exterior{ id_tag = "lower_level_dock"; - pixel_y = -21 + pixel_y = -24; + dir = 8; + pixel_x = -12; + directional_offset = null }, /turf/simulated/floor, /area/example/first) @@ -2453,7 +2465,7 @@ XZ Wr Wr Wr -XZ +dK XZ XZ XZ @@ -2497,7 +2509,7 @@ XZ tq ZV la -CU +Ae CU XZ mu diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm index 67795ddce76..ee19110309e 100644 --- a/maps/example/example-2.dmm +++ b/maps/example/example-2.dmm @@ -143,7 +143,10 @@ }, /obj/machinery/button/access/exterior{ id_tag = "upper_level_dock"; - pixel_y = -21 + pixel_y = -24; + dir = 4; + pixel_x = 12; + directional_offset = null }, /turf/simulated/floor, /area/example/second) @@ -231,7 +234,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "upper_level_dock_sensor_chamber"; - pixel_x = 24 + pixel_x = 22; + dir = 8 }, /obj/machinery/embedded_controller/radio/airlock/docking_port{ id_tag = "upper_level_dock"; @@ -310,8 +314,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/button/access/interior{ id_tag = "upper_level_dock"; - pixel_x = 22; - pixel_y = 28 + pixel_x = 24; + pixel_y = 24 }, /turf/simulated/floor/tiled/steel_grid, /area/example/second) @@ -329,8 +333,8 @@ /area/example/second) "ug" = ( /obj/abstract/level_data_spawner/main_level{ - name = "Example Second Deck"; -}, + name = "Example Second Deck" + }, /turf/space, /area/space) "uk" = ( @@ -655,9 +659,9 @@ /area/turbolift/example/second) "Xm" = ( /obj/structure/iv_drip, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /obj/effect/floor_decal/corner/blue/mono, /turf/simulated/floor/tiled/white/monotile, /area/example/second) diff --git a/maps/example/example.dm b/maps/example/example.dm index 72a8676b951..955f65f1cf4 100644 --- a/maps/example/example.dm +++ b/maps/example/example.dm @@ -1,5 +1,9 @@ #if !defined(USING_MAP_DATUM) + #ifdef UNIT_TEST + #include "../../code/unit_tests/offset_tests.dm" + #endif + #include "example_areas.dm" #include "example_shuttles.dm" #include "example_departments.dm" diff --git a/maps/example/example_define.dm b/maps/example/example_define.dm index 389d11249d0..9c48d50899f 100644 --- a/maps/example/example_define.dm +++ b/maps/example/example_define.dm @@ -11,7 +11,7 @@ /decl/music_track/absconditus ) - allowed_spawns = list( + allowed_latejoin_spawns = list( /decl/spawnpoint/arrivals ) diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index 33909743bb5..ed410b73cee 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -21,7 +21,7 @@ /obj/machinery/portable_atmospherics/canister/air/airlock, /obj/machinery/atmospherics/portables_connector, /obj/structure/sign/warning/vacuum{ - dir = 4; + dir = 8; pixel_x = 32 }, /turf/simulated/floor/plating, @@ -50,8 +50,9 @@ /obj/machinery/button/access/interior{ id_tag = "sub_sec_airlock"; name = "interior access button"; - pixel_x = 25; - pixel_y = -25 + pixel_x = 20; + pixel_y = -25; + dir = 8 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/fore) @@ -71,16 +72,19 @@ }, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "sub_sec_airlock"; - pixel_y = -25; + pixel_y = -22; tag_airpump = "sub_sec_pump"; tag_chamber_sensor = "sub_sec_sensor"; tag_exterior_door = "sub_sec_outer"; - tag_interior_door = "sub_sec_inner" + tag_interior_door = "sub_sec_inner"; + dir = 1; + pixel_x = -6 }, /obj/machinery/airlock_sensor{ id_tag = "sub_sec_sensor"; - pixel_x = 12; - pixel_y = -25 + pixel_x = 6; + pixel_y = -18; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/fore) @@ -97,8 +101,9 @@ /obj/machinery/button/access/exterior{ id_tag = "sub_sec_airlock"; name = "exterior access button"; - pixel_x = -25; - pixel_y = 25 + pixel_x = -20; + pixel_y = 25; + dir = 4 }, /turf/simulated/floor/airless, /area/exodus/maintenance/sub/fore) @@ -171,16 +176,22 @@ /turf/space, /area/exodus/maintenance/sub/fore) "aC" = ( -/obj/structure/sign/directions/security{ - dir = 1 +/obj/structure/sign/warning/lethal_turrets{ + dir = 4; + pixel_x = -34; + pixel_y = 32 }, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/maintenance/sub/fore) +/turf/space, +/area/space) "aD" = ( /obj/machinery/light{ dir = 8; icon_state = "tube1" }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_x = -32 + }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/fore) "aE" = ( @@ -927,9 +938,11 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/sub/central) "dd" = ( -/obj/structure/sign/warning/lethal_turrets, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/maintenance/exterior) +/obj/structure/sign/warning/lethal_turrets{ + pixel_y = 32 + }, +/turf/space, +/area/space) "de" = ( /obj/machinery/alarm{ dir = 4; @@ -1100,7 +1113,8 @@ id_tag = "sub_cargo_airlock"; name = "exterior access button"; pixel_x = 25; - pixel_y = 25 + pixel_y = 25; + dir = 8 }, /turf/simulated/floor/airless, /area/exodus/maintenance/sub/port) @@ -1117,16 +1131,19 @@ }, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "sub_cargo_airlock"; - pixel_y = -25; + pixel_y = -22; tag_airpump = "sub_cargo_pump"; tag_chamber_sensor = "sub_cargo_sensor"; tag_exterior_door = "sub_cargo_outer"; - tag_interior_door = "sub_cargo_inner" + tag_interior_door = "sub_cargo_inner"; + dir = 1; + pixel_x = -6 }, /obj/machinery/airlock_sensor{ id_tag = "sub_cargo_sensor"; - pixel_x = 12; - pixel_y = -25 + pixel_x = 6; + pixel_y = -18; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/port) @@ -1150,7 +1167,8 @@ id_tag = "sub_cargo_airlock"; name = "interior access button"; pixel_x = -25; - pixel_y = 25 + pixel_y = 25; + dir = 4 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/port) @@ -1228,7 +1246,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/structure/sign/warning/vacuum{ - dir = 8; + dir = 4; pixel_x = -32 }, /turf/simulated/floor/plating, @@ -1537,7 +1555,7 @@ /area/exodus/maintenance/sub/command) "eL" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/bluegrid, /area/exodus/maintenance/sub/command) @@ -1625,8 +1643,8 @@ /obj/machinery/portable_atmospherics/canister/air/airlock, /obj/machinery/atmospherics/portables_connector, /obj/structure/sign/warning/vacuum{ - dir = 8; - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/starboard) @@ -1677,8 +1695,8 @@ /obj/effect/floor_decal/industrial/hatch/yellow, /obj/structure/ladder, /obj/machinery/light_switch{ - pixel_x = -22; - pixel_y = -22 + pixel_y = -20; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -1714,10 +1732,11 @@ icon_state = "0-2" }, /obj/structure/sign/warning/vacuum{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/structure/sign/warning/high_voltage{ - dir = 4; + dir = 8; pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1744,8 +1763,9 @@ /obj/machinery/button/access/exterior{ id_tag = "sub_research_airlock"; name = "exterior access button"; - pixel_x = 25; - pixel_y = 25 + pixel_x = 20; + pixel_y = 24; + dir = 8 }, /turf/simulated/floor/airless, /area/exodus/maintenance/sub/starboard) @@ -1762,16 +1782,19 @@ }, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "sub_research_airlock"; - pixel_y = -25; + pixel_y = -22; tag_airpump = "sub_research_pump"; tag_chamber_sensor = "sub_research_sensor"; tag_exterior_door = "sub_research_outer"; - tag_interior_door = "sub_research_inner" + tag_interior_door = "sub_research_inner"; + dir = 1; + pixel_x = -6 }, /obj/machinery/airlock_sensor{ id_tag = "sub_research_sensor"; - pixel_x = 12; - pixel_y = -25 + pixel_x = 6; + pixel_y = -18; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/starboard) @@ -1789,8 +1812,9 @@ /obj/machinery/button/access/interior{ id_tag = "sub_research_airlock"; name = "interior access button"; - pixel_x = -25; - pixel_y = -25 + pixel_x = -20; + pixel_y = -24; + dir = 4 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/starboard) @@ -1805,11 +1829,12 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/sub/starboard) "fo" = ( -/obj/structure/sign/directions/science{ - dir = 1 +/obj/structure/sign/warning/lethal_turrets{ + dir = 1; + pixel_y = -32 }, -/turf/simulated/wall/prepainted, -/area/exodus/maintenance/sub/starboard) +/turf/space, +/area/space) "fp" = ( /turf/space, /area/exodus/maintenance/sub/starboard) @@ -2123,7 +2148,6 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/sub/central) "gd" = ( -/obj/structure/sign/warning/lethal_turrets, /obj/structure/cable{ icon_state = "1-2" }, @@ -3520,7 +3544,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/engineering/atmos) @@ -4164,12 +4188,6 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/sub/aft) "lb" = ( -/obj/machinery/button/access/interior{ - id_tag = "sub_engineering_airlock"; - name = "interior access button"; - pixel_x = 25; - pixel_y = 25 - }, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, @@ -4182,6 +4200,11 @@ /obj/machinery/door/airlock/external/bolted{ id_tag = "sub_engineering_inner" }, +/obj/machinery/button/access/interior{ + id_tag = "sub_engineering_airlock"; + name = "interior access button"; + pixel_y = 24 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/maintenance/sub/aft) "ld" = ( @@ -4191,16 +4214,18 @@ }, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "sub_engineering_airlock"; - pixel_y = -25; + pixel_y = -22; tag_airpump = "sub_engineering_pump"; tag_chamber_sensor = "sub_engineering_sensor"; tag_exterior_door = "sub_engineering_outer"; - tag_interior_door = "sub_engineering_inner" + tag_interior_door = "sub_engineering_inner"; + dir = 1 }, /obj/machinery/airlock_sensor{ id_tag = "sub_engineering_sensor"; pixel_x = 12; - pixel_y = -25 + pixel_y = -18; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/maintenance/sub/aft) @@ -4208,15 +4233,14 @@ /obj/machinery/door/airlock/external/bolted{ id_tag = "sub_engineering_outer" }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/exodus/maintenance/sub/aft) -"lf" = ( /obj/machinery/button/access/exterior{ id_tag = "sub_engineering_airlock"; name = "exterior access button"; - pixel_x = -25; - pixel_y = 25 + pixel_y = 24 }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/exodus/maintenance/sub/aft) +"lf" = ( /turf/simulated/floor/airless, /area/exodus/maintenance/sub/aft) "lg" = ( @@ -4340,7 +4364,7 @@ /area/exodus/maintenance/sub/aft) "lw" = ( /obj/structure/sign/warning/vacuum{ - dir = 4; + dir = 8; pixel_x = 32 }, /obj/machinery/atmospherics/portables_connector{ @@ -5398,7 +5422,7 @@ "oE" = ( /obj/item/radio/intercom{ dir = 8; - pixel_x = 21 + pixel_x = 22 }, /turf/simulated/floor/tiled/dark, /area/exodus/maintenance/telecomms) @@ -5410,10 +5434,18 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_y = -32 + pixel_y = -29; + dir = 1 }, /turf/simulated/floor/tiled/dark, /area/exodus/maintenance/telecomms) +"pI" = ( +/obj/structure/sign/warning/lethal_turrets{ + pixel_y = 32; + pixel_x = 34 + }, +/turf/space, +/area/space) "qe" = ( /obj/machinery/light{ dir = 8 @@ -5440,6 +5472,18 @@ }, /turf/simulated/floor/bluegrid, /area/exodus/maintenance/telecomms) +"rK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/sign/warning/lethal_turrets{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/airless, +/area/space) "rL" = ( /obj/item/stock_parts/subspace/analyzer, /obj/item/stock_parts/subspace/analyzer, @@ -5567,6 +5611,13 @@ /obj/structure/closet/toolcloset, /turf/simulated/floor/tiled/dark/monotile, /area/exodus/maintenance/telecomms) +"zy" = ( +/obj/structure/sign/warning/lethal_turrets{ + dir = 4; + pixel_x = -34 + }, +/turf/space, +/area/space) "zH" = ( /obj/structure/cable{ icon_state = "4-8" @@ -5622,8 +5673,8 @@ /area/exodus/maintenance/telecomms) "AE" = ( /obj/abstract/level_data_spawner/main_level{ - name = "Exodus Underlevel"; -}, + name = "Exodus Underlevel" + }, /turf/space, /area/space) "AG" = ( @@ -5694,7 +5745,7 @@ /obj/structure/rack, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/simulated/floor/tiled/monotile, /area/exodus/maintenance/telecomms) @@ -5724,6 +5775,13 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/steel_grid, /area/exodus/maintenance/sub/aft) +"CW" = ( +/obj/structure/sign/warning/lethal_turrets{ + dir = 8; + pixel_x = 34 + }, +/turf/space, +/area/space) "Dm" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -5842,7 +5900,7 @@ "LF" = ( /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/simulated/floor/tiled/dark, /area/exodus/maintenance/telecomms) @@ -6016,11 +6074,12 @@ /area/exodus/maintenance/telecomms) "Se" = ( /obj/machinery/newscaster{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/simulated/floor/lino, /area/exodus/maintenance/telecomms) @@ -6097,6 +6156,13 @@ }, /turf/simulated/floor/tiled/dark, /area/exodus/maintenance/telecomms) +"Wa" = ( +/obj/structure/sign/directions/science{ + dir = 1; + pixel_y = 32 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/exodus/maintenance/sub/starboard) "Xu" = ( /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/maintenance/sub/fore) @@ -31445,25 +31511,25 @@ aa aa aa aa -dd ab ab ab ab ab -dd ab ab ab ab ab -dd ab ab ab ab ab -dd +ab +ab +ab +ab aa cv eG @@ -31703,18 +31769,18 @@ aa aa aa ab -aa +aC aa ac aa ac -aa +zy aa aa ac aa aa -aa +zy aa aa aa @@ -32167,7 +32233,7 @@ ad ad Xu Xu -aC +ad ad aw am @@ -32212,7 +32278,7 @@ cv cv cv ac -dd +ab ab ab ab @@ -32470,7 +32536,7 @@ aa aa aa ab -aa +aC aa ac aa @@ -33261,8 +33327,8 @@ aa aa aa aa -aa -dd +fo +ab ac cv gm @@ -33494,7 +33560,7 @@ cv eG cv ac -dd +ab ab ab ac @@ -33752,7 +33818,7 @@ cS cv aa ab -aa +aC aa ac aa @@ -35036,8 +35102,8 @@ cL eG cv ac +ab dd -aa di di dn @@ -35060,7 +35126,7 @@ fI fV fV fV -fV +rK gd fV gk @@ -36322,7 +36388,7 @@ eG cv aa ab -aa +pI aa ac aa @@ -36578,7 +36644,7 @@ cv eG cv ac -dd +ab ab ab ac @@ -36859,8 +36925,8 @@ aa aa aa aa -aa -dd +fo +ab ac cv eG @@ -37610,7 +37676,7 @@ aa aa aa ab -aa +pI aa ac aa @@ -37866,7 +37932,7 @@ cv cv cv aa -dd +ab ab ab ab @@ -38385,18 +38451,18 @@ cv cv aa ab -aa +pI aa ac aa ac -aa +CW aa aa ac aa aa -aa +CW aa aa aa @@ -38641,25 +38707,25 @@ cw do cv aa -dd ab ab ab ab ab -dd ab ab ab ab ab -dd ab ab ab ab ab -dd +ab +ab +ab +ab aa cv eG @@ -55612,8 +55678,8 @@ aa aa ez ct -fo -NK +ch +Wa NK ch ct diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 3ec3c597cd4..a2fe2a02a5c 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -240,7 +240,8 @@ /area/space) "aaK" = ( /obj/structure/sign/warning/airlock{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/machinery/atmospherics/portables_connector, /obj/machinery/portable_atmospherics/canister/air/airlock, @@ -456,7 +457,8 @@ /area/exodus/security/range) "abl" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -676,12 +678,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -722,11 +721,11 @@ /area/exodus/security/range) "abL" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/range) @@ -953,7 +952,8 @@ /obj/machinery/airlock_sensor{ id_tag = "brig_solar_sensor"; pixel_x = 12; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -988,7 +988,8 @@ id_tag = "brig_solar_airlock"; name = "interior access button"; pixel_x = -25; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -1037,7 +1038,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/light/small/emergency{ dir = 1 @@ -1267,7 +1268,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/main) @@ -1277,7 +1279,7 @@ }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/structure/table, /obj/item/megaphone, @@ -1354,7 +1356,7 @@ dir = 1 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/meeting) @@ -1953,7 +1955,9 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/main) "aen" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Security South" + }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/main) "aeo" = ( @@ -2794,12 +2798,9 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -3108,7 +3109,7 @@ /area/exodus/security/main) "agN" = ( /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/navbeacon/SecurityD, /obj/machinery/door/firedoor, @@ -3184,7 +3185,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/plating, /area/exodus/maintenance/security_starboard) @@ -3233,13 +3235,10 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, /obj/structure/cable/green, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /turf/simulated/floor/plating, /area/exodus/security/brig) @@ -3275,12 +3274,9 @@ /turf/simulated/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) "ahg" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ @@ -3310,13 +3306,10 @@ /area/exodus/security/brig/processing) "ahk" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "lawyer_blast"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/security/brig) @@ -3387,7 +3380,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/alarm{ pixel_y = 22 @@ -3399,7 +3392,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/brig/processing) @@ -3433,7 +3426,7 @@ /turf/simulated/floor/tiled/dark, /area/exodus/security/warden) "ahv" = ( -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/structure/table/steel_reinforced, /turf/simulated/floor/tiled/dark, /area/exodus/security/warden) @@ -3599,7 +3592,7 @@ /obj/machinery/keycard_auth{ dir = 8 }, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /turf/simulated/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) "ahP" = ( @@ -3639,12 +3632,10 @@ dir = 1 }, /obj/structure/window/reinforced/tinted{ - dir = 4; - icon_state = "twindow" + dir = 4 }, /obj/structure/window/reinforced/tinted{ - dir = 8; - icon_state = "twindow" + dir = 8 }, /obj/structure/grille, /obj/structure/cable/green{ @@ -3669,7 +3660,7 @@ c_tag = "Security - Interrogation" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/dark, /area/exodus/security/brig/interrogation) @@ -3902,12 +3893,10 @@ /area/exodus/security/brig/interrogation) "aiF" = ( /obj/structure/window/reinforced/tinted{ - dir = 4; - icon_state = "twindow" + dir = 4 }, /obj/structure/window/reinforced/tinted{ - dir = 8; - icon_state = "twindow" + dir = 8 }, /obj/structure/grille, /obj/structure/cable/green{ @@ -4087,7 +4076,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/brig/interrogation) @@ -4100,12 +4089,10 @@ "aja" = ( /obj/structure/window/reinforced/tinted, /obj/structure/window/reinforced/tinted{ - dir = 4; - icon_state = "twindow" + dir = 4 }, /obj/structure/window/reinforced/tinted{ - dir = 8; - icon_state = "twindow" + dir = 8 }, /obj/structure/grille, /obj/structure/cable/green, @@ -4123,13 +4110,10 @@ /area/exodus/security/brig/interrogation) "ajc" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "lawyer_blast"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/lawoffice) @@ -4200,13 +4184,10 @@ "ajh" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -4301,13 +4282,10 @@ "ajp" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/structure/cable/green{ icon_state = "0-8" @@ -4316,13 +4294,10 @@ /area/exodus/security/prison) "ajq" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "brigobs"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -4339,13 +4314,10 @@ /area/exodus/security/brig/processing) "ajs" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "brigobs"; - name = "Security Blast Door"; - opacity = FALSE + name = "brigobs" }, /obj/structure/cable/green{ icon_state = "0-8" @@ -4368,12 +4340,9 @@ /area/exodus/security/main) "aju" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "brigobs"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/structure/cable/green, /obj/structure/cable/green{ @@ -4473,13 +4442,10 @@ /area/exodus/maintenance/evahallway) "ajG" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/structure/cable/green{ icon_state = "0-2" @@ -4534,7 +4500,8 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_x = -30 + pixel_x = -30; + dir = 8 }, /obj/machinery/camera/network/security{ c_tag = "Security - HoS' Office"; @@ -4585,7 +4552,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/light, /turf/simulated/floor/tiled/dark, @@ -4670,7 +4637,7 @@ dir = 5 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/brig) @@ -4769,7 +4736,7 @@ "akg" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/light, /obj/machinery/light_switch{ @@ -4916,7 +4883,7 @@ dir = 5 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/brig) @@ -5089,7 +5056,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/brig) @@ -5465,7 +5432,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -5481,13 +5449,10 @@ /area/exodus/security/detectives_office) "alx" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/structure/cable/green, /obj/structure/cable/green{ @@ -5675,7 +5640,8 @@ /area/exodus/security/brig/processing) "alT" = ( /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/simulated/floor/lino, /area/exodus/security/detectives_office) @@ -5891,7 +5857,8 @@ /obj/machinery/button/blast_door{ id_tag = "lawyer_blast"; name = "Privacy Shutters"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/item/clipboard, /obj/item/hand_labeler, @@ -5929,13 +5896,10 @@ /area/exodus/security/lobby) "amw" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -5959,12 +5923,9 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/substation/security) "amy" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/door/airlock/atmos{ name = "Atmospherics Maintenance" @@ -6105,13 +6066,10 @@ /area/exodus/security/brig) "amO" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/structure/cable/green, /obj/structure/disposalpipe/segment{ @@ -6221,7 +6179,8 @@ /obj/machinery/button/flasher{ id_tag = "permflash"; name = "Brig flashes"; - pixel_y = -27 + pixel_y = -27; + dir = 1 }, /obj/structure/cable/green{ icon_state = "1-4" @@ -6272,12 +6231,9 @@ "anc" = ( /obj/effect/wallframe_spawn/reinforced, /obj/structure/cable/green, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /turf/simulated/floor/plating, /area/exodus/security/prison) @@ -6314,13 +6270,10 @@ /area/exodus/security/brig) "ang" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "lawyer_blast"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -6340,12 +6293,9 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/dormitory) "ani" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -6429,7 +6379,7 @@ /area/exodus/security/detectives_office) "anr" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/prison) @@ -6451,13 +6401,10 @@ "ant" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/structure/cable/green, /turf/simulated/floor/plating, @@ -6514,12 +6461,9 @@ /area/exodus/security/prison) "any" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, @@ -6843,7 +6787,8 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/exodus/lawoffice) @@ -7058,8 +7003,8 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/auxsolarstarboard) "aoK" = ( -/obj/machinery/faxmachine{ - anchored = FALSE; +/obj/machinery/faxmachine/mapped{ + anchored = 0 }, /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -7314,6 +7259,10 @@ }, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/engine_setup/empty_canister, +/obj/structure/sign/warning/radioactive{ + dir = 4; + pixel_x = -32 + }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) "apn" = ( @@ -7454,7 +7403,8 @@ dir = 1 }, /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{ dir = 4; @@ -8010,13 +7960,10 @@ /turf/simulated/floor/tiled/dark, /area/exodus/lawoffice) "aqH" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "lawyer_blast"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -8061,7 +8008,8 @@ /obj/machinery/airlock_sensor{ id_tag = "dorm_sensor"; pixel_x = 25; - pixel_y = -8 + pixel_y = -8; + dir = 8 }, /obj/effect/floor_decal/industrial/warning{ dir = 5 @@ -8180,7 +8128,8 @@ /obj/machinery/button/alternate/door{ id_tag = "visitdoor"; name = "Visitation Access"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -8329,7 +8278,7 @@ "arl" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/forensic/dnascanner, /obj/structure/disposalpipe/segment{ @@ -8369,7 +8318,8 @@ pixel_y = -25 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/structure/filing_cabinet, /turf/simulated/floor/tiled/dark, @@ -8379,7 +8329,8 @@ /obj/machinery/button/blast_door{ id_tag = "lawyer_blast"; name = "Privacy Shutters"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/item/pen/blue{ pixel_x = -5; @@ -8571,13 +8522,10 @@ /area/exodus/maintenance/library) "arL" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/structure/cable/green{ icon_state = "0-8" @@ -8603,12 +8551,9 @@ /turf/simulated/floor/wood, /area/exodus/maintenance/dormitory) "arO" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass/security{ @@ -8621,12 +8566,9 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/fore) "arP" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Prison Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass/security{ @@ -8653,7 +8595,8 @@ /area/exodus/maintenance/evahallway) "arS" = ( /obj/machinery/light_switch{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -8742,13 +8685,10 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/evahallway) "asc" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -8952,7 +8892,8 @@ dir = 1 }, /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{ dir = 4; @@ -8988,7 +8929,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/steel_grid, @@ -9224,13 +9165,10 @@ "asY" = ( /obj/effect/wallframe_spawn/reinforced, /obj/structure/cable/green, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "visit_blast"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/security/prison/dorm) @@ -9277,20 +9215,14 @@ /area/exodus/maintenance/evahallway) "ate" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Security Blast Door" }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "visit_blast"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /obj/structure/cable/green, /obj/structure/cable/green{ @@ -9299,11 +9231,12 @@ /turf/simulated/floor/plating, /area/exodus/security/prison/dorm) "atf" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/airlock, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/exodus/hallway/secondary/entry/fore) +/obj/structure/lattice, +/obj/structure/sign/warning/biohazard{ + pixel_y = 32 + }, +/turf/space, +/area/space) "atg" = ( /turf/simulated/wall/r_wall/prepainted, /area/exodus/security/prison/dorm) @@ -9545,9 +9478,7 @@ /turf/simulated/floor/plating, /area/exodus/hallway/secondary/entry/pods) "atR" = ( -/obj/machinery/computer/cryopod{ - dir = 2 - }, +/obj/machinery/computer/cryopod, /obj/machinery/camera/network/civilian_east{ c_tag = "Dormitory Cryo Storage" }, @@ -9692,13 +9623,10 @@ /turf/simulated/floor/plating, /area/exodus/chapel/main) "aun" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -9774,7 +9702,8 @@ /area/exodus/hallway/primary/fore) "auw" = ( /obj/machinery/atm{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -9989,9 +9918,7 @@ /area/exodus/hallway/primary/port) "auU" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/computer/cryopod{ - dir = 2 - }, +/obj/machinery/computer/cryopod, /obj/machinery/light_switch{ pixel_x = -25; pixel_y = 24 @@ -10123,13 +10050,10 @@ /area/exodus/maintenance/auxsolarport) "avj" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/machinery/door/firedoor, /obj/structure/cable/green{ @@ -10271,7 +10195,7 @@ /obj/machinery/cryopod, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/white/monotile, /area/exodus/crew_quarters/sleep/cryo) @@ -10579,7 +10503,7 @@ c_tag = "Arrivals Escape Pods" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -10636,13 +10560,10 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/prison/dorm) "awl" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = FALSE + name = "Secure Gate" }, /obj/machinery/door/firedoor, /obj/machinery/door/window/brigdoor/eastleft{ @@ -10690,9 +10611,14 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/prison) "awq" = ( -/obj/structure/sign/warning/airlock, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/hallway/secondary/entry/fore) +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/structure/sign/warning/radioactive{ + pixel_y = -32; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/exodus/engineering/engine_room) "awr" = ( /obj/machinery/seed_storage/garden{ dir = 1 @@ -10713,12 +10639,14 @@ "awu" = ( /obj/machinery/button/flasher{ id_tag = "IAflash"; - pixel_y = -30 + pixel_y = -30; + dir = 1 }, /obj/machinery/button/blast_door{ id_tag = "visit_blast"; name = "Privacy Shutters"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -10760,7 +10688,8 @@ /area/exodus/hallway/primary/fore) "awA" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/effect/floor_decal/corner/red{ dir = 6 @@ -10949,7 +10878,8 @@ id_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -11055,7 +10985,7 @@ /area/exodus/hallway/primary/fore) "axg" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/camera/network/civilian_east{ c_tag = "Dormitories Central" @@ -11538,7 +11468,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11579,8 +11509,7 @@ /area/exodus/hallway/secondary/entry/pods) "ays" = ( /obj/structure/bed/chair/comfy/beige{ - dir = 1; - icon_state = "comfychair_preview" + dir = 1 }, /obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/tiled/steel_grid, @@ -11983,7 +11912,8 @@ "ayZ" = ( /obj/effect/floor_decal/industrial/warning, /obj/structure/sign/warning/airlock{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/fore) @@ -12165,7 +12095,8 @@ /area/exodus/hallway/secondary/entry/fore) "azr" = ( /obj/machinery/status_display{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/tiled/steel_grid, @@ -12434,7 +12365,7 @@ /obj/effect/floor_decal/corner/grey/three_quarters, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/crew_quarters/fitness) @@ -12541,8 +12472,9 @@ }, /obj/machinery/airlock_sensor{ id_tag = "admin_shuttle_dock_sensor"; - pixel_x = -30; - pixel_y = 8 + pixel_x = -20; + pixel_y = 8; + dir = 4 }, /turf/simulated/floor/plating, /area/exodus/hallway/secondary/entry/fore) @@ -12647,7 +12579,8 @@ /obj/machinery/airlock_sensor{ id_tag = "solar_tool_sensor"; pixel_x = 25; - pixel_y = 12 + pixel_y = 12; + dir = 8 }, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ dir = 8; @@ -12715,7 +12648,8 @@ /area/exodus/gateway) "aAH" = ( /obj/structure/sign/warning/airlock{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/machinery/portable_atmospherics/canister/air/airlock, /obj/effect/floor_decal/industrial/outline/yellow, @@ -12861,7 +12795,8 @@ /area/exodus/crew_quarters/sleep) "aAU" = ( /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/undies_wardrobe, /obj/effect/floor_decal/corner/grey{ @@ -12988,7 +12923,8 @@ /area/exodus/crew_quarters/fitness) "aBi" = ( /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/closet/athletic_mixed, /obj/effect/floor_decal/corner/grey{ @@ -13370,7 +13306,7 @@ /obj/random/tech_supply, /obj/random/tech_supply, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/monotile, /area/exodus/storage/primary) @@ -14446,13 +14382,10 @@ /area/exodus/hallway/secondary/entry/port) "aEA" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "heads_meeting"; - name = "Meeting Room Window Shutters"; - opacity = FALSE + name = "Meeting Room Window Shutters" }, /obj/structure/cable/green{ icon_state = "0-2" @@ -14519,13 +14452,10 @@ /area/exodus/library) "aEG" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "heads_meeting"; - name = "Meeting Room Window Shutters"; - opacity = FALSE + name = "Meeting Room Window Shutters" }, /obj/structure/cable/green{ icon_state = "0-2" @@ -14560,13 +14490,10 @@ /area/shuttle/arrival/station) "aEK" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "heads_meeting"; - name = "Meeting Room Window Shutters"; - opacity = FALSE + name = "Meeting Room Window Shutters" }, /obj/structure/cable/green, /obj/machinery/door/firedoor, @@ -14736,13 +14663,10 @@ /area/exodus/maintenance/disposal) "aFb" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/door/airlock/research{ name = "Mech Bay" @@ -14974,13 +14898,10 @@ /area/exodus/security/nuke_storage) "aFz" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/door/blast/shutters{ dir = 2; @@ -14997,7 +14918,8 @@ /area/exodus/gateway) "aFB" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -15020,6 +14942,9 @@ name = "Docking Port Airlock" }, /obj/machinery/shield_diffuser, +/obj/structure/sign/warning/airlock{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/entry/fore) "aFE" = ( @@ -15061,7 +14986,8 @@ pixel_y = 30 }, /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/machinery/light{ dir = 1 @@ -15291,13 +15217,10 @@ /area/shuttle/arrival/station) "aGc" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/plating, /area/exodus/research/robotics) @@ -15330,13 +15253,10 @@ name = "Robotics Desk" }, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/plating, /area/exodus/research/robotics) @@ -15358,13 +15278,10 @@ "aGg" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/plating, /area/exodus/research/lab) @@ -15389,13 +15306,10 @@ name = "plastic table frame" }, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/plating, /area/exodus/research/lab) @@ -15510,9 +15424,7 @@ /obj/effect/floor_decal/corner/white{ dir = 5 }, -/obj/machinery/computer/cryopod{ - dir = 2 - }, +/obj/machinery/computer/cryopod, /turf/simulated/floor/tiled/dark/monotile, /area/shuttle/arrival/station) "aGy" = ( @@ -15638,7 +15550,7 @@ /obj/item/dice/d20, /obj/item/dice, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/wood/walnut, /area/exodus/library) @@ -15648,13 +15560,10 @@ /area/exodus/gateway) "aGO" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 8; - icon_state = "shutter0"; id_tag = "chemwindow"; - name = "Chemistry Window Shutters"; - opacity = FALSE + name = "Chemistry Window Shutters" }, /turf/simulated/floor/plating, /area/exodus/hallway/primary/central_two) @@ -15741,9 +15650,11 @@ /turf/simulated/floor/tiled/dark, /area/exodus/ai_monitored/storage/eva) "aGX" = ( -/obj/structure/sign/warning/secure_area, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/hallway/primary/starboard) +/obj/structure/sign/warning/docking_area{ + pixel_y = 32 + }, +/turf/space, +/area/space) "aGY" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -15797,7 +15708,8 @@ id_tag = "escape_dock_south_airlock"; name = "interior access button"; pixel_x = 26; - pixel_y = -26 + pixel_y = -26; + dir = 1 }, /obj/effect/floor_decal/corner/white{ dir = 4 @@ -15868,7 +15780,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/dark, /area/exodus/security/checkpoint2) @@ -15899,7 +15811,8 @@ /area/exodus/crew_quarters/toilet) "aHm" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/simulated/floor/tiled/freezer, /area/exodus/crew_quarters/toilet) @@ -15969,7 +15882,7 @@ "aHv" = ( /obj/structure/closet/wardrobe/chaplain_black, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/lino, /area/exodus/chapel/office) @@ -15998,13 +15911,10 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "chapel"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /turf/simulated/floor/tiled/dark, /area/exodus/chapel/office) @@ -16401,7 +16311,7 @@ }, /obj/effect/floor_decal/industrial/outline/yellow, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/starboard) @@ -16473,7 +16383,8 @@ /area/shuttle/arrival/station) "aIl" = ( /obj/structure/sign/warning/secure_area{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/structure/closet/emcloset, /turf/simulated/floor/plating, @@ -16545,7 +16456,8 @@ /obj/machinery/button/access/exterior{ id_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/machinery/door/airlock/research{ autoclose = 0; @@ -16802,7 +16714,7 @@ "aJb" = ( /obj/machinery/navbeacon/Bar, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/loading{ @@ -16822,7 +16734,7 @@ /area/exodus/gateway) "aJd" = ( /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/navbeacon/Kitchen, /obj/machinery/door/firedoor, @@ -17526,7 +17438,8 @@ /area/exodus/hallway/primary/central_two) "aKI" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -17604,7 +17517,7 @@ c_tag = "Bar North" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/light{ dir = 1 @@ -17666,7 +17579,7 @@ "aKW" = ( /obj/machinery/navbeacon/Hydroponics, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/loading, @@ -17675,7 +17588,8 @@ "aKX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/button/crematorium{ - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/light/small{ dir = 4 @@ -17753,12 +17667,9 @@ "aLg" = ( /obj/structure/closet/coffin, /obj/machinery/door/blast/shutters{ - density = FALSE; dir = 2; - icon_state = "shutter0"; id_tag = "chapel"; - name = "Privacy Shutters"; - opacity = FALSE + name = "Privacy Shutters" }, /obj/machinery/door/window/westleft{ name = "Coffin Storage" @@ -17806,7 +17717,8 @@ /area/exodus/chapel/main) "aLo" = ( /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 30; + dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -17819,7 +17731,7 @@ }, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/dark, /area/exodus/hydroponics) @@ -18113,9 +18025,13 @@ id_tag = "escape_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; - pixel_y = -26 + pixel_y = -26; + dir = 1 }, /obj/machinery/shield_diffuser, +/obj/structure/sign/warning/docking_area{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/exit) "aLX" = ( @@ -18226,7 +18142,7 @@ icon_state = "4-8" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/effect/floor_decal/corner/blue{ dir = 5 @@ -18964,6 +18880,10 @@ pixel_y = 26 }, /obj/machinery/shield_diffuser, +/obj/structure/sign/warning/docking_area{ + dir = 1; + pixel_y = -32 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/exit) "aNN" = ( @@ -18972,7 +18892,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/ai_monitored/storage/eva) @@ -18997,7 +18918,7 @@ icon_state = "4-8" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/effect/floor_decal/corner/lime{ dir = 5 @@ -19163,7 +19084,6 @@ /obj/structure/table/woodentable, /obj/item/chems/food/chips, /obj/random/single{ - icon_state = "cola"; name = "randomly spawned cola"; spawn_object = /obj/item/chems/drinks/cans/cola }, @@ -19441,7 +19361,8 @@ /area/exodus/chapel/office) "aOH" = ( /obj/machinery/newscaster{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green{ icon_state = "4-8" @@ -19987,13 +19908,10 @@ /turf/simulated/floor/lino, /area/exodus/crew_quarters/bar) "aPL" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -20079,7 +19997,8 @@ /area/exodus/hydroponics) "aPX" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/effect/floor_decal/corner/lime{ dir = 6 @@ -20178,7 +20097,6 @@ pixel_y = 2 }, /obj/random/single{ - icon_state = "lighter-g"; name = "randomly spawned lighter"; spawn_object = /obj/item/flame/lighter }, @@ -20213,19 +20131,17 @@ /area/exodus/security/prison/dorm) "aQo" = ( /obj/structure/sign/warning/airlock{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/secondary/exit) "aQp" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 8; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -20240,7 +20156,7 @@ /obj/structure/closet/emcloset, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/monotile, /area/exodus/hallway/primary/port) @@ -20460,11 +20376,13 @@ /turf/simulated/floor/wood/walnut, /area/exodus/library) "aQU" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/docking_area, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/exodus/hallway/secondary/exit) +/obj/effect/floor_decal/corner/purple/full, +/obj/structure/sign/warning/secure_area{ + dir = 1; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/exodus/hallway/primary/starboard) "aQV" = ( /obj/item/chems/glass/bucket, /obj/effect/floor_decal/corner/lime{ @@ -20597,7 +20515,8 @@ dir = 8 }, /obj/machinery/button/windowtint{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/button/alternate/door{ desc = "A remote control-switch for the research doors."; @@ -20676,13 +20595,10 @@ "aRt" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "acute1"; - name = "EMT Storage Privacy Shutters"; - opacity = FALSE + name = "EMT Storage Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/sleeper) @@ -20738,12 +20654,10 @@ }, /obj/structure/window/reinforced/tinted, /obj/structure/window/reinforced/tinted{ - dir = 4; - icon_state = "twindow" + dir = 4 }, /obj/structure/window/reinforced/tinted{ - dir = 8; - icon_state = "twindow" + dir = 8 }, /turf/simulated/floor/plating, /area/exodus/chapel/main) @@ -20775,7 +20689,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 @@ -20814,8 +20728,7 @@ /area/exodus/hallway/secondary/entry/port) "aRJ" = ( /obj/structure/bed/chair/comfy/beige{ - dir = 1; - icon_state = "comfychair_preview" + dir = 1 }, /turf/simulated/floor/lino, /area/exodus/hallway/secondary/entry/starboard) @@ -20937,13 +20850,10 @@ /area/exodus/hallway/secondary/exit) "aSa" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay3) @@ -20955,25 +20865,19 @@ /area/exodus/hallway/primary/central_two) "aSc" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay) "aSd" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay2) @@ -21049,13 +20953,10 @@ /area/exodus/library) "aSk" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 8; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay) @@ -21101,25 +21002,19 @@ /area/exodus/chapel/main) "aSp" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay2) "aSq" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 0; - icon_state = "shutter0"; id_tag = "staffroom"; - name = "Staff Room Privacy Shutters"; - opacity = FALSE + name = "Staff Room Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/cryo) @@ -21201,13 +21096,10 @@ /area/exodus/hallway/primary/port) "aSA" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 8; - icon_state = "shutter0"; id_tag = "staffroom"; - name = "Staff Room Privacy Shutters"; - opacity = FALSE + name = "Staff Room Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay2) @@ -21259,7 +21151,8 @@ /area/exodus/maintenance/auxsolarport) "aSF" = ( /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -21295,7 +21188,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) @@ -21464,13 +21357,10 @@ icon_state = "left"; name = "Research Division Delivery" }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/structure/window/reinforced{ @@ -21483,13 +21373,10 @@ /turf/simulated/wall/prepainted, /area/exodus/hydroponics/garden) "aTf" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -21692,7 +21579,8 @@ /area/exodus/storage/tech) "aTy" = ( /obj/machinery/atm{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/effect/floor_decal/corner/lime{ dir = 6 @@ -21746,26 +21634,20 @@ /area/exodus/research/mixing) "aTH" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, /area/exodus/medical/medbay4) "aTI" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "cmooffice"; - name = "CMO Office Privacy Shutters"; - opacity = FALSE + name = "CMO Office Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay4) @@ -21882,26 +21764,20 @@ /turf/simulated/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aTY" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "misclab"; - name = "Test Chamber Blast Doors"; - opacity = FALSE + name = "misclab" }, /obj/effect/wallframe_spawn/reinforced, /obj/machinery/atmospherics/pipe/simple/visible, /turf/simulated/floor/plating, /area/exodus/research/misc_lab) "aTZ" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "misclab"; - name = "Test Chamber Blast Doors"; - opacity = FALSE + name = "misclab" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -21948,13 +21824,10 @@ /area/exodus/crew_quarters/bar) "aUg" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "scanhideside"; - name = "Diagnostics Room Privacy Shutters"; - opacity = FALSE + name = "Diagnostics Room Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/medbay4) @@ -22047,7 +21920,7 @@ c_tag = "Kitchen" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/light{ dir = 1 @@ -22264,7 +22137,8 @@ /area/exodus/chapel/main) "aUT" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/steel_grid, @@ -22274,7 +22148,8 @@ dir = 8 }, /obj/machinery/vending/wallmed1{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/simulated/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -22301,7 +22176,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/random/tech_supply, /obj/random/tech_supply, @@ -22589,7 +22464,8 @@ pixel_y = 28 }, /obj/structure/closet/hydrant{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/plating, /area/exodus/storage/emergency2) @@ -23105,26 +22981,20 @@ /area/exodus/crew_quarters/heads/chief) "aWW" = ( /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/research) "aWX" = ( /obj/machinery/light, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/research) @@ -23158,13 +23028,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/research) @@ -23185,7 +23052,8 @@ /area/exodus/turret_protected/ai_upload) "aXd" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/storage/tools) @@ -23302,7 +23170,8 @@ /area/exodus/storage/emergency2) "aXs" = ( /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -23350,13 +23219,10 @@ /turf/simulated/floor/plating, /area/exodus/medical/patient_c) "aXx" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -23366,13 +23232,10 @@ /area/exodus/research) "aXy" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/door/airlock/research{ name = "Toxins Launch Room Access" @@ -23464,13 +23327,10 @@ /area/exodus/maintenance/substation/medical) "aXL" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/machinery/door/airlock/research{ name = "Toxins Launch Room" @@ -23513,7 +23373,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/bridge) @@ -23544,7 +23404,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/bridge) @@ -23632,13 +23492,10 @@ /area/exodus/turret_protected/ai_upload) "aYe" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "chemcounter"; - name = "Pharmacy Counter Shutters"; - opacity = FALSE + name = "Pharmacy Counter Shutters" }, /obj/structure/table/reinforced, /obj/machinery/door/window/westright{ @@ -23674,7 +23531,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "nuke_shuttle_dock_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/effect/floor_decal/industrial/warning{ dir = 6 @@ -23802,7 +23660,8 @@ /area/exodus/security/vacantoffice) "aYy" = ( /obj/machinery/atm{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/camera/network/civilian_east{ c_tag = "Bar West"; @@ -23915,13 +23774,10 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology/xenoflora_storage) @@ -24007,7 +23863,8 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/effect/floor_decal/corner/blue{ dir = 10 @@ -24199,7 +24056,8 @@ /area/exodus/hallway/primary/central_one) "aZi" = ( /obj/structure/sign/warning/secure_area{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/machinery/door/blast/regular/open{ dir = 4; @@ -24275,13 +24133,10 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology/xenoflora) @@ -24495,13 +24350,10 @@ /area/exodus/construction) "aZS" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "surgeryobs"; - name = "Operating Theatre Privacy Shutters"; - opacity = FALSE + name = "Operating Theatre Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/surgeryobs) @@ -25068,7 +24920,7 @@ "bbc" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -25315,12 +25167,13 @@ /area/exodus/library) "bbF" = ( /obj/structure/table, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/machinery/light{ dir = 4 }, /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/exodus/security/vacantoffice) @@ -25474,7 +25327,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/dark, /area/exodus/security/vacantoffice) @@ -25555,13 +25408,10 @@ /area/exodus/bridge) "bce" = ( /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/research/xenobiology) @@ -25617,13 +25467,10 @@ /area/exodus/bridge) "bck" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "surgeryobs"; - name = "Operating Theatre Privacy Shutters"; - opacity = FALSE + name = "Operating Theatre Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/surgery) @@ -25734,13 +25581,10 @@ /area/exodus/hallway/primary/starboard) "bcx" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 8; - icon_state = "shutter0"; id_tag = "surgeryobs2"; - name = "Operating Theatre Privacy Shutters"; - opacity = FALSE + name = "Operating Theatre Privacy Shutters" }, /turf/simulated/floor/plating, /area/exodus/medical/surgery2) @@ -26242,6 +26086,10 @@ id_tag = "admin_shuttle_dock_inner"; name = "Docking Port Airlock" }, +/obj/structure/sign/warning/airlock{ + dir = 4; + pixel_x = -32 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/entry/fore) "bdz" = ( @@ -26599,7 +26447,8 @@ /area/exodus/security/vacantoffice) "bet" = ( /obj/machinery/newscaster{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/structure/table{ name = "plastic table frame" @@ -26639,7 +26488,9 @@ /turf/simulated/floor/carpet, /area/exodus/bridge/meeting_room) "bey" = ( -/obj/machinery/vending/coffee, +/obj/machinery/vending/coffee{ + dir = 1 + }, /turf/simulated/floor/wood/walnut, /area/exodus/library) "bez" = ( @@ -26648,7 +26499,7 @@ /obj/item/storage/box, /obj/item/storage/box, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/effect/floor_decal/corner/white{ dir = 4 @@ -26827,7 +26678,8 @@ /area/exodus/hallway/primary/central_two) "beU" = ( /obj/machinery/atm{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -26875,7 +26727,8 @@ /area/exodus/hydroponics/garden) "beZ" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = -30 + pixel_y = -29; + dir = 1 }, /obj/structure/flora/pottedplant{ icon_state = "plant-22" @@ -26916,7 +26769,8 @@ "bfc" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -7; - pixel_y = -32 + pixel_y = -29; + dir = 1 }, /obj/effect/floor_decal/corner/white{ dir = 8 @@ -26924,7 +26778,8 @@ /obj/effect/floor_decal/corner/red, /obj/machinery/vending/wallmed1{ pixel_x = 7; - pixel_y = -32 + pixel_y = -24; + dir = 1 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/secondary/exit) @@ -27209,7 +27064,7 @@ /area/exodus/crew_quarters/captain) "bfK" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/effect/floor_decal/corner/lime{ dir = 5 @@ -27270,7 +27125,8 @@ /area/exodus/hallway/primary/starboard) "bfR" = ( /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/light{ dir = 8 @@ -27362,7 +27218,8 @@ /obj/machinery/button/mass_driver{ id_tag = "enginecore"; name = "Emergency Core Eject"; - pixel_x = -20 + pixel_x = -20; + dir = 4 }, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/structure/window/basic{ @@ -27375,13 +27232,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio3"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "Containment Blast Doors" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -27458,7 +27312,8 @@ "bgn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/light{ dir = 8 @@ -27745,7 +27600,7 @@ }, /obj/structure/sign/directions/medical{ dir = 8; - pixel_y = 32 + pixel_y = 40 }, /obj/effect/floor_decal/corner/lime{ dir = 5 @@ -27771,7 +27626,8 @@ /area/exodus/turret_protected/ai) "bgY" = ( /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/green{ @@ -27874,11 +27730,11 @@ icon_state = "0-4" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/item/radio/intercom{ dir = 4; @@ -27897,7 +27753,8 @@ /area/exodus/hallway/primary/starboard) "bhn" = ( /obj/structure/sign/warning/airlock{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/effect/floor_decal/corner/white{ dir = 8 @@ -27929,7 +27786,8 @@ "bhq" = ( /obj/machinery/airlock_sensor{ id_tag = "escape_dock_north_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/hallway/secondary/exit) @@ -27944,7 +27802,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "centcom_shuttle_dock_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 4; @@ -28480,7 +28339,7 @@ /area/exodus/bridge/meeting_room) "biv" = ( /obj/structure/table/woodentable, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /turf/simulated/floor/wood/walnut, /area/exodus/bridge/meeting_room) "biw" = ( @@ -28776,9 +28635,6 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_one) "bjc" = ( -/obj/abstract/landmark/start{ - name = "AI" - }, /obj/machinery/newscaster{ pixel_x = 32; pixel_y = 32 @@ -28807,9 +28663,9 @@ pixel_y = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, -/obj/structure/aicore/deactivated, +/obj/abstract/landmark/start/ai, /turf/simulated/floor/bluegrid, /area/exodus/turret_protected/ai) "bjd" = ( @@ -28841,10 +28697,10 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/item/radio/intercom{ dir = 8; @@ -28871,7 +28727,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -28998,7 +28854,8 @@ /area/exodus/security/prison/dorm) "bjs" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = -30 + pixel_y = -29; + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -29033,7 +28890,7 @@ "bjv" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -29125,7 +28982,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/carpet, /area/exodus/bridge/meeting_room) @@ -29203,7 +29060,8 @@ /area/exodus/bridge/meeting_room) "bjN" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = -30 + pixel_y = -29; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -29312,7 +29170,8 @@ /area/exodus/turret_protected/ai) "bjZ" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = -30 + pixel_y = -29; + dir = 1 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -29395,7 +29254,8 @@ /area/exodus/hallway/secondary/exit) "bkh" = ( /obj/machinery/newscaster{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/effect/floor_decal/corner/white{ dir = 8 @@ -29619,7 +29479,9 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "bkC" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Supply Foyer" + }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "bkD" = ( @@ -29700,7 +29562,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/wood/walnut, /area/exodus/bridge/meeting_room) @@ -29761,7 +29624,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_y = -30 + pixel_y = -29; + dir = 1 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -29815,13 +29679,10 @@ /area/exodus/research/docking) "bkV" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "medbayquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/techfloor/grid, @@ -29844,13 +29705,10 @@ "bkX" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "medbayquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/techfloor/grid, @@ -29931,7 +29789,8 @@ /area/exodus/quartermaster/storage) "blg" = ( /obj/structure/sign/warning/secure_area{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/effect/floor_decal/corner/lime/full, /obj/effect/floor_decal/industrial/loading{ @@ -30013,7 +29872,7 @@ /area/exodus/bridge/meeting_room) "blt" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/carpet, /area/exodus/crew_quarters/captain) @@ -30226,7 +30085,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "specops_dock_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 4; @@ -30259,7 +30119,7 @@ /area/exodus/medical/chemistry) "blX" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 30 + pixel_y = 29 }, /obj/machinery/camera/network/medbay{ c_tag = "Medbay - Chemistry" @@ -30450,13 +30310,10 @@ /area/exodus/medical/genetics) "bmq" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio3"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "Containment Blast Doors" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -30852,7 +30709,8 @@ pixel_y = 25 }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/structure/table{ name = "plastic table frame" @@ -30895,7 +30753,7 @@ }, /obj/item/chems/glass/beaker/sulphuric, /obj/structure/reagent_dispensers/acid{ - density = FALSE; + density = 0; pixel_y = 32 }, /turf/simulated/floor/tiled/white/monotile, @@ -30912,13 +30770,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio2"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "Containment Blast Doors" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -30931,13 +30786,14 @@ dir = 8 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/reception) "bnm" = ( /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 30; + dir = 4 }, /obj/structure/flora/pottedplant{ icon_state = "plant-10" @@ -30946,7 +30802,7 @@ dir = 1 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/reception) @@ -31111,7 +30967,8 @@ /area/exodus/quartermaster/office) "bnB" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/effect/floor_decal/corner/blue{ dir = 6 @@ -31161,7 +31018,7 @@ "bnF" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/light/small, /turf/simulated/floor/plating, @@ -31536,7 +31393,7 @@ /turf/simulated/floor/tiled/dark, /area/exodus/research/chargebay) "boF" = ( -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/structure/table/woodentable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -31616,7 +31473,8 @@ "boN" = ( /obj/structure/filing_cabinet/chestdrawer, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/effect/floor_decal/corner/purple{ dir = 5 @@ -31649,7 +31507,8 @@ }, /obj/effect/floor_decal/industrial/warning, /obj/structure/extinguisher_cabinet{ - pixel_x = -25 + pixel_x = -29; + dir = 4 }, /obj/machinery/cell_charger, /turf/simulated/floor/tiled/white, @@ -31757,7 +31616,8 @@ /area/exodus/hallway/secondary/entry/aft) "bpa" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/effect/floor_decal/corner/lime{ dir = 6 @@ -32036,7 +31896,8 @@ /area/exodus/maintenance/substation/command) "bpE" = ( /obj/structure/closet/hydrant{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/structure/cable{ icon_state = "1-2" @@ -32146,7 +32007,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/wood/walnut, /area/exodus/crew_quarters/captain) @@ -32176,7 +32038,8 @@ /area/exodus/medical/chemistry) "bpR" = ( /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/green{ icon_state = "1-4" @@ -32252,13 +32115,10 @@ /area/exodus/medical/patient_wing/washroom) "bpX" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio2"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "Containment Blast Doors" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -32299,7 +32159,7 @@ dir = 6 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/office) @@ -32514,7 +32374,8 @@ /obj/item/clothing/suit/armor/captain, /obj/item/clothing/head/helmet/space/capspace, /obj/machinery/newscaster{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/random_multi/single_item/captains_spare_id, /turf/simulated/floor/wood/walnut, @@ -32585,7 +32446,8 @@ /area/exodus/maintenance/locker) "bqH" = ( /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -32793,10 +32655,10 @@ /obj/machinery/portable_atmospherics/powered/scrubber/huge, /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/window/borosilicate_reinforced{ - dir = 4; + dir = 4 }, /obj/structure/window/borosilicate_reinforced{ - dir = 1; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/research/mixing) @@ -32828,7 +32690,8 @@ dir = 4 }, /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/machinery/porta_turret{ dir = 8 @@ -32918,13 +32781,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio1"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "Containment Blast Doors" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -32978,7 +32838,7 @@ id_tag = "packageExternal" }, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/structure/cable{ icon_state = "4-8" @@ -33230,13 +33090,10 @@ /area/exodus/medical/reception) "brW" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio1"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio1" }, /obj/structure/cable/green{ icon_state = "0-4" @@ -33244,13 +33101,11 @@ /turf/simulated/floor/plating, /area/exodus/research/xenobiology) "brX" = ( -/obj/structure/closet/secure_closet/medical_wall{ - name = "Pill Cabinet"; - pixel_y = -32 +/obj/structure/closet/secure_closet/medical_wall/pills{ + pixel_y = -32; + dir = 1 }, /obj/item/chems/syringe/antibiotic, -/obj/item/storage/pill_bottle/antitox, -/obj/item/storage/pill_bottle/painkillers, /obj/structure/table{ name = "plastic table frame" }, @@ -33541,7 +33396,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -33587,10 +33442,10 @@ /obj/machinery/portable_atmospherics/powered/scrubber/huge, /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/window/borosilicate_reinforced{ - dir = 8; + dir = 8 }, /obj/structure/window/borosilicate_reinforced{ - dir = 1; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/research/mixing) @@ -33908,7 +33763,8 @@ dir = 8 }, /obj/machinery/vending/wallmed1{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/exodus/research) @@ -33958,7 +33814,7 @@ "btA" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/table/woodentable, /obj/item/deck/cards{ @@ -34035,7 +33891,8 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, /obj/structure/sign/warning/airlock{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/research/docking) @@ -34174,7 +34031,7 @@ "btW" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -34184,7 +34041,8 @@ "btX" = ( /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -34234,7 +34092,8 @@ }, /obj/machinery/recharge_station, /obj/structure/extinguisher_cabinet{ - pixel_y = -29 + pixel_y = -29; + dir = 1 }, /turf/simulated/floor/tiled/dark, /area/exodus/research/chargebay) @@ -34305,9 +34164,12 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bun" = ( -/obj/structure/sign/warning/secure_area, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/research) +/obj/structure/sign/warning/docking_area{ + dir = 8; + pixel_x = 32 + }, +/turf/space, +/area/space) "buo" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -34849,7 +34711,7 @@ "bvi" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/dark, /area/exodus/turret_protected/ai_upload) @@ -34877,13 +34739,10 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/chemistry) "bvl" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "medbayrecquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -34894,13 +34753,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/reception) "bvm" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "medbayrecquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/techfloor/grid, @@ -34937,7 +34793,8 @@ }, /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/structure/cable/green{ icon_state = "4-8" @@ -34964,13 +34821,10 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/incinerator) "bvt" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "medbayrecquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/structure/cable/green{ icon_state = "2-8" @@ -34979,13 +34833,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/reception) "bvu" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "medbayrecquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/structure/cable/green{ icon_state = "4-8" @@ -35004,7 +34855,8 @@ pixel_y = 5 }, /obj/machinery/light_switch{ - pixel_x = -23 + pixel_x = -23; + dir = 4 }, /obj/random/firstaid{ pixel_y = 1 @@ -35046,9 +34898,9 @@ "bvA" = ( /obj/effect/floor_decal/corner/paleblue, /obj/structure/table, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, +/obj/item/organ/internal/brain_interface/empty, +/obj/item/organ/internal/brain_interface/empty, +/obj/item/organ/internal/brain_interface/empty, /turf/simulated/floor/tiled/dark, /area/exodus/research/robotics) "bvB" = ( @@ -35094,13 +34946,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled/techfloor/grid, @@ -35220,25 +35069,19 @@ /obj/effect/wallframe_spawn/reinforced, /obj/structure/disposalpipe/segment, /obj/structure/cable/green, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio4"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio4" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology) "bvX" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio4"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio4" }, /obj/structure/cable/green, /turf/simulated/floor/plating, @@ -35260,13 +35103,10 @@ /area/exodus/hallway/secondary/entry/fore) "bvZ" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio5"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio5" }, /obj/structure/disposalpipe/segment, /obj/structure/cable/green, @@ -35274,13 +35114,10 @@ /area/exodus/research/xenobiology) "bwa" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio5"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio5" }, /obj/structure/cable/green, /turf/simulated/floor/plating, @@ -35364,13 +35201,10 @@ /obj/effect/wallframe_spawn/reinforced, /obj/structure/disposalpipe/segment, /obj/structure/cable/green, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio6"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio6" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology) @@ -35398,13 +35232,10 @@ "bwq" = ( /obj/effect/wallframe_spawn/reinforced, /obj/structure/cable/green, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio6"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio6" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology) @@ -35469,13 +35300,13 @@ pixel_x = 24 }, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" + }, +/obj/structure/sign/warning/secure_area{ + pixel_y = 32 }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/research) @@ -35647,7 +35478,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/carpet, /area/exodus/crew_quarters/captain) @@ -35669,7 +35500,7 @@ c_tag = "Medbay Fore Starboard Corridor" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/medbay2) @@ -36184,7 +36015,8 @@ "bxY" = ( /obj/machinery/fabricator, /obj/machinery/light_switch{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/office) @@ -36718,7 +36550,7 @@ /obj/machinery/portable_atmospherics/powered/scrubber/huge, /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/window/borosilicate_reinforced{ - dir = 1; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/research/mixing) @@ -36730,7 +36562,7 @@ /obj/item/flash/synthetic, /obj/item/flash/synthetic, /obj/item/flash/synthetic, -/obj/item/organ/internal/posibrain, +/obj/item/organ/internal/brain/robotic, /obj/item/robotanalyzer, /obj/effect/floor_decal/corner/paleblue{ dir = 10 @@ -36912,7 +36744,7 @@ /obj/structure/table, /obj/item/storage/firstaid/surgery, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/dark, /area/exodus/research/robotics) @@ -36946,7 +36778,7 @@ dir = 4 }, /obj/structure/window/borosilicate_reinforced{ - dir = 4; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/exodus/research/mixing) @@ -36954,7 +36786,7 @@ /obj/machinery/portable_atmospherics/canister, /obj/effect/floor_decal/corner/purple/three_quarters, /obj/structure/window/borosilicate_reinforced{ - dir = 8; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/exodus/research/mixing) @@ -36987,7 +36819,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/structure/closet/secure_closet/RD, +/obj/structure/closet/secure_closet/research_director, /obj/item/paper/monitorkey, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/heads/hor) @@ -37067,7 +36899,7 @@ /area/exodus/turret_protected/ai_upload_foyer) "bzQ" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/teleport/hub, /turf/simulated/floor/tiled/dark/monotile, @@ -37145,7 +36977,8 @@ /area/exodus/teleporter) "bAa" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -37308,7 +37141,9 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/medbay) "bAp" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Medbay Storage" + }, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -37609,7 +37444,8 @@ /obj/item/clothing/glasses/welding, /obj/item/clothing/glasses/welding, /obj/machinery/light_switch{ - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -37617,13 +37453,10 @@ /turf/simulated/floor/tiled/white, /area/exodus/research/robotics) "bAP" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "EngineBlast"; - name = "Engine Monitoring Room Blast Doors"; - opacity = FALSE + name = "EngineBlast" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -37759,12 +37592,9 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/security/prison/dorm) "bBb" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "EngineBlast"; - name = "Engine Monitoring Room Blast Doors"; - opacity = FALSE + name = "Engine Monitoring Room Blast Doors" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -37982,7 +37812,8 @@ }, /obj/effect/floor_decal/corner/grey/diagonal, /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/medbreak) @@ -38158,9 +37989,7 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/chemistry) "bBV" = ( -/obj/machinery/computer/modular/telescreen/preset/generic{ - dir = 2 - }, +/obj/machinery/computer/modular/telescreen/preset/generic, /obj/effect/floor_decal/corner/lime{ dir = 5 }, @@ -38231,7 +38060,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/office) @@ -38255,7 +38084,8 @@ dir = 9 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/medbay2) @@ -38311,13 +38141,10 @@ /turf/simulated/floor/tiled/white, /area/exodus/research) "bCl" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "researchlockdown"; - name = "Research Division Blast Doors"; - opacity = FALSE + name = "researchlockdown" }, /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -38380,7 +38207,7 @@ /area/ship/exodus_pod_research) "bCs" = ( /obj/structure/table, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/effect/floor_decal/corner/purple/diagonal{ dir = 4 }, @@ -38389,7 +38216,8 @@ "bCt" = ( /obj/machinery/light_switch{ pixel_x = -23; - pixel_y = -23 + pixel_y = -23; + dir = 4 }, /obj/structure/cable/green{ icon_state = "2-8" @@ -38553,7 +38381,7 @@ "bCL" = ( /obj/machinery/navbeacon/Research, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/loading{ @@ -38716,7 +38544,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/item/wrench, /obj/machinery/camera/network/medbay{ @@ -38912,7 +38740,8 @@ /obj/item/clothing/accessory/stethoscope, /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/machinery/camera/network/medbay{ c_tag = "Medbay Equipment Storage"; @@ -38944,11 +38773,7 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/storage/primary) "bDv" = ( -/obj/structure/closet/secure_closet/medical_wall{ - name = "Pill Cabinet" - }, -/obj/item/storage/pill_bottle/antitox, -/obj/item/storage/pill_bottle/painkillers, +/obj/structure/closet/secure_closet/medical_wall/pills, /obj/item/chems/syringe/antibiotic, /obj/item/chems/syringe/antibiotic, /obj/item/chems/syringe/stabilizer, @@ -38995,7 +38820,7 @@ /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/plating, /area/exodus/medical/genetics/cloning) @@ -39085,7 +38910,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/storage) @@ -39329,7 +39154,8 @@ id_tag = "QMLoad" }, /obj/machinery/status_display/supply_display{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/storage) @@ -39376,18 +39202,6 @@ "bEn" = ( /turf/simulated/wall/prepainted, /area/exodus/maintenance/research_shuttle) -"bEo" = ( -/obj/machinery/button/access/exterior{ - id_tag = "toxin_test_airlock"; - name = "exterior access button"; - pixel_x = -20; - pixel_y = -20 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/airless, -/area/exodus/research/test_area) "bEp" = ( /obj/machinery/light, /obj/structure/disposalpipe/segment{ @@ -39445,7 +39259,8 @@ /area/exodus/quartermaster/office) "bEu" = ( /obj/machinery/atm{ - pixel_x = -28 + pixel_x = -28; + dir = 4 }, /obj/effect/floor_decal/corner/brown{ dir = 9 @@ -39494,18 +39309,19 @@ dir = 5 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/medbay3) "bEA" = ( -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/structure/table/glass, /turf/simulated/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/hop) "bEB" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -39578,13 +39394,10 @@ /turf/simulated/floor/tiled/steel_grid, /area/exodus/teleporter) "bEJ" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 8; - icon_state = "shutter0"; id_tag = "medbayquar"; - name = "Medbay Emergency Quarantine Shutters"; - opacity = FALSE + name = "Medbay Emergency Quarantine Shutters" }, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/loading{ @@ -39987,7 +39800,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/cable{ icon_state = "4-8" @@ -40022,7 +39835,7 @@ "bFF" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/janitor) @@ -40278,7 +40091,8 @@ tag_airpump = "tox_airlock_pump"; tag_chamber_sensor = "tox_airlock_sensor"; tag_exterior_door = "tox_airlock_exterior"; - tag_interior_door = "tox_airlock_interior" + tag_interior_door = "tox_airlock_interior"; + dir = 4 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -40554,7 +40368,7 @@ }, /obj/machinery/door/firedoor, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/effect/floor_decal/corner/paleblue{ dir = 5 @@ -40958,13 +40772,10 @@ "bHr" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology/xenoflora) @@ -41009,7 +40820,8 @@ "bHx" = ( /obj/machinery/airlock_sensor{ id_tag = "research_dock_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; @@ -41121,7 +40933,7 @@ preset_channels = list("Research","Miscellaneous Reseach") }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/reinforced, /area/exodus/research/misc_lab) @@ -41320,7 +41132,8 @@ "bHY" = ( /obj/machinery/disposal, /obj/structure/sign/warning/airlock{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/structure/disposalpipe/trunk, /obj/effect/floor_decal/industrial/warning/corner, @@ -41347,13 +41160,10 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/techfloor/grid, @@ -41413,13 +41223,10 @@ /area/exodus/hallway/primary/central_two) "bIh" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "acute1"; - name = "EMT Storage Privacy Shutters"; - opacity = FALSE + name = "EMT Storage Privacy Shutters" }, /obj/effect/floor_decal/corner/paleblue{ dir = 10 @@ -41428,16 +41235,14 @@ /area/exodus/medical/sleeper) "bIi" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "acute1"; - name = "EMT Storage Privacy Shutters"; - opacity = FALSE + name = "EMT Storage Privacy Shutters" }, /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /obj/effect/floor_decal/corner/paleblue{ dir = 10 @@ -41630,7 +41435,8 @@ /area/exodus/research/docking) "bIC" = ( /obj/machinery/light_switch{ - pixel_x = -22 + pixel_x = -22; + dir = 4 }, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/sleeper{ @@ -42384,7 +42190,8 @@ "bJX" = ( /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/machinery/constructable_frame/machine_frame, /obj/item/shard, @@ -42427,7 +42234,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/window/westleft{ name = "Server Room"; - opacity = TRUE + opacity = 1 }, /obj/machinery/door/window/eastleft{ name = "Server Room" @@ -42623,7 +42430,8 @@ }, /obj/effect/floor_decal/industrial/warning, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/machinery/network/relay, /turf/simulated/floor/tiled/steel_grid, @@ -42732,7 +42540,7 @@ "bKL" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -42772,7 +42580,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -42828,7 +42636,7 @@ "bKW" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -43168,7 +42976,8 @@ /area/exodus/research/storage) "bLL" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/research/storage) @@ -43235,7 +43044,8 @@ /area/exodus/maintenance/atmos_control) "bLQ" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/effect/floor_decal/corner/purple{ dir = 8 @@ -43249,7 +43059,7 @@ /obj/item/stool/padded, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/sleeper) @@ -43272,9 +43082,7 @@ /obj/effect/floor_decal/corner/purple/diagonal{ dir = 4 }, -/obj/machinery/keycard_auth{ - dir = 2 - }, +/obj/machinery/keycard_auth, /obj/machinery/computer/modular/preset/civilian, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/heads/hor) @@ -43336,7 +43144,8 @@ pixel_y = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/heads/hor) @@ -43577,7 +43386,7 @@ /obj/random/medical, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/item/stack/tape_roll/barricade_tape/medical, /turf/simulated/floor/tiled/white, @@ -43602,7 +43411,8 @@ /obj/machinery/button/blast_door{ id_tag = "acutesep"; name = "Acute Separation Shutters"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/abstract/landmark/start{ name = "Paramedic" @@ -43646,7 +43456,7 @@ dir = 8; pixel_x = -24 }, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/structure/table/glass, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/heads/cmo) @@ -43670,7 +43480,7 @@ /obj/structure/cable/green{ icon_state = "0-2" }, -/obj/structure/closet/secure_closet/CMO, +/obj/structure/closet/secure_closet/cmo, /obj/item/clothing/mask/gas, /obj/item/clothing/accessory/stethoscope, /obj/item/storage/belt/medical, @@ -43690,7 +43500,8 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/medbay2) @@ -43716,7 +43527,8 @@ /obj/machinery/button/blast_door{ id_tag = "staffroom"; name = "Staff Room Shutters Control"; - pixel_x = -26 + pixel_x = -26; + dir = 4 }, /obj/effect/floor_decal/corner/grey/diagonal, /turf/simulated/floor/tiled/white, @@ -43780,7 +43592,7 @@ dir = 1 }, /obj/structure/bookcase/manuals/medical, -/obj/item/book/manual/stasis, +/obj/item/book/fluff/stasis, /obj/effect/floor_decal/corner/grey/diagonal, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/medbreak) @@ -44136,7 +43948,7 @@ /area/exodus/hallway/primary/aft) "bNG" = ( /obj/structure/table, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/qm) "bNH" = ( @@ -44282,19 +44094,16 @@ "bNY" = ( /obj/machinery/navbeacon/Janitor, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/exodus/janitor) "bNZ" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "acutesep"; - name = "Acute Separation Shutters"; - opacity = FALSE + name = "Acute Separation Shutters" }, /obj/machinery/door/firedoor, /obj/effect/floor_decal/corner/paleblue{ @@ -44519,7 +44328,7 @@ dir = 1 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/research/mixing) @@ -45190,7 +44999,8 @@ "bPK" = ( /obj/structure/disposalpipe/segment, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 30; + dir = 4 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -45199,7 +45009,8 @@ /area/exodus/medical/medbay2) "bPL" = ( /obj/machinery/light_switch{ - pixel_x = -22 + pixel_x = -22; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -45426,7 +45237,7 @@ }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/research/mixing) @@ -45557,7 +45368,8 @@ }, /obj/item/multitool, /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/structure/table/steel, /obj/item/scanner/plant, @@ -45782,12 +45594,13 @@ pixel_x = -22; pixel_y = -32 }, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /obj/structure/closet/secure_closet/medical_wall{ name = "O- Blood Locker"; - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/effect/floor_decal/corner/pink{ dir = 9 @@ -45795,7 +45608,9 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/sleeper) "bQZ" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Emergency Recovery" + }, /turf/simulated/floor/tiled/white, /area/exodus/medical/sleeper) "bRa" = ( @@ -45806,13 +45621,10 @@ /obj/machinery/door/firedoor{ dir = 4 }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "acute2"; - name = "Acute Privacy Shutters"; - opacity = FALSE + name = "Acute Privacy Shutters" }, /obj/effect/floor_decal/corner/pink{ dir = 9 @@ -46463,7 +46275,7 @@ /obj/machinery/papershredder, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/heads/cmo) @@ -46536,7 +46348,7 @@ /obj/effect/floor_decal/corner/grey/diagonal, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/medbreak) @@ -46579,7 +46391,7 @@ /obj/effect/floor_decal/corner/grey/diagonal, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/white, /area/exodus/crew_quarters/medbreak) @@ -46707,14 +46519,13 @@ /area/exodus/research/storage) "bSJ" = ( /obj/structure/bed/chair/comfy/teal{ - dir = 8; - icon_state = "comfychair_preview" + dir = 8 }, /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/medbay4) @@ -46805,7 +46616,8 @@ dir = 1 }, /obj/structure/sign/warning/secure_area{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/research/mixing) @@ -46961,7 +46773,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/effect/floor_decal/corner/yellow{ dir = 9 @@ -46984,13 +46797,10 @@ /turf/simulated/wall/r_wall/prepainted, /area/exodus/storage/tech) "bTs" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "scanhide"; - name = "Diagnostics Room Separation Shutters"; - opacity = FALSE + name = "Diagnostics Room Separation Shutters" }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/sleeper) @@ -47002,31 +46812,26 @@ /turf/simulated/floor/tiled/white, /area/exodus/research) "bTu" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "scanhide"; - name = "Diagnostics Room Separation Shutters"; - opacity = FALSE + name = "Diagnostics Room Separation Shutters" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/sleeper) "bTw" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/simulated/floor/plating, /area/exodus/storage/tech) "bTx" = ( -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 2; - icon_state = "shutter0"; id_tag = "scanhide"; - name = "Diagnostics Room Separation Shutters"; - opacity = FALSE + name = "Diagnostics Room Separation Shutters" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/techfloor/grid, @@ -47206,7 +47011,7 @@ /area/exodus/maintenance/medbay) "bTP" = ( /obj/machinery/shieldwallgen{ - anchored = TRUE + anchored = 1 }, /obj/structure/cable/green{ icon_state = "0-2" @@ -47249,13 +47054,10 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/medbay) "bTS" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "misclab"; - name = "Test Chamber Blast Doors"; - opacity = FALSE + name = "misclab" }, /obj/machinery/door/window/southright{ name = "Test Chamber" @@ -47284,13 +47086,10 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/medbay) "bTU" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "misclab"; - name = "Test Chamber Blast Doors"; - opacity = FALSE + name = "misclab" }, /obj/machinery/door/window/southleft{ name = "Test Chamber" @@ -47339,7 +47138,8 @@ /area/exodus/research/storage) "bTY" = ( /obj/machinery/light_switch{ - pixel_y = -23 + pixel_y = -23; + dir = 1 }, /obj/machinery/power/apc{ dir = 8; @@ -47453,7 +47253,7 @@ /area/exodus/engineering) "bUm" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -47674,8 +47474,7 @@ dir = 1 }, /obj/structure/bed/chair/comfy/teal{ - dir = 4; - icon_state = "comfychair_preview" + dir = 4 }, /obj/effect/floor_decal/corner/paleblue{ dir = 5 @@ -47693,7 +47492,7 @@ /area/exodus/gateway) "bUP" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/structure/hygiene/sink{ dir = 8; @@ -48036,7 +47835,8 @@ dir = 1 }, /obj/machinery/airlock_sensor{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/simulated/floor/airless, /area/exodus/research/mixing) @@ -48148,7 +47948,7 @@ dir = 8 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/light/small/emergency, /obj/effect/shuttle_landmark/escape_pod/start/pod4, @@ -48244,7 +48044,8 @@ /area/exodus/engineering/engineering_monitoring) "bVZ" = ( /obj/structure/sign/warning/airlock{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; @@ -48266,7 +48067,7 @@ "bWa" = ( /obj/machinery/navbeacon/Medbay, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /turf/simulated/floor/plating, /area/exodus/medical/sleeper) @@ -48292,7 +48093,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Emergency Scanning" + }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/medical/sleeper) "bWe" = ( @@ -48303,13 +48106,10 @@ /obj/machinery/door/firedoor{ dir = 4 }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "scanhideside"; - name = "Diagnostics Room Privacy Shutters"; - opacity = FALSE + name = "Diagnostics Room Privacy Shutters" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -48659,7 +48459,8 @@ /area/exodus/research/mixing) "bWR" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/wood/walnut, /area/exodus/engineering/break_room) @@ -48712,7 +48513,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/engineering/engine_airlock) @@ -48721,11 +48523,13 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/airlock_sensor{ id_tag = "engine_room_airlock"; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/machinery/atmospherics/portables_connector, /obj/effect/floor_decal/industrial/outline/yellow, @@ -48747,7 +48551,7 @@ "bXb" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/closet/bombcloset, /turf/simulated/floor/tiled/white, @@ -48830,7 +48634,8 @@ /obj/machinery/airlock_sensor{ id_tag = "robotics_solar_sensor"; pixel_x = 12; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -48902,13 +48707,10 @@ /obj/machinery/door/firedoor{ dir = 4 }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "scanhideside"; - name = "Diagnostics Room Privacy Shutters"; - opacity = FALSE + name = "Diagnostics Room Privacy Shutters" }, /obj/structure/cable/green{ icon_state = "4-8" @@ -48968,7 +48770,8 @@ /area/exodus/medical/medbay4) "bXA" = ( /obj/machinery/newscaster{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/structure/disposalpipe/sortjunction{ dir = 8; @@ -49043,7 +48846,8 @@ }, /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/structure/cable/green{ icon_state = "4-8" @@ -49134,7 +48938,8 @@ "bXO" = ( /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/structure/cable/green{ icon_state = "4-8" @@ -49346,7 +49151,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/item/radio/intercom{ dir = 8; @@ -49544,7 +49349,8 @@ "bYA" = ( /obj/machinery/light, /obj/structure/extinguisher_cabinet{ - pixel_y = -29 + pixel_y = -29; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/visible{ dir = 4 @@ -49582,7 +49388,8 @@ /obj/machinery/button/access/exterior{ id_tag = "virology_airlock_control"; name = "Virology Access Button"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -49862,13 +49669,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "scanhideside"; - name = "Diagnostics Room Privacy Shutters"; - opacity = FALSE + name = "Diagnostics Room Privacy Shutters" }, /obj/effect/floor_decal/corner/pink{ dir = 9 @@ -50004,7 +49808,8 @@ "bZC" = ( /obj/machinery/light_switch{ pixel_x = 22; - pixel_y = -10 + pixel_y = -10; + dir = 8 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -50071,7 +49876,8 @@ "bZJ" = ( /obj/machinery/atmospherics/pipe/simple/visible, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/exodus/research/misc_lab) @@ -50123,7 +49929,7 @@ "bZO" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/bed/roller, /obj/machinery/camera/network/medbay{ @@ -50353,7 +50159,8 @@ /area/exodus/engineering/break_room) "cal" = ( /obj/machinery/newscaster{ - pixel_x = 28 + pixel_x = 28; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -50436,7 +50243,8 @@ }, /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/medical/sleeper) @@ -50475,8 +50283,7 @@ pixel_x = -22 }, /obj/structure/bed/chair/comfy/teal{ - dir = 4; - icon_state = "comfychair_preview" + dir = 4 }, /obj/effect/floor_decal/corner/pink/three_quarters{ dir = 8 @@ -50607,7 +50414,8 @@ "caM" = ( /obj/structure/iv_drip, /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /obj/machinery/power/apc{ dir = 1; @@ -50633,7 +50441,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 29; + dir = 8 }, /obj/structure/bed/roller, /turf/simulated/floor/tiled/white, @@ -50773,7 +50582,8 @@ /obj/machinery/button/blast_door{ id_tag = "disvent"; name = "Incinerator Vent Control"; - pixel_y = -24 + pixel_y = -24; + dir = 1 }, /obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/tiled/steel_grid, @@ -50982,7 +50792,7 @@ /area/exodus/crew_quarters/heads/chief) "cbC" = ( /obj/structure/table/reinforced, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /turf/simulated/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/chief) "cbD" = ( @@ -51086,7 +50896,8 @@ icon_state = "1-2" }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/medbay4) @@ -51144,7 +50955,6 @@ /area/exodus/medical/patient_wing) "cbW" = ( /obj/structure/closet/crate{ - icon_state = "crateopen"; name = "Grenade Crate"; opened = 1 }, @@ -51250,7 +51060,8 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_x = 28 + pixel_x = 28; + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -51298,7 +51109,8 @@ /obj/machinery/button/access/exterior{ id_tag = "virologyq_airlock_control"; name = "Virology Quarantine Access Button"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -51330,13 +51142,10 @@ "ccn" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /turf/simulated/floor/plating, /area/exodus/research/xenobiology) @@ -51351,13 +51160,10 @@ /obj/structure/cable/green{ icon_state = "2-4" }, -/obj/machinery/door/blast/shutters{ - density = FALSE; +/obj/machinery/door/blast/shutters/open{ dir = 4; - icon_state = "shutter0"; id_tag = "hop_office_desk"; - name = "HoP Office Privacy Shutters"; - opacity = FALSE + name = "HoP Office Privacy Shutters" }, /obj/structure/cable/green{ icon_state = "4-8" @@ -51418,6 +51224,12 @@ /obj/random/maintenance, /obj/random/maintenance, /obj/random/maintenance, +/obj/machinery/button/access/interior{ + id_tag = "toxin_test_airlock"; + name = "interior access button"; + pixel_x = 20; + dir = 8 + }, /turf/simulated/floor/plating, /area/exodus/maintenance/research_starboard) "ccw" = ( @@ -51466,7 +51278,8 @@ "ccC" = ( /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor, /area/exodus/maintenance/atmos_control) @@ -51499,7 +51312,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 29; + dir = 8 }, /obj/machinery/alarm{ dir = 1; @@ -51555,7 +51369,7 @@ dir = 5 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/medical/surgeryobs) @@ -51777,7 +51591,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/freezer, /area/exodus/crew_quarters/sleep/engi_wash) @@ -51918,7 +51732,8 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 30; + dir = 4 }, /obj/machinery/computer/modular/preset/medical{ dir = 8 @@ -52012,14 +51827,16 @@ /obj/item/pen, /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -36 + pixel_y = -36; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, /obj/machinery/button/windowtint{ id_tag = "isoC_window_tint"; - pixel_y = -26 + pixel_y = -26; + dir = 1 }, /obj/effect/floor_decal/corner/pink/three_quarters{ dir = 4 @@ -52029,7 +51846,8 @@ "cdB" = ( /obj/machinery/light, /obj/machinery/newscaster{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -52359,7 +52177,8 @@ pixel_x = 24 }, /obj/machinery/button/windowtint{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/light_switch{ pixel_x = -25; @@ -52493,7 +52312,8 @@ /obj/effect/floor_decal/industrial/warning/full, /obj/machinery/airlock_sensor{ id_tag = "merchant_shuttle_station_sensor"; - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/hallway/secondary/entry/fore) @@ -52624,7 +52444,8 @@ dir = 9 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/medical/surgeryobs) @@ -52739,7 +52560,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/white/diagonal, /turf/simulated/floor/tiled/steel_grid, @@ -52793,7 +52614,7 @@ /area/exodus/engineering/workshop) "cfj" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/item/stack/cable_coil, /obj/item/stack/cable_coil{ @@ -52825,7 +52646,8 @@ /area/exodus/medical/biostorage) "cfl" = ( /obj/structure/sign/warning/airlock{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/machinery/atmospherics/portables_connector{ dir = 8 @@ -53078,7 +52900,7 @@ "cfT" = ( /obj/machinery/computer/modular/preset/cardslot/command, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/chief) @@ -53181,7 +53003,8 @@ dir = 1 }, /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/machinery/smartfridge/drying_rack, /obj/effect/floor_decal/corner/purple/three_quarters{ @@ -53209,7 +53032,8 @@ "cgh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -54052,7 +53876,8 @@ pixel_y = -20 }, /obj/structure/sign/warning/airlock{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/effect/floor_decal/industrial/warning, /obj/machinery/atmospherics/pipe/manifold/visible{ @@ -54110,13 +53935,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/research/xenobiology) "chT" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -54230,7 +54052,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/freezer, /area/exodus/research/xenobiology/xenoflora_storage) @@ -54260,7 +54082,8 @@ "cih" = ( /obj/machinery/light_switch{ pixel_x = 26; - pixel_y = -6 + pixel_y = -6; + dir = 8 }, /obj/structure/table/glass, /turf/simulated/floor/tiled/white, @@ -54397,7 +54220,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/machinery/portable_atmospherics/hydroponics, /turf/simulated/floor/tiled/freezer, @@ -54422,7 +54245,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/engineering/foyer) @@ -54536,7 +54359,8 @@ /area/exodus/engineering/locker_room) "ciR" = ( /obj/machinery/light_switch{ - pixel_x = -22 + pixel_x = -22; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/surgery) @@ -54626,7 +54450,8 @@ /area/exodus/medical/surgery2) "cje" = ( /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/surgery2) @@ -54771,7 +54596,7 @@ /obj/structure/closet/secure_closet/atmos_personal, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/item/tank/emergency/oxygen/engi, /turf/simulated/floor/tiled/steel_grid, @@ -55396,7 +55221,8 @@ id_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 8 @@ -55560,7 +55386,7 @@ "clg" = ( /obj/machinery/navbeacon/Engineering, /obj/structure/plasticflaps{ - opacity = TRUE + opacity = 1 }, /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/loading{ @@ -55671,7 +55497,7 @@ /area/exodus/research/xenobiology/xenoflora) "clt" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/white, /area/exodus/medical/virology) @@ -55707,7 +55533,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/engineering) @@ -55935,9 +55761,11 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/virology/access) "clS" = ( -/obj/structure/sign/warning/docking_area, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/maintenance/engi_shuttle) +/obj/structure/sign/warning/radioactive{ + pixel_y = 32 + }, +/turf/space, +/area/space) "clT" = ( /obj/structure/sign/warning/fire{ pixel_y = 32 @@ -55964,15 +55792,21 @@ /turf/simulated/floor/tiled/freezer, /area/exodus/research/xenobiology/xenoflora_storage) "clW" = ( -/obj/structure/sign/warning/docking_area, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/maintenance/engineering) +/obj/machinery/button/access/exterior{ + id_tag = "toxin_test_airlock"; + name = "exterior access button"; + pixel_x = -20; + dir = 4 + }, +/turf/space, +/area/space) "clX" = ( /obj/structure/cable/green{ icon_state = "1-2" }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/plating, /area/exodus/engineering/sublevel_access) @@ -55980,7 +55814,8 @@ /obj/machinery/light, /obj/machinery/light_switch{ name = "light switch "; - pixel_y = -22 + pixel_y = -22; + dir = 1 }, /obj/machinery/atmospherics/portables_connector{ dir = 4 @@ -56026,15 +55861,17 @@ /obj/item/radio/off, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/table/steel, /turf/simulated/floor/tiled/steel_grid, /area/exodus/engineering/workshop) "cmc" = ( -/obj/structure/sign/warning/radioactive, -/turf/simulated/wall/r_wall/prepainted, -/area/exodus/engineering/engine_room) +/obj/structure/sign/warning/biohazard{ + pixel_y = 32 + }, +/turf/space, +/area/space) "cmd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -56347,7 +56184,7 @@ /area/exodus/engineering/locker_room) "cmM" = ( /obj/machinery/door/blast/regular/open{ - density = FALSE; + density = 0; dir = 4; id_tag = "SupermatterPort"; name = "Reactor Blast Door" @@ -56472,7 +56309,8 @@ dir = 1 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/effect/floor_decal/corner/blue{ dir = 6 @@ -56525,7 +56363,8 @@ id_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "4-8" @@ -56600,7 +56439,8 @@ /obj/machinery/airlock_sensor{ id_tag = "solar_xeno_sensor"; pixel_x = 25; - pixel_y = 12 + pixel_y = 12; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; @@ -56718,7 +56558,8 @@ /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/structure/sign/warning/compressed_gas{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) @@ -56844,9 +56685,9 @@ /area/exodus/medical/virology) "cnW" = ( /obj/structure/table, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OMinus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/ominus, /obj/machinery/alarm{ dir = 8; pixel_x = 24 @@ -56988,7 +56829,8 @@ /area/exodus/research/xenobiology) "col" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/white, @@ -57048,11 +56890,12 @@ "cor" = ( /obj/machinery/airlock_sensor{ id_tag = "eng_al_c_snsr"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/industrial/warning{ dir = 10 @@ -57169,7 +57012,7 @@ "coE" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/structure/table/reinforced, /turf/simulated/floor/tiled/steel_grid, @@ -57178,7 +57021,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/plating, @@ -57322,13 +57165,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/surgery2) "coW" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "virologyquar"; - name = "Virology Emergency Quarantine Blast Doors"; - opacity = FALSE + name = "virologyquar" }, /obj/structure/cable/green{ icon_state = "1-2" @@ -57339,13 +57179,10 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/medical/virology/access) "coX" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "virologyquar"; - name = "Virology Emergency Quarantine Blast Doors"; - opacity = FALSE + name = "virologyquar" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/techfloor/grid, @@ -57369,13 +57206,10 @@ /turf/simulated/floor/tiled/white, /area/exodus/research/xenobiology) "cpb" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, @@ -57389,13 +57223,10 @@ /turf/simulated/wall/prepainted, /area/exodus/medical/surgery) "cpd" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio3"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio3" }, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/door/window/westright{ @@ -57539,7 +57370,8 @@ /area/exodus/engineering/engineering_monitoring) "cpy" = ( /obj/machinery/vending/wallmed1{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -57600,7 +57432,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -57680,13 +57513,10 @@ "cpV" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Biohazard"; - name = "Biohazard Blast Doors"; - opacity = FALSE + name = "Biohazard" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -57770,7 +57600,8 @@ /area/exodus/engineering) "cqg" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/structure/cable/green{ icon_state = "1-2" @@ -57804,11 +57635,11 @@ /area/exodus/medical/surgeryprep) "cqm" = ( /obj/structure/table, -/obj/item/chems/ivbag/blood/AMinus, -/obj/item/chems/ivbag/blood/APlus, -/obj/item/chems/ivbag/blood/BMinus, -/obj/item/chems/ivbag/blood/BPlus, -/obj/item/chems/ivbag/blood/OPlus, +/obj/item/chems/ivbag/blood/aminus, +/obj/item/chems/ivbag/blood/aplus, +/obj/item/chems/ivbag/blood/bminus, +/obj/item/chems/ivbag/blood/bplus, +/obj/item/chems/ivbag/blood/oplus, /obj/effect/floor_decal/corner/blue{ dir = 6 }, @@ -57860,7 +57691,8 @@ desc = "A remote control-switch for shutters."; id_tag = "virologyquar"; name = "Virology Emergency Lockdown Control"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -57878,7 +57710,8 @@ id_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = -30; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/plating, @@ -57988,21 +57821,27 @@ desc = "A remote control-switch for the engine control room blast doors."; id_tag = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; - pixel_y = -3 + pixel_y = -3; + dir = 1; + directional_offset = null }, /obj/machinery/button/blast_door{ desc = "A remote control-switch for the engine charging port."; id_tag = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; - pixel_y = 7 + pixel_y = 7; + dir = 1; + directional_offset = null }, /obj/machinery/button/toggle{ desc = "A remote control-switch for the engine emitter."; id_tag = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; - pixel_y = 7 + pixel_y = 7; + dir = 1; + directional_offset = null }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -58010,13 +57849,10 @@ /area/exodus/engineering/engine_monitoring) "cqO" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "EngineRadiatorViewport"; - name = "Engine Radiator Viewport Shutter"; - opacity = FALSE + name = "EngineRadiatorViewport" }, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 @@ -58107,7 +57943,8 @@ }, /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /obj/effect/floor_decal/corner/yellow{ dir = 6 @@ -58179,7 +58016,8 @@ /obj/machinery/airlock_sensor{ id_tag = "engineering_dock_sensor"; pixel_x = -25; - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 10 @@ -58336,6 +58174,11 @@ /obj/structure/cable/green{ icon_state = "1-2" }, +/obj/machinery/button/access/exterior{ + id_tag = "engineering_dock_airlock"; + name = "exterior access button"; + pixel_x = 25 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/maintenance/engi_shuttle) "crI" = ( @@ -58604,6 +58447,9 @@ /obj/machinery/camera/network/engine{ c_tag = "Engine Radiator" }, +/obj/structure/sign/warning/docking_area{ + pixel_y = 32 + }, /turf/space, /area/space) "csB" = ( @@ -58611,7 +58457,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/computer/robotics, /turf/simulated/floor/tiled/white, @@ -58671,13 +58517,10 @@ /area/exodus/medical/surgery2) "csI" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "EngineRadiatorViewport"; - name = "Engine Radiator Viewport Shutter"; - opacity = FALSE + name = "EngineRadiatorViewport" }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) @@ -59008,25 +58851,19 @@ /area/exodus/medical/virology) "ctK" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "EngineRadiatorViewport"; - name = "Engine Radiator Viewport Shutter"; - opacity = FALSE + name = "EngineRadiatorViewport" }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) "ctM" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "EngineRadiatorViewport"; - name = "Engine Radiator Viewport Shutter"; - opacity = FALSE + name = "EngineRadiatorViewport" }, /obj/machinery/atmospherics/pipe/simple/visible/black, /turf/simulated/floor/plating, @@ -59066,13 +58903,10 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/virology) "ctS" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio2"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio2" }, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/door/window/westright{ @@ -59437,7 +59271,7 @@ icon_state = "0-2" }, /obj/machinery/generator{ - anchored = TRUE; + anchored = 1; dir = 4 }, /obj/structure/cable/yellow, @@ -59449,7 +59283,8 @@ id_tag = "dorm_airlock"; name = "exterior access button"; pixel_x = -25; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/space, /area/space) @@ -60290,13 +60125,10 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/virology) "cxV" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "xenobio1"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio1" }, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/door/window/westright{ @@ -60404,7 +60236,8 @@ /area/exodus/maintenance/incinerator) "cyG" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -29; + dir = 4 }, /obj/machinery/camera/network/exodus{ c_tag = "Arrivals Southeast"; @@ -60745,7 +60578,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "exodus_rescue_shuttle_dock_sensor"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/simulated/floor/plating, /area/exodus/hallway/secondary/entry/aft) @@ -60939,13 +60773,10 @@ name = "Containment Pen"; req_access = list("ACCESS_XENOBIO") }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio4"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio4" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/reinforced, @@ -61101,7 +60932,9 @@ /turf/simulated/floor/tiled/white, /area/exodus/medical/virology) "cCW" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Virology Cafeteria" + }, /turf/simulated/floor/tiled/white, /area/exodus/medical/virology) "cCX" = ( @@ -61131,7 +60964,8 @@ dir = 1 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 25 + pixel_x = 29; + dir = 8 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/pods) @@ -61141,13 +60975,10 @@ name = "Containment Pen"; req_access = list("ACCESS_XENOBIO") }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio5"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio5" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/reinforced, @@ -61168,9 +60999,7 @@ /turf/simulated/floor/plating, /area/exodus/engineering/drone_fabrication) "cDi" = ( -/obj/machinery/computer/cryopod/robot{ - dir = 2 - }, +/obj/machinery/computer/cryopod/robot, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -61272,12 +61101,6 @@ /turf/simulated/floor/plating, /area/exodus/maintenance/engineering) "cDE" = ( -/obj/machinery/button/access/interior{ - id_tag = "toxin_test_airlock"; - name = "interior access button"; - pixel_x = 20; - pixel_y = 20 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -61774,7 +61597,8 @@ "cGo" = ( /obj/structure/table/reinforced, /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/effect/floor_decal/corner/yellow{ dir = 6 @@ -61790,13 +61614,10 @@ name = "Containment Pen"; req_access = list("ACCESS_XENOBIO") }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "xenobio6"; - name = "Containment Blast Doors"; - opacity = FALSE + name = "xenobio6" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/reinforced, @@ -61986,7 +61807,8 @@ id_tag = "engine_electrical_maintenance"; name = "Door Bolt Control"; pixel_x = 5; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "0-4" @@ -62128,6 +61950,10 @@ dir = 9 }, /obj/effect/floor_decal/industrial/warning, +/obj/structure/sign/warning/radioactive{ + dir = 8; + pixel_x = 32 + }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_waste) "cHY" = ( @@ -62142,7 +61968,7 @@ /area/exodus/engineering/engine_room) "cIa" = ( /obj/machinery/emitter{ - anchored = TRUE; + anchored = 1; id_tag = "EngineEmitter"; state = 2 }, @@ -62308,7 +62134,7 @@ /area/exodus/engineering/engine_room) "cIF" = ( /obj/machinery/atmospherics/binary/circulator{ - anchored = TRUE; + anchored = 1; dir = 1 }, /turf/simulated/floor/plating, @@ -62324,7 +62150,7 @@ /area/exodus/engineering/engine_room) "cIH" = ( /obj/machinery/atmospherics/binary/circulator{ - anchored = TRUE + anchored = 1 }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) @@ -62555,6 +62381,10 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, +/obj/structure/sign/warning/radioactive{ + dir = 8; + pixel_x = 32 + }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_waste) "cJF" = ( @@ -62677,7 +62507,7 @@ /area/exodus/maintenance/engi_engine) "cJZ" = ( /obj/machinery/generator{ - anchored = TRUE; + anchored = 1; dir = 4 }, /obj/structure/cable/yellow, @@ -62723,7 +62553,8 @@ desc = "A remote control-switch for the engine radiator viewport shutters."; id_tag = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutters"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/visible/black{ dir = 4 @@ -62813,14 +62644,12 @@ /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) "cKH" = ( -/obj/machinery/button/access/exterior{ - id_tag = "engineering_dock_airlock"; - name = "exterior access button"; - pixel_x = -25; - pixel_y = -8 +/obj/structure/sign/warning/radioactive{ + dir = 4; + pixel_x = -32 }, -/turf/space, -/area/space) +/turf/simulated/floor/plating, +/area/exodus/engineering/engine_room) "cKI" = ( /mob/living/simple_animal/mouse, /turf/simulated/floor/plating, @@ -63091,6 +62920,10 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, +/obj/structure/sign/warning/radioactive{ + pixel_y = -32; + dir = 1 + }, /turf/simulated/floor/plating, /area/exodus/engineering/engine_room) "cLB" = ( @@ -63138,7 +62971,8 @@ /obj/machinery/button/blast_door{ id_tag = "EngineVent"; name = "Reactor Ventillatory Control"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/structure/window/reinforced, /turf/simulated/floor/plating, @@ -63356,8 +63190,8 @@ /area/ship/exodus_pod_mining) "doN" = ( /obj/abstract/level_data_spawner/main_level{ - name = "Exodus Operations Deck"; -}, + name = "Exodus Operations Deck" + }, /turf/space, /area/space) "drB" = ( @@ -63469,6 +63303,12 @@ }, /turf/simulated/floor/plating, /area/ship/exodus_pod_research) +"elq" = ( +/obj/machinery/hologram/holopad{ + holopad_id = "Security North" + }, +/turf/simulated/floor/tiled/steel_grid, +/area/exodus/security/main) "esY" = ( /obj/effect/paint_stripe/blue, /turf/simulated/wall/titanium, @@ -63836,9 +63676,7 @@ /area/ship/exodus_pod_mining) "igB" = ( /obj/machinery/hologram/holopad, -/obj/abstract/landmark{ - name = "Observer-Start" - }, +/obj/abstract/landmark/latejoin/observer, /turf/simulated/floor/tiled/dark/monotile, /area/shuttle/arrival/station) "ihN" = ( @@ -64554,7 +64392,6 @@ backwards = 8; dir = 9; forwards = 2; - icon_state = "conveyor1"; id_tag = "cargo_mining_conveyor"; movedir = 6 }, @@ -64608,7 +64445,8 @@ /area/exodus/crew_quarters/kitchen) "sGZ" = ( /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 6 @@ -64909,6 +64747,12 @@ }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/hallway/primary/port) +"woj" = ( +/obj/machinery/hologram/holopad{ + holopad_id = "Library Rec Area" + }, +/turf/simulated/floor/wood/walnut, +/area/exodus/library) "wqh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/corner/lime{ @@ -64919,7 +64763,7 @@ "wsi" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/white{ dir = 10 @@ -64950,9 +64794,6 @@ /obj/structure/table, /turf/simulated/floor/tiled/white, /area/exodus/research/robotics) -"wTf" = ( -/turf/simulated/floor/airless, -/area/exodus/turret_protected/ai) "wTp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -64980,7 +64821,8 @@ /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/status_display{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/steel_grid, /area/exodus/quartermaster/miningdock) @@ -65027,6 +64869,12 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/white, /area/exodus/research) +"xTe" = ( +/obj/machinery/hologram/holopad{ + holopad_id = "Sorting Office" + }, +/turf/simulated/floor/tiled/steel_grid, +/area/exodus/quartermaster/office) "xVx" = ( /obj/structure/bed/chair/shuttle/black{ dir = 8 @@ -72634,7 +72482,7 @@ crP cLU cLU cLU -atf +cec aFD cec cLU @@ -73147,7 +72995,7 @@ cLU cec cec cec -awq +atS cec ceI cec @@ -88594,7 +88442,7 @@ bfm bez bga bga -bkC +xTe bga bga bga @@ -91994,11 +91842,11 @@ bZQ cDW cDW cGt -cmc +cGt cmo uGq cmr -cmc +cGt cGt cGt cGt @@ -92255,7 +92103,7 @@ apm cIC cIZ cJs -cHb +cKH cIQ cLI bIM @@ -92516,9 +92364,9 @@ cHb cHb cJo bIM -bIM -cmc -cLU +awq +cGt +clS cLU aaI cLU @@ -93985,7 +93833,7 @@ auR avS avU fPF -wTf +eEn beb bgW aoi @@ -94962,7 +94810,7 @@ acO adm adm adP -aen +elq aev aeX afp @@ -95601,8 +95449,8 @@ cuI cuH cJZ cLA -cmc -cLU +cGt +clS cLU aaI cLU @@ -96359,7 +96207,7 @@ cdW czA aaf cLU -cLU +bun ccp cHB cHB @@ -96616,7 +96464,7 @@ cCz byA byA byA -clS +byA rQB cKX gwY @@ -97644,7 +97492,7 @@ cFC byF aaf cLU -cKH +cLU rQB cpF cLj @@ -98160,11 +98008,11 @@ cea cea cea cea -clW +cea aQh aQh aQh -aIo +apc csA csX csX @@ -98932,7 +98780,7 @@ bNU bzX bzX bNU -cLU +aGX cGQ cHy cHP @@ -103298,8 +103146,8 @@ cqv cqv cqv cqv -cfQ -cLU +cqv +cmc aaf cLU cLU @@ -107405,8 +107253,8 @@ cqv cqv cqv cqv -cfQ -aaf +cqv +atf cCJ aap cLU @@ -108111,7 +107959,7 @@ aJD aJJ aJW aMg -qlX +woj hLX aRK hLX @@ -108688,8 +108536,8 @@ cdO cdO cdO cdO -bXx -cLU +cdO +cmc cLU cLU cqD @@ -109722,8 +109570,8 @@ cdO cdO cdO cdO -bXx -aaf +cdO +atf cCJ cLU cLU @@ -111468,11 +111316,11 @@ bhl biK rkN brU -brU -aGX +aQU +blO bqN bst -bun +bww bwy aMd bCh @@ -112806,8 +112654,8 @@ cdO cdO cdO cdO -bXx -aaf +cdO +atf cCJ cLU aaf @@ -115569,7 +115417,7 @@ cLU cLU cLU cLU -aQU +azP aLW azP aaf @@ -115577,7 +115425,7 @@ cLU aaf azP aNM -aQU +azP aaf cLU cLU @@ -117150,8 +116998,8 @@ aaf cLU aaf cLU -bEo -cLU +ceq +clW aaf cLU cLU diff --git a/maps/exodus/exodus-admin.dmm b/maps/exodus/exodus-admin.dmm index 7e2f4ebc98b..50d1a80ed0b 100644 --- a/maps/exodus/exodus-admin.dmm +++ b/maps/exodus/exodus-admin.dmm @@ -218,7 +218,7 @@ /area/centcom) "ala" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/structure/decoy{ name = "A.L.I.C.E." @@ -340,7 +340,7 @@ }, /obj/structure/showcase{ desc = "A self-contained autopilot that controls supply drones."; - icon_state = "comm_server"; + icon_state = "showcase_5"; name = "Supply Drone Virtual Intelligence" }, /turf/simulated/floor/plating, @@ -782,7 +782,9 @@ /turf/simulated/floor/tiled/dark, /area/shuttle/escape_shuttle) "aHt" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Emergency Shuttle Bridge" + }, /obj/effect/floor_decal/corner/blue{ dir = 10 }, @@ -792,7 +794,7 @@ /obj/machinery/light, /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/corner/blue{ dir = 10 @@ -1169,7 +1171,9 @@ /turf/simulated/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "aLd" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Emergency Shuttle Brig" + }, /turf/simulated/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "aLe" = ( @@ -1241,7 +1245,8 @@ /area/centcom/holding) "aLs" = ( /obj/structure/closet/hydrant{ - pixel_x = 30 + pixel_x = 30; + dir = 8 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -1311,12 +1316,9 @@ /turf/space, /area/shuttle/escape_shuttle) "aLF" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "CentComPort"; - name = "Security Doors"; - opacity = FALSE + name = "Security Doors" }, /turf/unsimulated/floor{ icon_state = "steel" @@ -1468,7 +1470,8 @@ "aMg" = ( /obj/machinery/airlock_sensor{ id_tag = "centcom_escape_dock_north_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/simulated/floor/plating, /area/centcom/holding) @@ -1545,7 +1548,8 @@ /area/centcom/holding) "aMt" = ( /obj/machinery/status_display{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -1951,7 +1955,8 @@ /area/centcom/holding) "aOZ" = ( /obj/machinery/status_display{ - pixel_y = -30 + pixel_y = -30; + dir = 1 }, /obj/machinery/light, /obj/effect/floor_decal/industrial/warning{ @@ -1977,7 +1982,9 @@ }, /area/centcom/holding) "aPJ" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Holding Facility Bar" + }, /turf/unsimulated/floor{ icon_state = "lino" }, @@ -2091,7 +2098,9 @@ }, /area/centcom/holding) "bkb" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Holding Facility Foyer" + }, /turf/unsimulated/floor{ icon_state = "steel" }, @@ -2122,7 +2131,8 @@ /area/shuttle/escape_shuttle) "bpb" = ( /obj/structure/closet/hydrant{ - pixel_x = -30 + pixel_x = -30; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -2378,7 +2388,9 @@ }, /area/tdome) "fpV" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad{ + holopad_id = "Emergency Shuttle Medbay" + }, /turf/simulated/floor/tiled/white, /area/shuttle/escape_shuttle) "fsh" = ( @@ -3012,8 +3024,7 @@ name = "tdome2" }, /obj/machinery/camera/network/television{ - c_tag = "Thunderdome - Red Team"; - invisibility = 101 + c_tag = "Thunderdome - Red Team" }, /turf/unsimulated/floor{ dir = 5; @@ -3050,8 +3061,7 @@ name = "tdome1" }, /obj/machinery/camera/network/television{ - c_tag = "Green Team"; - invisibility = 101 + c_tag = "Green Team" }, /turf/unsimulated/floor{ dir = 5; @@ -3066,8 +3076,7 @@ /area/tdome) "pQZ" = ( /obj/machinery/camera/network/television{ - c_tag = "Thunderdome Arena"; - invisibility = 101 + c_tag = "Thunderdome Arena" }, /turf/unsimulated/floor{ icon_state = "bcircuit" @@ -3149,8 +3158,8 @@ /area/tdome/tdomeadmin) "sKA" = ( /obj/abstract/level_data_spawner/admin_level{ - name = "Centcomm"; -}, + name = "Centcomm" + }, /turf/space, /area/space) "sMD" = ( @@ -3278,7 +3287,6 @@ "wOU" = ( /obj/machinery/button/blast_door{ dir = 1; - icon_state = "computer"; id_tag = "thunderdomeaxe"; name = "Thunderdome Axe Supply" }, diff --git a/maps/exodus/exodus-transit.dmm b/maps/exodus/exodus-transit.dmm index 991bdb2df5c..3561cf64477 100644 --- a/maps/exodus/exodus-transit.dmm +++ b/maps/exodus/exodus-transit.dmm @@ -22,7 +22,7 @@ /obj/effect/step_trigger/teleporter/random{ affect_ghosts = 1; name = "escapeshuttle_leave"; - opacity = FALSE; + opacity = 0; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; @@ -43,8 +43,8 @@ /area/space) "QP" = ( /obj/abstract/level_data_spawner/admin_level{ - name = "Exodus Transit Level"; -}, + name = "Exodus Transit Level" + }, /turf/space, /area/space) diff --git a/maps/exodus/exodus_cameras.dm b/maps/exodus/exodus_cameras.dm index 8164f3995c9..1f5d4b51ee3 100644 --- a/maps/exodus/exodus_cameras.dm +++ b/maps/exodus/exodus_cameras.dm @@ -8,37 +8,37 @@ var/global/const/CAMERA_CHANNEL_ENGINEERING_OUTPOST = "Engineering Outpost" // Networks /obj/machinery/camera/network/command preset_channels = list(CAMERA_CHANNEL_COMMAND) - initial_access = list(access_heads) + req_access = list(access_heads) /obj/machinery/camera/network/crescent preset_channels = list(CAMERA_CHANNEL_CRESCENT) /obj/machinery/camera/network/engine preset_channels = list(CAMERA_CHANNEL_ENGINE) - initial_access = list(access_engine) + req_access = list(access_engine) /obj/machinery/camera/network/engineering_outpost preset_channels = list(CAMERA_CHANNEL_ENGINEERING_OUTPOST) - initial_access = list(access_engine) + req_access = list(access_engine) // Motion /obj/machinery/camera/motion/engineering_outpost preset_channels = list(CAMERA_CHANNEL_ENGINEERING_OUTPOST) - initial_access = list(access_engine) + req_access = list(access_engine) // All Upgrades /obj/machinery/camera/all/command preset_channels = list(CAMERA_CHANNEL_COMMAND) - initial_access = list(access_heads) + req_access = list(access_heads) // Compile stubs. /obj/machinery/camera/motion/command preset_channels = list(CAMERA_CHANNEL_COMMAND) - initial_access = list(access_heads) + req_access = list(access_heads) /obj/machinery/camera/network/maintenance preset_channels = list(CAMERA_CAMERA_CHANNEL_ENGINEERING) - initial_access = list(access_engine) + req_access = list(access_engine) /obj/machinery/camera/xray/security preset_channels = list(CAMERA_CHANNEL_SECURITY) diff --git a/maps/exodus/exodus_jobs.dm b/maps/exodus/exodus_jobs.dm index 7c460652cea..df6c7b54782 100644 --- a/maps/exodus/exodus_jobs.dm +++ b/maps/exodus/exodus_jobs.dm @@ -1,3 +1,11 @@ +/decl/spawnpoint/gateway + name = "Gateway" + spawn_announcement = "has completed translation from offsite gateway" + uid = "spawn_exodus_gateway" + +/obj/abstract/landmark/latejoin/gateway + spawn_decl = /decl/spawnpoint/gateway + /datum/map/exodus default_job_type = /datum/job/assistant default_department_type = /decl/department/civilian diff --git a/maps/exodus/jobs/_goals.dm b/maps/exodus/jobs/_goals.dm index 180d00bfd37..72c324b5c1d 100644 --- a/maps/exodus/jobs/_goals.dm +++ b/maps/exodus/jobs/_goals.dm @@ -37,10 +37,10 @@ var/global/list/exodus_paperwork_end_areas = list() /datum/job/hos ) -/datum/goal/department/paperwork/exodus/get_spawn_turfs() +/datum/goal/department/paperwork/exodus/get_paper_spawn_turfs() return global.exodus_paperwork_spawn_turfs -/datum/goal/department/paperwork/exodus/get_end_areas() +/datum/goal/department/paperwork/exodus/get_paper_end_areas() return global.exodus_paperwork_end_areas /obj/item/paperwork/exodus diff --git a/maps/exodus/jobs/captain.dm b/maps/exodus/jobs/captain.dm index 0a4c570379f..fd73838809b 100644 --- a/maps/exodus/jobs/captain.dm +++ b/maps/exodus/jobs/captain.dm @@ -33,7 +33,7 @@ /datum/computer_file/program/reports ) -/datum/job/captain/equip(var/mob/living/carbon/human/H) +/datum/job/captain/equip_job(var/mob/living/carbon/human/H) . = ..() if(.) H.implant_loyalty(src) diff --git a/maps/exodus/jobs/civilian.dm b/maps/exodus/jobs/civilian.dm index 112096f8b67..6919061c901 100644 --- a/maps/exodus/jobs/civilian.dm +++ b/maps/exodus/jobs/civilian.dm @@ -11,10 +11,9 @@ department_types = list(/decl/department/civilian) /datum/job/assistant/get_access() - if(config.assistant_maint) + if(get_config_value(/decl/config/toggle/assistant_maint)) return list(access_maint_tunnels) - else - return list() + return list() /datum/job/chaplain title = "Chaplain" @@ -304,7 +303,7 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer/equip(var/mob/living/carbon/human/H) +/datum/job/lawyer/equip_job(var/mob/living/carbon/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/medical.dm b/maps/exodus/jobs/medical.dm index 9e66a9ccf27..fac05edfb07 100644 --- a/maps/exodus/jobs/medical.dm +++ b/maps/exodus/jobs/medical.dm @@ -200,7 +200,7 @@ ) give_psionic_implant_on_join = FALSE -/datum/job/counselor/equip(var/mob/living/carbon/human/H) +/datum/job/counselor/equip_job(var/mob/living/carbon/human/H) if(H.mind.role_alt_title == "Counselor") psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) if(H.mind.role_alt_title == "Mentalist") diff --git a/maps/exodus/jobs/security.dm b/maps/exodus/jobs/security.dm index 8fef6d849d2..b021a08e601 100644 --- a/maps/exodus/jobs/security.dm +++ b/maps/exodus/jobs/security.dm @@ -85,7 +85,7 @@ ) event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/hos/equip(var/mob/living/carbon/human/H) +/datum/job/hos/equip_job(var/mob/living/carbon/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/synthetics.dm b/maps/exodus/jobs/synthetics.dm index b93f9704d59..1cac23c65ae 100644 --- a/maps/exodus/jobs/synthetics.dm +++ b/maps/exodus/jobs/synthetics.dm @@ -19,9 +19,8 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip(var/mob/living/carbon/human/H) - if(!H) return 0 - return 1 +/datum/job/computer/equip_job(var/mob/living/carbon/human/H) + return !!H /datum/job/computer/is_position_available() return (empty_playable_ai_cores.len != 0) @@ -71,10 +70,10 @@ if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/robot/equip(var/mob/living/carbon/human/H) +/datum/job/robot/equip_job(var/mob/living/carbon/human/H) return !!H /datum/job/robot/New() ..() alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title // So the unit test doesn't flip out if a mob or mmi type is declared for our main title. + alt_titles -= title // So the unit test doesn't flip out if a mob or brain type is declared for our main title. diff --git a/maps/exodus/outfits/cargo.dm b/maps/exodus/outfits/cargo.dm index 8bfc82c1b2b..ecc6b53da97 100644 --- a/maps/exodus/outfits/cargo.dm +++ b/maps/exodus/outfits/cargo.dm @@ -28,7 +28,7 @@ id_type = /obj/item/card/id/cargo pda_type = /obj/item/modular_computer/pda/science backpack_contents = list(/obj/item/crowbar = 1, /obj/item/storage/ore = 1) - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR /decl/hierarchy/outfit/job/cargo/mining/Initialize() . = ..() diff --git a/maps/exodus/outfits/engineering.dm b/maps/exodus/outfits/engineering.dm index 2aee3512b41..02aefa0b167 100644 --- a/maps/exodus/outfits/engineering.dm +++ b/maps/exodus/outfits/engineering.dm @@ -4,7 +4,7 @@ l_ear = /obj/item/radio/headset/headset_eng shoes = /obj/item/clothing/shoes/workboots pda_slot = slot_l_store_str - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + outfit_flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR /decl/hierarchy/outfit/job/engineering/Initialize() . = ..() diff --git a/maps/ministation/hud.dmi b/maps/ministation/hud.dmi index f5b80db1956..f6925d9b0d0 100644 Binary files a/maps/ministation/hud.dmi and b/maps/ministation/hud.dmi differ diff --git a/maps/ministation/icons/headset_cargo.dmi b/maps/ministation/icons/headset_cargo.dmi deleted file mode 100644 index fd3fceb7cfd..00000000000 Binary files a/maps/ministation/icons/headset_cargo.dmi and /dev/null differ diff --git a/maps/ministation/icons/headset_security.dmi b/maps/ministation/icons/headset_security.dmi deleted file mode 100644 index f03f1372501..00000000000 Binary files a/maps/ministation/icons/headset_security.dmi and /dev/null differ diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index 34acd1033fa..b35ccd1b202 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -6,16 +6,16 @@ economic_power = 1 access = list() minimal_access = list() - alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor") + hud_icon = "hudassistant" + alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") outfit_type = /decl/hierarchy/outfit/job/ministation_assistant department_types = list(/decl/department/civilian) event_categories = list(ASSIGNMENT_GARDENER) /datum/job/ministation/assistant/get_access() - if(config.assistant_maint) + if(get_config_value(/decl/config/toggle/assistant_maint)) return list(access_maint_tunnels) - else - return list() + return list() /decl/hierarchy/outfit/job/ministation_assistant name = "Job - Ministation Assistant" @@ -24,7 +24,7 @@ title = "Bartender" alt_titles = list("Cook","Barista") supervisors = "the Lieutenant and the Captain" - total_positions = 1 + total_positions = 2 spawn_positions = 1 outfit_type = /decl/hierarchy/outfit/job/ministation/bartender department_types = list(/decl/department/service) @@ -49,13 +49,13 @@ SKILL_COOKING = SKILL_MAX, SKILL_BOTANY = SKILL_MAX ) - skill_points = 20 + skill_points = 30 /datum/job/ministation/cargo title = "Cargo Technician" alt_titles = list("Shaft Miner","Drill Technician","Prospector") supervisors = "the Lieutenant and the Captain" - total_positions = 2 + total_positions = 3 spawn_positions = 1 outfit_type = /decl/hierarchy/outfit/job/ministation/cargo department_types = list(/decl/department/service) @@ -68,7 +68,8 @@ access_mailsorting, access_mining, access_mining_station, - access_external_airlocks + access_external_airlocks, + access_eva ) minimal_access = list( access_cargo, @@ -92,7 +93,7 @@ SKILL_EVA = SKILL_MAX, SKILL_FINANCE = SKILL_MAX ) - skill_points = 20 + skill_points = 30 software_on_spawn = list( /datum/computer_file/program/supply, /datum/computer_file/program/deck_management, @@ -103,7 +104,7 @@ title = "Janitor" event_categories = list(ASSIGNMENT_JANITOR) department_types = list(/decl/department/service) - total_positions = 1 + total_positions = 2 spawn_positions = 1 supervisors = "the Lieutenant and the Captain" economic_power = 3 @@ -132,7 +133,7 @@ min_skill = list( SKILL_HAULING = SKILL_BASIC ) - skill_points = 18 + skill_points = 28 /datum/job/ministation/librarian title = "Librarian" diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 809fbfa26f9..d5404a9bb46 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,6 +1,6 @@ /datum/job/ministation/captain title = "Captain" - supervisors = "your profit margin, your conscience, and the Trademaster" + supervisors = "your profit margin, your conscience, and the watchful eye of the Company Rep" outfit_type = /decl/hierarchy/outfit/job/ministation/captain min_skill = list( SKILL_LITERACY = SKILL_ADEPT, @@ -12,12 +12,13 @@ SKILL_PILOT = SKILL_MAX, SKILL_WEAPONS = SKILL_MAX ) - skill_points = 30 + skill_points = 40 head_position = 1 department_types = list(/decl/department/command) total_positions = 1 spawn_positions = 1 selection_color = "#1d1d4f" + hud_icon = "hudcaptain" req_admin_notify = 1 access = list() minimal_access = list() @@ -28,16 +29,16 @@ must_fill = 1 not_random_selectable = 1 -/datum/job/ministation/captain/equip(var/mob/living/carbon/human/H) +/datum/job/ministation/captain/equip_job(var/mob/living/carbon/human/H) . = ..() - if(H) + if(H) H.verbs |= /mob/proc/freetradeunion_rename_company /datum/job/ministation/captain/get_access() return get_all_station_access() /mob/proc/freetradeunion_rename_company() - set name = "Rename Free Trade Union" + set name = "Defect from Corporate Control" set category = "Captain's Powers" var/company = sanitize(input(src, "What should your enterprise be called?", "Company name", global.using_map.company_name), MAX_NAME_LEN) if(!company) @@ -63,6 +64,7 @@ total_positions = 1 spawn_positions = 1 selection_color = "#2f2f7f" + hud_icon = "hudlieutenant" req_admin_notify = 1 minimal_player_age = 14 economic_power = 10 @@ -74,9 +76,11 @@ access_sec_doors, access_brig, access_forensics_lockers, + access_armory, access_heads, access_medical, access_engine, + access_atmospherics, access_change_ids, access_ai_upload, access_eva, @@ -89,6 +93,10 @@ access_morgue, access_crematorium, access_kitchen, + access_mining, + access_xenobiology, + access_robotics, + access_engine_equip, access_cargo, access_cargo_bot, access_mailsorting, @@ -111,9 +119,11 @@ access_sec_doors, access_brig, access_forensics_lockers, + access_armory, access_heads, access_medical, access_engine, + access_atmospherics, access_change_ids, access_ai_upload, access_eva, @@ -123,6 +133,10 @@ access_bar, access_janitor, access_construction, + access_mining, + access_xenobiology, + access_robotics, + access_engine_equip, access_morgue, access_crematorium, access_kitchen, @@ -154,5 +168,4 @@ SKILL_PILOT = SKILL_MAX, SKILL_FINANCE = SKILL_MAX ) - skill_points = 30 - alt_titles = list() + skill_points = 40 diff --git a/maps/ministation/jobs/corporate.dm b/maps/ministation/jobs/corporate.dm new file mode 100644 index 00000000000..885feaeb542 --- /dev/null +++ b/maps/ministation/jobs/corporate.dm @@ -0,0 +1,96 @@ +/datum/job/ministation/corporate/rep + title = "Company Representative" + alt_titles = list("Narc") + hud_icon = "hudnarc" + spawn_positions = 1 + total_positions = 2 + req_admin_notify = 1 + guestbanned = 1 + supervisors = "the Board of Directors" + outfit_type = /decl/hierarchy/outfit/job/ministation/corporate + min_skill = list( + SKILL_WEAPONS = SKILL_BASIC, + SKILL_FINANCE = SKILL_EXPERT, + SKILL_LITERACY = SKILL_ADEPT, + SKILL_PILOT = SKILL_ADEPT, + SKILL_MEDICAL = SKILL_ADEPT + ) + max_skill = list( + SKILL_PILOT = SKILL_MAX, + SKILL_FINANCE = SKILL_MAX, + SKILL_MEDICAL = SKILL_MAX, + SKILL_ANATOMY = SKILL_EXPERT + ) + skill_points = 35 + department_types = list(/decl/department/corporate) + selection_color = "#a89004" + access = list( + access_lawyer, + access_security, + access_sec_doors, + access_brig, + access_heads, + access_medical, + access_engine, + access_atmospherics, + access_ai_upload, + access_eva, + access_bridge, + access_all_personal_lockers, + access_maint_tunnels, + access_bar, + access_janitor, + access_construction, + access_morgue, + access_crematorium, + access_kitchen, + access_cargo, + access_cargo_bot, + access_qm, + access_hydroponics, + access_lawyer, + access_chapel_office, + access_library, + access_research, + access_mining, + access_heads_vault, + access_mining_station, + access_hop, + access_RC_announce, + access_keycard_auth, + access_gateway + ) + + minimal_access = list( + access_lawyer, + access_security, + access_sec_doors, + access_brig, + access_medical, + access_heads, + access_engine, + access_atmospherics, + access_ai_upload, + access_eva, + access_bridge, + access_maint_tunnels, + access_bar, + access_janitor, + access_construction, + access_morgue, + access_crematorium, + access_kitchen, + access_cargo, + access_cargo_bot, + access_hydroponics, + access_chapel_office, + access_library, + access_research, + access_mining, + access_heads_vault, + access_mining_station, + access_hop, + access_RC_announce, + access_keycard_auth, + access_gateway + ) \ No newline at end of file diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index 6f99b0e04e1..eb0bf13f265 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -1,6 +1,6 @@ /datum/job/ministation/engineer title = "Station Engineer" - supervisors = "the Lieutenant and the Captain" + supervisors = "the Head Engineer" total_positions = 2 spawn_positions = 2 outfit_type = /decl/hierarchy/outfit/job/ministation/engineer @@ -45,6 +45,91 @@ SKILL_ATMOS = SKILL_MAX, SKILL_ENGINES = SKILL_MAX ) - skill_points = 20 - alt_titles = list("Atmospheric Technician") + skill_points = 30 + alt_titles = list("Atmospheric Technician", "Electrician", "Maintenance Technician") + event_categories = list(ASSIGNMENT_ENGINEER) + +/datum/job/ministation/engineer/head + title = "Head Engineer" + head_position = 1 + department_types = list( + /decl/department/engineering, + /decl/department/command + ) + total_positions = 1 + spawn_positions = 1 + selection_color = "#7f6e2c" + req_admin_notify = 1 + economic_power = 10 + ideal_character_age = 50 + guestbanned = 1 + must_fill = 1 + not_random_selectable = 1 + hud_icon = "hudchiefengineer" + access = list( + access_engine, + access_engine_equip, + access_tech_storage, + access_maint_tunnels, + access_heads, + access_teleporter, + access_external_airlocks, + access_atmospherics, + access_emergency_storage, + access_eva, + access_bridge, + access_construction, access_sec_doors, + access_ce, + access_RC_announce, + access_keycard_auth, + access_tcomsat, + access_mining, + access_kitchen, + access_robotics, + access_hydroponics, + access_ai_upload + ) + minimal_access = list( + access_engine, + access_engine_equip, + access_tech_storage, + access_maint_tunnels, + access_heads, + access_teleporter, + access_external_airlocks, + access_atmospherics, + access_emergency_storage, + access_eva, + access_bridge, + access_construction, + access_sec_doors, + access_ce, access_RC_announce, + access_keycard_auth, + access_tcomsat, + access_mining, + access_kitchen, + access_robotics, + access_hydroponics, + access_ai_upload + ) + minimal_player_age = 14 + supervisors = "the Captain" + outfit_type = /decl/hierarchy/outfit/job/ministation/engineer/head + min_skill = list( + SKILL_LITERACY = SKILL_ADEPT, + SKILL_COMPUTER = SKILL_ADEPT, + SKILL_EVA = SKILL_ADEPT, + SKILL_CONSTRUCTION = SKILL_ADEPT, + SKILL_ELECTRICAL = SKILL_ADEPT, + SKILL_ATMOS = SKILL_ADEPT, + SKILL_ENGINES = SKILL_EXPERT + ) + max_skill = list( + SKILL_CONSTRUCTION = SKILL_MAX, + SKILL_ELECTRICAL = SKILL_MAX, + SKILL_ATMOS = SKILL_MAX, + SKILL_ENGINES = SKILL_MAX + ) + skill_points = 40 + alt_titles = list("Chief of Engineering") event_categories = list(ASSIGNMENT_ENGINEER) \ No newline at end of file diff --git a/maps/ministation/jobs/medical.dm b/maps/ministation/jobs/medical.dm index d1f1d31fcb5..49d615c041f 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -2,11 +2,11 @@ title = "Medical Doctor" department_types = list(/decl/department/medical) head_position = 0 - supervisors = "the Lieutenant and the Captain" + supervisors = "the Head Doctor" total_positions = 2 spawn_positions = 2 - alt_titles = list("Surgeon","Chemist","Nurse") - skill_points = 24 + alt_titles = list("Chemist", "Nurse", "Surgeon") + skill_points = 34 min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_MEDICAL = SKILL_EXPERT, @@ -38,3 +38,77 @@ outfit_type = /decl/hierarchy/outfit/job/ministation/doctor minimal_player_age = 3 event_categories = list(ASSIGNMENT_MEDICAL) + +/datum/job/ministation/doctor/head + title = "Head Doctor" + head_position = 1 + department_types = list( + /decl/department/medical, + /decl/department/command + ) + supervisors = "the Captain and your own ethics" + outfit_type = /decl/hierarchy/outfit/job/ministation/doctor/head + alt_titles = list("Chief Medical Officer", "Head Surgeon") + total_positions = 1 + spawn_positions = 1 + skill_points = 38 + guestbanned = 1 + must_fill = 1 + not_random_selectable = 1 + selection_color = "#026865" + req_admin_notify = 1 + economic_power = 10 + hud_icon = "hudheaddoctor" + access = list( + access_medical, + access_medical_equip, + access_morgue, + access_bridge, + access_heads, + access_engine_equip, + access_eva, + access_chemistry, + access_virology, + access_cmo, + access_surgery, + access_RC_announce, + access_keycard_auth, + access_sec_doors, + access_psychiatrist, + access_eva, + access_mining, + access_kitchen, + access_xenobiology, + access_robotics, + access_hydroponics, + access_maint_tunnels, + access_external_airlocks + ) + minimal_access = list( + access_medical, + access_medical_equip, + access_morgue, + access_bridge, + access_heads, + access_engine_equip, + access_eva, + access_chemistry, + access_virology, + access_cmo, + access_surgery, + access_RC_announce, + access_keycard_auth, + access_sec_doors, + access_psychiatrist, + access_eva, + access_mining, + access_kitchen, + access_xenobiology, + access_robotics, + access_hydroponics, + access_maint_tunnels, + access_external_airlocks + ) + minimal_player_age = 14 + ideal_character_age = 50 + event_categories = list(ASSIGNMENT_MEDICAL) \ No newline at end of file diff --git a/maps/ministation/jobs/science.dm b/maps/ministation/jobs/science.dm index e0c020a2309..cce6f36589e 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -1,11 +1,12 @@ /datum/job/ministation/scientist - title = "Scientist" - alt_titles = list("Researcher","Xenobiologist","Roboticist","Xenobotanist") - supervisors = "the Lieutenant and the Captain" + title = "Researcher" + alt_titles = list("Scientist","Xenobiologist","Roboticist","Xenobotanist") + supervisors = "the Head Researcher" spawn_positions = 1 total_positions = 2 department_types = list(/decl/department/science) outfit_type = /decl/hierarchy/outfit/job/ministation/scientist + hud_icon = "hudscientist" min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_COMPUTER = SKILL_BASIC, @@ -17,7 +18,7 @@ SKILL_DEVICES = SKILL_MAX, SKILL_SCIENCE = SKILL_MAX ) - skill_points = 24 + skill_points = 34 access = list( access_robotics, access_tox, @@ -37,3 +38,94 @@ selection_color = "#633d63" economic_power = 7 event_categories = list(ASSIGNMENT_SCIENTIST) + +/datum/job/ministation/scientist/head + title = "Research Director" + supervisors = "the Captain" + spawn_positions = 1 + total_positions = 1 + alt_titles = list("Head Researcher", "Chief Researcher") + outfit_type = /decl/hierarchy/outfit/job/ministation/scientist/head + min_skill = list( + SKILL_LITERACY = SKILL_ADEPT, + SKILL_COMPUTER = SKILL_BASIC, + SKILL_FINANCE = SKILL_ADEPT, + SKILL_BOTANY = SKILL_BASIC, + SKILL_ANATOMY = SKILL_BASIC, + SKILL_DEVICES = SKILL_BASIC, + SKILL_SCIENCE = SKILL_ADEPT + ) + max_skill = list( + SKILL_ANATOMY = SKILL_MAX, + SKILL_DEVICES = SKILL_MAX, + SKILL_SCIENCE = SKILL_MAX + ) + skill_points = 40 + head_position = 1 + department_types = list( + /decl/department/science, + /decl/department/command + ) + selection_color = "#ad6bad" + req_admin_notify = 1 + economic_power = 15 + hud_icon = "hudheadscientist" + access = list( + access_rd, + access_bridge, + access_tox, + access_morgue, + access_tox_storage, + access_teleporter, + access_sec_doors, + access_heads, + access_eva, + access_research, + access_robotics, + access_xenobiology, + access_ai_upload, + access_tech_storage, + access_RC_announce, + access_keycard_auth, + access_tcomsat, + access_gateway, + access_xenoarch, + access_engine_equip, + access_mining, + access_kitchen, + access_hydroponics, + access_network + ) + minimal_access = list( + access_rd, + access_bridge, + access_tox, + access_morgue, + access_tox_storage, + access_teleporter, + access_sec_doors, + access_heads, + access_eva, + access_research, + access_robotics, + access_xenobiology, + access_ai_upload, + access_tech_storage, + access_RC_announce, + access_keycard_auth, + access_tcomsat, + access_gateway, + access_xenoarch, + access_engine_equip, + access_mining, + access_kitchen, + access_hydroponics, + access_network + ) + minimal_player_age = 14 + ideal_character_age = 50 + guestbanned = 1 + must_fill = 1 + not_random_selectable = 1 + event_categories = list(ASSIGNMENT_SCIENTIST) + diff --git a/maps/ministation/jobs/security.dm b/maps/ministation/jobs/security.dm index ad6e2324b57..b1e691ccb99 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -1,21 +1,25 @@ /datum/job/ministation/security title = "Security Officer" alt_titles = list("Warden") - supervisors = "the Lieutenant and the Captain" + supervisors = "the Head of Security" spawn_positions = 1 total_positions = 2 outfit_type = /decl/hierarchy/outfit/job/ministation/security department_types = list(/decl/department/security) - selection_color = "#990000" + selection_color = COLOR_BLOOD_RED economic_power = 7 minimal_player_age = 7 access = list( access_security, - access_brig + access_brig, + access_lawyer, + access_maint_tunnels ) minimal_access = list( access_security, access_forensics_lockers, + access_maint_tunnels, + access_lawyer, access_brig ) min_skill = list( @@ -28,13 +32,13 @@ SKILL_COMBAT = SKILL_MAX, SKILL_WEAPONS = SKILL_MAX ) - skill_points = 20 + skill_points = 30 event_categories = list(ASSIGNMENT_SECURITY) /datum/job/ministation/detective title = "Detective" alt_titles = list("Inspector") - supervisors = "Justice... and the Trademaster" + supervisors = "Justice... and the Captain" spawn_positions = 1 total_positions = 1 outfit_type = /decl/hierarchy/outfit/job/ministation/detective @@ -43,11 +47,18 @@ economic_power = 7 minimal_player_age = 3 access = list( - access_forensics_lockers + access_forensics_lockers, + access_brig, + access_security, + access_lawyer, + access_maint_tunnels ) minimal_access = list( access_security, - access_forensics_lockers + access_brig, + access_lawyer, + access_forensics_lockers, + access_maint_tunnels ) min_skill = list( SKILL_LITERACY = SKILL_BASIC, @@ -61,4 +72,70 @@ SKILL_WEAPONS = SKILL_MAX, SKILL_FORENSICS = SKILL_MAX ) - skill_points = 24 \ No newline at end of file + skill_points = 34 + +/datum/job/ministation/security/head + title = "Head of Security" + supervisors = "the Captain" + outfit_type = /decl/hierarchy/outfit/job/ministation/security/head + head_position = 1 + department_types = list( + /decl/department/security, + /decl/department/command + ) + total_positions = 1 + spawn_positions = 1 + selection_color = "#9d2300" + req_admin_notify = 1 + minimal_player_age = 14 + economic_power = 10 + ideal_character_age = 50 + guestbanned = 1 + not_random_selectable = 1 + hud_icon = "hudhos" + access = list( + access_security, + access_sec_doors, + access_brig, + access_eva, + access_forensics_lockers, + access_heads, + access_lawyer, + access_maint_tunnels, + access_armory, + access_engine_equip, + access_mining, + access_kitchen, + access_robotics, + access_hydroponics, + access_hos + ) + minimal_access = list( + access_security, + access_sec_doors, + access_brig, + access_lawyer, + access_eva, + access_forensics_lockers, + access_heads, + access_maint_tunnels, + access_armory, + access_engine_equip, + access_mining, + access_kitchen, + access_robotics, + access_hydroponics, + access_hos + ) + min_skill = list( + SKILL_LITERACY = SKILL_BASIC, + SKILL_COMPUTER = SKILL_BASIC, + SKILL_COMBAT = SKILL_ADEPT, + SKILL_WEAPONS = SKILL_ADEPT + ) + max_skill = list( + SKILL_COMBAT = SKILL_MAX, + SKILL_WEAPONS = SKILL_MAX + ) + skill_points = 40 + alt_titles = list("Security Commander") diff --git a/maps/ministation/jobs/synthetics.dm b/maps/ministation/jobs/synthetics.dm index 61f5ae877b8..b0f2345b1af 100644 --- a/maps/ministation/jobs/synthetics.dm +++ b/maps/ministation/jobs/synthetics.dm @@ -13,7 +13,7 @@ hud_icon = "hudblank" skill_points = 0 no_skill_buffs = TRUE - guestbanned = 1 + guestbanned = 1 not_random_selectable = 1 skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) @@ -22,10 +22,58 @@ if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/ministation/robot/equip(var/mob/living/carbon/human/H) +/datum/job/ministation/robot/equip_job(var/mob/living/carbon/human/H) return !!H /datum/job/ministation/robot/New() ..() alt_titles = SSrobots.robot_alt_titles.Copy() alt_titles -= title + +/datum/job/ministation/computer + title = "Computer" + event_categories = list(ASSIGNMENT_COMPUTER) + total_positions = 0 + spawn_positions = 1 + selection_color = "#3f823f" + supervisors = "your laws" + req_admin_notify = 1 + minimal_player_age = 14 + account_allowed = 0 + economic_power = 0 + outfit_type = /decl/hierarchy/outfit/job/silicon/ai + loadout_allowed = FALSE + hud_icon = "hudblank" + skill_points = 0 + no_skill_buffs = TRUE + guestbanned = 1 + not_random_selectable = 1 + skip_loadout_preview = TRUE + department_types = list(/decl/department/miscellaneous) + +/datum/job/ministation/computer/equip_job(var/mob/living/carbon/human/H) + return !!H + +/datum/job/ministation/computer/is_position_available() + return (empty_playable_ai_cores.len != 0) + +/datum/job/ministation/computer/handle_variant_join(var/mob/living/carbon/human/H, var/alt_title) + return H + +/datum/job/ministation/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) + character = character.AIize(move=0) // AIize the character, but don't move them yet + + // is_available for AI checks that there is an empty core available in this list + var/obj/structure/aicore/deactivated/C = empty_playable_ai_cores[1] + empty_playable_ai_cores -= C + + character.forceMove(C.loc) + var/mob/living/silicon/ai/A = character + A.on_mob_init() + + if(latejoin) + new_player_mob.AnnounceCyborg(character, title, "has been downloaded to the empty core in \the [get_area_name(src)]") + SSticker.mode.handle_latejoin(character) + + qdel(C) + return TRUE diff --git a/maps/ministation/ministation.dmm b/maps/ministation/ministation-0.dmm similarity index 65% rename from maps/ministation/ministation.dmm rename to maps/ministation/ministation-0.dmm index fdcd879ca6a..2819387365e 100644 --- a/maps/ministation/ministation.dmm +++ b/maps/ministation/ministation-0.dmm @@ -16,436 +16,170 @@ /turf/space, /area/space) "ae" = ( -/turf/simulated/wall, -/area/ministation/science) -"af" = ( -/turf/exterior/wall/random/ministation, -/area/space) -"ag" = ( -/obj/structure/mirror{ - pixel_y = 30 - }, -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"ah" = ( -/turf/simulated/wall, -/area/ministation/bridge) -"ai" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "bridgeblast"; - name = "bridge blast door" - }, -/turf/simulated/floor/plating, -/area/ministation/bridge) -"aj" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/camera/network/engineering{ + name = "SM Airlock" }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "bridgeblast"; - name = "bridge blast door" +/obj/machinery/light{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/bridge) +/turf/simulated/floor/tiled, +/area/ministation/engine) +"af" = ( +/turf/exterior/wall/random/ministation, +/area/space) "ak" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "bridgeblast"; - name = "bridge blast door" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/ministation/bridge) -"al" = ( /obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "bridgeblast"; - name = "bridge blast door" + icon_state = "1-8" }, /turf/simulated/floor/plating, -/area/ministation/bridge) +/area/ministation/maint/eastatmos) "am" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/assembly/timer, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler, -/obj/item/multitool, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"an" = ( -/obj/structure/closet/secure_closet/medical3, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"ao" = ( -/obj/structure/table/reinforced, -/obj/machinery/faxmachine, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ap" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"aq" = ( +/obj/effect/wallframe_spawn/reinforced, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"ar" = ( +/area/ministation/engine) +"aq" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/westleft, /obj/structure/disposalpipe/trunk{ - dir = 4 + dir = 2 + }, +/obj/machinery/door/blast/shutters{ + id_tag = "cargoshut"; + name = "cargo shutters" }, -/obj/structure/disposaloutlet, -/turf/simulated/floor, -/area/ministation/science) -"as" = ( -/obj/machinery/computer/modular/preset/security, -/obj/effect/floor_decal/corner/red/full, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"at" = ( -/obj/machinery/computer/station_alert/all, -/obj/effect/floor_decal/corner/yellow/full, +/area/ministation/cargo) +"as" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/flora/pottedplant/smalltree, /turf/simulated/floor/tiled, -/area/ministation/bridge) +/area/ministation/hall/n) "au" = ( /turf/simulated/wall, /area/ministation/cargo) "av" = ( /turf/simulated/wall/r_wall, /area/ministation/engine) -"aw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/simulated/floor, -/area/ministation/science) "ax" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/computer/modular/preset/cardslot/command, -/obj/effect/floor_decal/corner/blue/full, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ay" = ( -/obj/effect/floor_decal/corner/white/full, -/obj/machinery/computer/modular/preset/medical, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"az" = ( -/obj/effect/floor_decal/corner/yellow/full, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast2"; - name = "enclosure 2 blast door" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/turf/simulated/floor, -/area/ministation/science) -"aB" = ( -/obj/structure/table/reinforced, -/obj/item/folder/envelope/nuke_instructions, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aC" = ( -/obj/structure/table/reinforced, -/obj/item/radio, -/obj/item/radio/beacon, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aD" = ( -/turf/simulated/wall/r_wall, -/area/ministation/bridge) +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) "aE" = ( -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/obj/machinery/door/blast/regular/open{ - id_tag = "bridgeblast"; - name = "bridge blast door" - }, -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/airless, -/area/ministation/bridge) -"aF" = ( -/obj/structure/glass_tank/aquarium, -/mob/living/simple_animal/aquatic/fish, -/mob/living/simple_animal/aquatic/fish, -/mob/living/simple_animal/aquatic/fish, -/mob/living/simple_animal/aquatic/fish, -/mob/living/simple_animal/aquatic/fish, -/mob/living/simple_animal/aquatic/fish/grump, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aG" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 +/obj/machinery/alarm{ + pixel_y = 23 }, -/area/ministation/telecomms) -"aH" = ( -/obj/machinery/door/airlock/hatch/maintenance, /turf/simulated/floor/plating, -/area/ministation/engine) -"aI" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aJ" = ( -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aK" = ( -/obj/effect/floor_decal/corner/red{ - dir = 5 +/area/ministation/maint/westatmos) +"aG" = ( +/obj/structure/table, +/obj/effect/floor_decal/industrial/warning{ + dir = 9 }, +/obj/item/blueprints, +/obj/item/cell, /turf/simulated/floor/tiled, -/area/ministation/bridge) +/area/ministation/eva) "aL" = ( -/obj/structure/bed/chair/comfy/blue, -/obj/effect/floor_decal/corner/yellow{ - dir = 5 +/obj/machinery/power/apc{ + name = "_South APC"; + pixel_y = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aM" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/blue{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aN" = ( -/obj/structure/bed/chair/comfy/blue, -/obj/effect/floor_decal/corner/paleblue{ - dir = 5 - }, -/obj/effect/floor_decal/corner/white{ - dir = 5 + icon_state = "0-8" }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aO" = ( -/obj/effect/floor_decal/corner/yellow{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aP" = ( -/obj/structure/table/reinforced, -/obj/item/storage/firstaid/regular, -/obj/item/storage/toolbox/emergency, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aQ" = ( -/obj/structure/displaycase, -/obj/item/sword/replica/officersword, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"aR" = ( -/obj/structure/bed, -/obj/item/bedsheet/captain, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/obj/structure/curtain/open/bed, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) +/turf/simulated/floor/plating, +/area/ministation/dorms) "aS" = ( /turf/simulated/wall, /area/ministation/ai_sat) -"aT" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"aU" = ( -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/window/reinforced, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/machinery/button/blast_door{ - id_tag = "slimeblast3"; - name = "Enclosure 3 Blastdoors Button" - }, -/obj/machinery/camera/network/research, -/turf/simulated/floor/tiled, -/area/ministation/science) "aV" = ( /turf/simulated/floor/tiled, -/area/ministation/hall/s) +/area/ministation/hall/s1) "aW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/alternate/door/bolts{ - id_tag = "vaultbolt"; - name = "Vault Deadbolt Button"; - pixel_y = 27 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/obj/machinery/light{ + dir = 1 }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"aX" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/obj/machinery/door/airlock/command{ - autoset_access = 0; +/obj/structure/closet/secure_closet{ + closet_appearance = /decl/closet_appearance/secure_closet/command; + name = "captain's locker"; req_access = list("ACCESS_CAPTAIN") }, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/carpet, -/area/ministation/bridge) -"aY" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ba" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/camera/network/command{ + initial_access = null }, /turf/simulated/floor/tiled, -/area/ministation/bridge) +/area/ministation/eva) +"aZ" = ( +/obj/structure/fitness/punchingbag, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "bb" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) +/obj/machinery/fabricator/pipe/disposal, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) "bc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/portable_atmospherics/powered/scrubber, +/obj/machinery/atmospherics/portables_connector{ + dir = 1 }, -/obj/item/radio/intercom, -/turf/simulated/floor/tiled, -/area/ministation/bridge) +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) "bd" = ( /obj/machinery/light{ dir = 1 }, /obj/item/inflatable_dispenser, /obj/structure/table, -/turf/simulated/floor/tiled, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) -"be" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bf" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bg" = ( -/turf/simulated/wall/r_wall, -/area/ministation/bridge/vault) -"bh" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) "bi" = ( -/obj/structure/filing_cabinet, -/obj/machinery/light_switch{ - pixel_y = 28 +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 10 }, -/obj/effect/floor_decal/industrial/warning{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) +/obj/abstract/landmark/start{ + name = "Assistant" + }, +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) "bj" = ( -/turf/simulated/wall, -/area/ministation/cafe) +/obj/structure/table/reinforced, +/obj/item/rcd, +/obj/item/rcd_ammo/large, +/turf/simulated/floor/carpet/orange, +/area/ministation/engine) "bk" = ( /obj/effect/floor_decal/corner/yellow{ dir = 5 @@ -453,397 +187,181 @@ /turf/simulated/floor/tiled, /area/ministation/engine) "bl" = ( -/turf/simulated/wall/r_wall, -/area/ministation/telecomms) +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "westatmos_vent" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) "bm" = ( /obj/structure/closet/radiation, +/obj/machinery/camera/network/engineering, /turf/simulated/floor/tiled, /area/ministation/engine) -"bn" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Vault APC"; - pixel_y = 25 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/simulated/floor/bluegrid, -/area/ministation/bridge/vault) -"bo" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) "bp" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/bluegrid, -/area/ministation/bridge/vault) -"bq" = ( -/turf/simulated/floor/bluegrid, -/area/ministation/bridge/vault) -"br" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"bs" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 +/obj/effect/floor_decal/corner/red{ + dir = 6 }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) +/obj/machinery/atmospherics/pipe/simple/visible/red, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) "bt" = ( -/obj/item/flashlight/lamp/green, -/obj/structure/table/woodentable/mahogany, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"bv" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, +/obj/structure/grille, +/obj/structure/wall_frame, +/turf/simulated/floor/plating, +/area/ministation/trash) +"bB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bw" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bx" = ( -/obj/structure/table/reinforced, -/obj/item/storage/secure/briefcase, -/obj/item/flash, -/obj/item/flash, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"by" = ( -/obj/structure/closet, -/obj/item/stack/material/ingot/mapped/gold, -/obj/item/stack/material/ingot/mapped/gold, -/obj/item/stack/material/ingot/mapped/gold, -/obj/item/storage/belt/champion, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) -"bz" = ( -/obj/abstract/landmark/start{ - name = "Captain" - }, +/area/ministation/engine) +"bC" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, +/obj/machinery/door/airlock/glass/command, +/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "2-4" }, -/obj/structure/bed/chair/comfy/captain, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bA" = ( -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/blast_door{ - id_tag = "bridgeblast" - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "4-8" - }, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"bC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/floor_decal/industrial/warning{ +/area/ministation/eva) +"bE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bD" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/vault/bolted{ - autoset_access = 0; - id_tag = "vaultbolt"; - req_access = list("ACCESS_VAULT") +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"bN" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) -"bE" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/unary/outlet_injector{ + dir = 8; + icon_state = "map_injector"; + id_tag = "n2_in"; + use_power = 1 }, -/obj/effect/floor_decal/industrial/warning{ +/turf/simulated/floor/reinforced/oxygen, +/area/ministation/atmospherics) +"bO" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) -"bF" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume{ + dir = 4; + external_pressure_bound = 0; + external_pressure_bound_default = 0; + icon_state = "map_vent_in"; + id_tag = "air_out"; + internal_pressure_bound = 2000; + internal_pressure_bound_default = 2000; + pressure_checks = 2; + pressure_checks_default = 2; + pump_direction = 0; + use_power = 1 + }, +/turf/simulated/floor/reinforced/oxygen, +/area/ministation/atmospherics) +"bP" = ( /obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/bluegrid, -/area/ministation/bridge/vault) -"bG" = ( -/obj/structure/closet/secure_closet/captains, -/obj/item/clothing/suit/storage/leather_jacket/nanotrasen, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"bH" = ( -/obj/machinery/camera{ - c_tag = "Captain's Quarters"; - dir = 1 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 + icon_state = "0-8" }, -/obj/structure/bed/chair/comfy/captain{ +/obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"bI" = ( -/obj/structure/table/woodentable/mahogany, -/obj/item/modular_computer/tablet/lease/preset/command, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/carpet/blue, -/area/ministation/bridge) -"bK" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -23 +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"bV" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/obj/machinery/keycard_auth{ - pixel_y = -24 +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/item/chems/spray/extinguisher, +/obj/effect/floor_decal/industrial/warning{ + dir = 10 }, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"bM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, +/area/ministation/eva) +"bW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"bN" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/eva) +"cb" = ( +/obj/item/stack/material/ore/iron{ + pixel_x = -1; + pixel_y = -4 }, -/obj/abstract/landmark{ - name = "bluespace_a" +/obj/item/stack/material/ore/iron{ + pixel_x = 2; + pixel_y = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/item/stack/material/ore/iron, +/turf/simulated/floor/airless, +/area/space) +"cc" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/material_processing/unloader{ + input_turf = 4; + output_turf = 1 }, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"bP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/area/ministation/cargo) +"cd" = ( +/obj/item/stack/material/rods/fifty, +/turf/simulated/floor/airless, +/area/space) +"ce" = ( +/obj/item/storage/ore, +/turf/simulated/floor/airless, +/area/space) +"cf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"bQ" = ( -/obj/machinery/keycard_auth{ - pixel_y = -24 +/area/ministation/cargo) +"cg" = ( +/obj/structure/bed/chair/comfy, +/turf/simulated/floor/carpet/blue2, +/area/ministation/hall/s1) +"cj" = ( +/obj/machinery/generator{ + anchored = 1 }, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bR" = ( -/obj/machinery/nuclearbomb/station{ - pixel_y = 2 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"ck" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/effect/floor_decal/industrial/outline/yellow, -/turf/simulated/floor/tiled/dark/monotile, -/area/ministation/bridge/vault) -"bS" = ( -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) -"bT" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) -"bU" = ( -/obj/structure/fireaxecabinet{ - pixel_y = -32 - }, -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bV" = ( -/obj/machinery/camera/autoname{ - dir = 1 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/effect/floor_decal/corner/blue{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bW" = ( -/obj/effect/floor_decal/corner/blue{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/sign/department/bridge{ - dir = 4; - pixel_x = -32 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"bX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/blue{ - dir = 10 - }, -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/blue{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"bZ" = ( -/obj/machinery/network/requests_console{ - announcementConsole = 1; - department = "Bridge"; - name = "Bridge RC"; - pixel_y = -30 - }, -/obj/effect/floor_decal/corner/blue{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ca" = ( -/obj/machinery/newscaster{ - pixel_y = -28 - }, -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"cb" = ( -/obj/item/stack/material/ore/iron{ - pixel_x = -1; - pixel_y = -4 - }, -/obj/item/stack/material/ore/iron{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/stack/material/ore/iron, -/turf/simulated/floor/airless, -/area/space) -"cc" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/material_processing/unloader{ - input_turf = 4; - output_turf = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"cd" = ( -/obj/item/stack/material/rods/fifty, -/turf/simulated/floor/airless, -/area/space) -"ce" = ( -/obj/item/storage/ore, -/turf/simulated/floor/airless, -/area/space) -"cf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"cg" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"ch" = ( -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ci" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock/glass/command, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ck" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/airless, -/area/space) -"cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/floor_decal/industrial/loading{ - dir = 8 +/turf/simulated/floor/airless, +/area/space) +"cl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/industrial/loading{ + dir = 8 }, /turf/simulated/floor/tiled, /area/ministation/cargo) @@ -854,9 +372,6 @@ "cn" = ( /turf/simulated/floor/airless, /area/space) -"co" = ( -/turf/simulated/wall, -/area/ministation/maint/nw) "cp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -868,57 +383,42 @@ /turf/simulated/floor/tiled, /area/ministation/engine) "cr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/turf/simulated/wall/r_wall, +/area/ministation/eva) +"cu" = ( +/obj/machinery/computer/air_control/supermatter_core, +/obj/machinery/light{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"cs" = ( +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"cv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/engine) +"cw" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 + icon_state = "2-8" }, -/obj/effect/floor_decal/corner/blue{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"ct" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/blue{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"cu" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" }, /turf/simulated/floor/plating, -/area/ministation/bridge) -"cv" = ( -/obj/structure/closet, -/obj/random/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"cw" = ( -/turf/simulated/wall, -/area/ministation/maint/ne) +/area/ministation/maint/l1central) "cx" = ( /obj/machinery/conveyor{ id_tag = "mining_internal" }, -/obj/structure/plasticflaps/airtight, /turf/simulated/floor/tiled, /area/ministation/cargo) "cy" = ( @@ -926,10 +426,13 @@ /turf/simulated/floor/plating, /area/ministation/cargo) "cz" = ( +/obj/effect/floor_decal/industrial/loading{ + dir = 4 + }, /obj/machinery/status_display{ - pixel_y = 2 + pixel_y = 32 }, -/turf/simulated/wall, +/turf/simulated/floor/tiled, /area/ministation/cargo) "cA" = ( /obj/machinery/door/airlock/external/glass{ @@ -940,81 +443,60 @@ id_tag = "mining_airlock_interior" }, /obj/machinery/button/access/interior{ - id_tag = "cargo_airlock"; + id_tag = "mining_airlock"; name = "interior access button"; pixel_x = 20; - pixel_y = -10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plating, /area/ministation/cargo) -"cB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/random/trash, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"cC" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/nw) "cD" = ( -/obj/machinery/light/small{ +/turf/simulated/floor, +/area/ministation/hall/s1) +"cG" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/window/reinforced{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"cE" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume{ + dir = 4; + external_pressure_bound = 0; + external_pressure_bound_default = 0; + icon_state = "map_vent_in"; + id_tag = "air_out"; + internal_pressure_bound = 2000; + internal_pressure_bound_default = 2000; + pressure_checks = 2; + pressure_checks_default = 2; + pump_direction = 0; + use_power = 1 + }, +/turf/simulated/floor/reinforced/nitrogen, +/area/ministation/atmospherics) +"cH" = ( +/obj/structure/ladder, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/floor_decal/corner/blue{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"cF" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/floor_decal/corner/blue{ - dir = 10 + icon_state = "16-0" }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"cG" = ( -/obj/machinery/door/airlock/hatch/maintenance, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"cH" = ( -/obj/machinery/light/small, -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"cJ" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/ne) +/turf/simulated/floor, +/area/ministation/maint/eastatmos) "cK" = ( /obj/machinery/atmospherics/portables_connector, /obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/plating, /area/ministation/ai_sat) "cL" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/science) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "cM" = ( /obj/machinery/conveyor{ dir = 4; @@ -1040,6 +522,7 @@ dir = 4; id_tag = "mining_internal" }, +/obj/machinery/camera/network/mining, /turf/simulated/floor/tiled, /area/ministation/cargo) "cQ" = ( @@ -1062,215 +545,97 @@ }, /turf/simulated/floor/plating, /area/ministation/cargo) -"cU" = ( -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/high_voltage, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"cV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"cW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) "cX" = ( -/obj/structure/rack, -/obj/random/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"cY" = ( -/turf/simulated/wall/r_wall, -/area/ministation/security) -"cZ" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/security) -"da" = ( -/turf/simulated/wall, -/area/ministation/security) -"db" = ( -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"dc" = ( -/obj/structure/cable{ - icon_state = "0-2" +/obj/machinery/meter, +/obj/effect/floor_decal/corner/red{ + dir = 9 }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 4 }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast3"; - name = "enclosure 3 blast door" +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"dc" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 9 }, -/turf/simulated/floor, -/area/ministation/science) -"dd" = ( -/turf/simulated/floor, -/area/ministation/science) +/turf/simulated/floor/plating, +/area/ministation/supermatter) "de" = ( /obj/machinery/conveyor{ dir = 1; id_tag = "mining_internal" }, -/obj/structure/plasticflaps/airtight, /turf/simulated/floor/tiled, /area/ministation/cargo) -"dg" = ( -/obj/structure/closet, -/obj/random/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"dh" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 +"df" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/simulated/floor/plating, -/area/ministation/maint/nw) +/area/ministation/supermatter) "di" = ( /turf/simulated/wall, /area/ministation/hall/n) -"dj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"dk" = ( -/obj/item/trash/cigbutt, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"dm" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, +"dl" = ( +/obj/machinery/power/solar, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-4" }, /turf/simulated/floor/plating, -/area/ministation/maint/sec) -"dn" = ( -/obj/structure/table/woodentable_reinforced/walnut, -/obj/item/paper_bin, -/obj/item/pen/retractable, -/turf/simulated/floor/carpet/red, -/area/ministation/court) +/area/space) "do" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"dp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/conveyor{ + dir = 4; + id_tag = "trash_sort" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/sign/warning/deathsposal{ + pixel_x = -34; dir = 4 }, -/obj/machinery/door/airlock/glass, /turf/simulated/floor/plating, -/area/ministation/hall/s) +/area/ministation/trash) "dq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/obj/effect/floor_decal/corner/beige{ + dir = 5 }, /turf/simulated/floor/tiled, -/area/ministation/court) -"dr" = ( -/turf/simulated/floor/tiled, -/area/ministation/security) -"dt" = ( -/obj/machinery/light/small{ - dir = 8 +/area/ministation/cargo) +"ds" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 5 }, -/turf/simulated/floor, -/area/ministation/science) +/turf/space, +/area/space) "du" = ( -/mob/living/slime, -/turf/simulated/floor, -/area/ministation/science) -"dv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window/westleft, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast2"; - name = "enclosure 2 blast door" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/turf/simulated/floor, -/area/ministation/science) +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "dw" = ( -/obj/machinery/door/window/eastleft, -/obj/effect/floor_decal/industrial/warning{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"dx" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"dy" = ( -/obj/machinery/door/window/westleft, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 + icon_state = "1-4" }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"dz" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, -/obj/machinery/door/window/eastleft, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast3"; - name = "enclosure 3 blast door" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/turf/simulated/floor, -/area/ministation/science) -"dA" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" }, -/turf/simulated/floor, -/area/ministation/science) +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"dx" = ( +/obj/item/ball, +/turf/simulated/floor/pool, +/area/ministation/dorms) "dB" = ( /obj/machinery/conveyor{ dir = 1; @@ -1295,11 +660,12 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "dD" = ( -/obj/effect/floor_decal/corner/beige{ - dir = 5 +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) +/turf/simulated/floor/plating, +/area/ministation/supermatter) "dE" = ( /obj/effect/floor_decal/corner/beige{ dir = 5 @@ -1308,12 +674,23 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "dF" = ( -/obj/effect/floor_decal/corner/beige{ - dir = 5 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/camera/network/mining, -/turf/simulated/floor/tiled, -/area/ministation/cargo) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) "dG" = ( /obj/machinery/conveyor{ id_tag = "mining_internal" @@ -1327,26 +704,12 @@ /obj/machinery/light{ dir = 1 }, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/floor/tiled, /area/ministation/cargo) "dI" = ( /turf/simulated/floor/tiled, /area/ministation/cargo) -"dJ" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"dK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) "dL" = ( /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ dir = 0; @@ -1355,7 +718,8 @@ tag_airpump = "sat1_vent"; tag_chamber_sensor = "sat1_sensor"; tag_exterior_door = "sat1_airlock_exterior"; - tag_interior_door = "sat1_airlock_interior" + tag_interior_door = "sat1_airlock_interior"; + pixel_x = -8 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 4; @@ -1363,313 +727,159 @@ }, /obj/machinery/airlock_sensor{ id_tag = "sat1_sensor"; - pixel_y = 20 + pixel_y = 20; + pixel_x = 8 }, /turf/simulated/floor/plating, /area/ministation/ai_sat) +"dM" = ( +/obj/structure/stairs/long/west, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) "dN" = ( +/obj/structure/closet, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"dR" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"dU" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"dO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/structure/disposalpipe/junction/yjunction{ dir = 1 }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"dP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/area/ministation/maint/l1central) +"dV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"eh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"dQ" = ( +/area/ministation/janitor) +"ej" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "4-8" - }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"dR" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/cargo) +"ek" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 1 }, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"el" = ( /obj/machinery/door/airlock/hatch/maintenance, /turf/simulated/floor/plating, -/area/ministation/maint/ne) -"dS" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/cargo) +"en" = ( +/obj/machinery/camera/network/engineering{ + name = "Tube Entrance"; + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-8" +/turf/simulated/floor/tiled, +/area/ministation/engine) +"eo" = ( +/obj/structure/disposalpipe/segment/bent{ + dir = 8 }, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"dT" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"es" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"dU" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "_East APC"; - pixel_x = 27; - pixel_y = 2 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/cable, -/turf/simulated/floor/plating, -/area/ministation/maint/sec) -"dW" = ( -/obj/machinery/atmospherics/portables_connector, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"dX" = ( -/obj/machinery/papershredder, -/turf/simulated/floor/tiled, -/area/ministation/court) -"dY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, -/area/ministation/court) -"dZ" = ( +/area/ministation/dorms) +"et" = ( +/obj/structure/closet/secure_closet/miner, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, /turf/simulated/floor/tiled, -/area/ministation/security) -"ea" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 2 +/area/ministation/cargo) +"eu" = ( +/turf/simulated/wall, +/area/ministation/maint/l1ne) +"ev" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"eb" = ( -/obj/structure/cable, +/turf/simulated/wall, +/area/ministation/dorms) +"ex" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "4-8" }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast2"; - name = "enclosure 2 blast door" - }, -/turf/simulated/floor, -/area/ministation/science) -"ec" = ( -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/floor_decal/industrial/warning{ - dir = 4 - }, -/obj/machinery/button/blast_door{ - id_tag = "slimeblast2"; - name = "Enclosure 2 Blastdoors Button" - }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"ee" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ef" = ( -/obj/machinery/disposal, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"eg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast3"; - name = "enclosure 3 blast door" - }, -/turf/simulated/floor, -/area/ministation/science) -"eh" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/turf/simulated/floor, -/area/ministation/science) -"ej" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"ek" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/blood/oil, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, /turf/simulated/floor/tiled, -/area/ministation/cargo) -"el" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"em" = ( -/obj/machinery/light/small, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"en" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 - }, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"eo" = ( -/obj/machinery/power/apc{ - name = "_South APC"; - pixel_y = -24 - }, -/obj/structure/cable, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"ep" = ( -/obj/structure/window/basic/full, -/turf/simulated/floor/plating, -/area/ministation/hall/s) -"eq" = ( -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"er" = ( -/obj/machinery/door/blast/shutters/open{ - id_tag = "cargoshut"; - name = "cargo shutters" - }, -/obj/effect/wallframe_spawn, -/obj/machinery/status_display/supply_display{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"es" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"et" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/area/ministation/engine) +"ez" = ( +/obj/effect/floor_decal/industrial/custodial/corner{ dir = 4 }, -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"eu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" +/area/ministation/trash) +"eB" = ( +/obj/machinery/conveyor{ + dir = 9; + id_tag = "recycler" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"ew" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/wall/r_wall, -/area/ministation/security) -"ex" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"ez" = ( -/obj/structure/bed, -/turf/simulated/floor, -/area/ministation/atmospherics) -"eB" = ( -/obj/structure/table, -/obj/machinery/faxmachine, -/turf/simulated/floor/tiled, -/area/ministation/court) +/turf/simulated/floor/plating, +/area/ministation/trash) "eC" = ( -/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/recharge_station, /turf/simulated/floor/plating, -/area/ministation/court) -"eD" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/area/ministation/ai_sat) "eE" = ( -/obj/effect/floor_decal/corner/beige{ - dir = 9 +/obj/effect/floor_decal/industrial/warning{ + dir = 8 }, -/obj/machinery/alarm{ +/obj/machinery/embedded_controller/radio/airlock/docking_port{ dir = 4; - pixel_x = -22 + id_tag = "cargo_bay"; + tag_airpump = "cargo_vent"; + tag_chamber_sensor = "cargo_sensor"; + tag_exterior_door = "cargo_airlock_exterior"; + tag_interior_door = "cargo_airlock_interior"; + pixel_x = -20 }, -/obj/vehicle/train/cargo/engine, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, /area/ministation/cargo) "eF" = ( @@ -1685,37 +895,19 @@ }, /turf/simulated/floor/tiled, /area/ministation/cargo) -"eJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) +"eI" = ( +/obj/machinery/atmospherics/portables_connector, +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/plating, +/area/ministation/supermatter) "eK" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 1; - id_tag = "stern_engineering_vent" - }, /turf/simulated/floor/plating, -/area/ministation/engine) -"eL" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/floor_decal/industrial/loading{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) +/area/ministation/supermatter) "eM" = ( -/obj/machinery/camera/autoname, -/obj/machinery/newscaster{ +/obj/machinery/atm{ pixel_y = 32 }, +/obj/machinery/camera/network/hallway, /turf/simulated/floor/tiled, /area/ministation/hall/n) "eO" = ( @@ -1725,182 +917,103 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"eP" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"eQ" = ( -/obj/machinery/door/airlock/hatch/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/junction, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/turf/simulated/floor/plating, -/area/ministation/maint/sec) +/turf/simulated/floor/tiled, +/area/ministation/hall/n) "eR" = ( -/obj/machinery/alarm{ - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/simulated/floor/plating, -/area/ministation/court) -"eS" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/machinery/light/small{ +/obj/effect/floor_decal/corner/white/diagonal{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/court) -"eT" = ( -/obj/structure/rack, -/obj/item/shield/riot, -/obj/item/shield/riot, -/obj/item/storage/box/ammo/shotgunshells, -/obj/item/clothing/suit/armor/reactive, -/turf/simulated/floor/plating, -/area/ministation/security) -"eU" = ( -/obj/structure/rack, -/obj/item/target, -/obj/item/target/alien, -/obj/item/target/syndicate, -/obj/machinery/light/small{ +/obj/effect/floor_decal/corner/white/diagonal, +/obj/machinery/meter/turf, +/turf/simulated/floor/reinforced/airmix, +/area/ministation/atmospherics) +"eS" = ( +/obj/machinery/atmospherics/portables_connector{ dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/security) -"eV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/effect/floor_decal/corner/red{ + dir = 9 }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"eU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"eW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/light_switch{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"eX" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"eW" = ( +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/effect/floor_decal/industrial/warning{ dir = 4 }, +/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/tiled, -/area/ministation/court) -"eY" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, +/area/ministation/eva) +"eX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"eZ" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"fa" = ( -/obj/machinery/door/airlock, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/disused_office) -"fb" = ( -/obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast1"; - name = "enclosure 1 blast door" +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" }, -/turf/simulated/floor, -/area/ministation/science) -"fc" = ( -/obj/machinery/disposal, -/obj/structure/disposalpipe/trunk{ +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"eY" = ( +/obj/structure/rack{ dir = 8 }, -/obj/structure/window/reinforced, -/obj/effect/floor_decal/industrial/warning{ +/obj/item/stack/material/ingot/mapped/osmium/forty, +/obj/item/stack/material/ingot/mapped/iron/fifty, +/obj/item/stack/material/ingot/mapped/copper/fifty, +/obj/item/stack/material/ingot/mapped/chromium/fifty, +/obj/item/stack/material/ingot/mapped/brass/fifty, +/obj/item/stack/material/ingot/mapped/blackbronze/fifty, +/obj/item/stack/material/ingot/mapped/gold/fifty, +/obj/item/stack/material/ingot/mapped/platinum/twenty, +/obj/item/stack/material/ingot/mapped/silver/fifty, +/obj/item/stack/material/ingot/mapped/stainlesssteel/forty, +/obj/item/stack/material/ingot/mapped/tin/fifty, +/obj/item/stack/material/ingot/mapped/zinc/fifty, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"eZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/science) -"fd" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/optable, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/area/ministation/hall/s1) "fe" = ( -/obj/machinery/computer/operating, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ff" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 15 - }, -/obj/item/circular_saw, -/obj/machinery/camera/network/research, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/wall/r_wall, +/area/ministation/hall/s1) "fg" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/machinery/alarm{ - pixel_y = 23 +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"fh" = ( -/obj/structure/closet/crate/bin/ministation, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/obj/machinery/atmospherics/pipe/simple/visible/red, +/obj/effect/floor_decal/corner/blue{ + dir = 6 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) "fi" = ( /obj/effect/floor_decal/corner/beige{ dir = 9 @@ -1924,12 +1037,17 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, +/obj/item/stool/padded, /turf/simulated/floor/tiled, /area/ministation/cargo) "fm" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/storage/box, +/obj/item/megaphone, /turf/simulated/floor/tiled, /area/ministation/cargo) "fn" = ( @@ -1938,6 +1056,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden, +/obj/item/stool/padded, /turf/simulated/floor/tiled, /area/ministation/cargo) "fo" = ( @@ -1947,10 +1066,13 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "fp" = ( -/obj/structure/closet/secure_closet/miner, /obj/effect/floor_decal/corner/beige{ dir = 6 }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, /turf/simulated/floor/tiled, /area/ministation/cargo) "fq" = ( @@ -1958,7 +1080,8 @@ dir = 8 }, /obj/machinery/status_display/supply_display{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/machinery/atmospherics/portables_connector{ pixel_x = -3; @@ -1968,69 +1091,43 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "fr" = ( -/obj/structure/table, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/item/stack/material/cardstock/mapped/cardboard/fifty, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/ministation/cargo) "fs" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_x = 6; - pixel_y = -5 - }, -/obj/item/multitool, -/obj/machinery/network/requests_console{ - department = "Cargo Bay"; - pixel_y = 30 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) +/obj/structure/tank_rack/oxygen, +/turf/simulated/floor/plating, +/area/ministation/engine) "ft" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/hologram/holopad, +/obj/item/radio/intercom/locked{ + dir = 4; + pixel_x = -22 }, -/obj/item/eftpos, -/obj/machinery/camera/network/mining, /turf/simulated/floor/tiled, /area/ministation/cargo) "fu" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/pen/red, -/obj/effect/floor_decal/corner/beige{ - dir = 6 +/obj/machinery/door/airlock/glass/mining, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/button/blast_door{ - id_tag = "cargoshut"; - name = "Cargo Shutters Button"; - pixel_y = 23 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/item/stamp/cargo, /turf/simulated/floor/tiled, /area/ministation/cargo) "fv" = ( -/obj/machinery/door/blast/shutters/open{ +/obj/effect/wallframe_spawn, +/obj/machinery/door/blast/shutters{ id_tag = "cargoshut"; name = "cargo shutters" }, -/obj/effect/wallframe_spawn, /turf/simulated/floor/tiled, /area/ministation/cargo) "fw" = ( @@ -2048,6 +1145,8 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, +/obj/item/chems/drinks/juicebox/random, +/obj/item/chems/drinks/juicebox/sensible_random, /turf/simulated/floor/tiled, /area/ministation/hall/n) "fz" = ( @@ -2061,9 +1160,6 @@ /obj/abstract/landmark{ name = "lightsout" }, -/obj/structure/cable{ - icon_state = "2-4" - }, /turf/simulated/floor/tiled, /area/ministation/hall/n) "fB" = ( @@ -2075,29 +1171,12 @@ }, /turf/simulated/floor/tiled, /area/ministation/cargo) -"fC" = ( -/obj/machinery/power/apc{ - areastring = null; - name = "_South APC"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/simulated/floor/plating, -/area/ministation/detective) -"fD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "2-8" +"fE" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/maint/sec) +/area/ministation/supermatter) "fF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -2108,51 +1187,24 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "fG" = ( -/obj/machinery/door/airlock/glass/command{ - autoset_access = 0; - name = "Telecommunications glass airlock"; - req_access = list("ACCESS_TELECOMS") - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"fH" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 9 - }, -/obj/machinery/camera/network/security{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"fI" = ( -/obj/machinery/door/firedoor{ - dir = 8 +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular/open{ + id_tag = "scraplock"; + dir = 4; + name = "External Blast Doors" }, -/obj/machinery/door/airlock/glass/security{ - name = "Brig Access Airlock"; - req_access = list(list("ACCESS_SECURITY","ACCESS_LAWYER")); - autoset_access = 0 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/visible/red{ + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/court) +/turf/simulated/floor/plating, +/area/ministation/atmospherics) "fJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/cargo) -"fK" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window/westleft, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast1"; - name = "enclosure 1 blast door" - }, -/turf/simulated/floor, -/area/ministation/science) "fL" = ( /obj/structure/rack, /obj/item/pickaxe, @@ -2168,6 +1220,9 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, +/obj/machinery/camera/network/mining{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/ministation/cargo) "fM" = ( @@ -2192,163 +1247,146 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "fQ" = ( -/obj/structure/closet/secure_closet/cargotech, /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/item/key/cargo_train, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, /turf/simulated/floor/tiled, /area/ministation/cargo) "fR" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/obj/machinery/camera/network/mining{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/obj/structure/filing_cabinet, /turf/simulated/floor/tiled, /area/ministation/cargo) "fS" = ( -/obj/machinery/computer/modular/preset/supply_public, /obj/effect/floor_decal/corner/beige{ dir = 6 }, +/obj/machinery/computer/modular/preset/merchant/ministation{ + dir = 1 + }, /turf/simulated/floor/tiled, /area/ministation/cargo) "fU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/door/firedoor{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) +/obj/structure/window/basic/full, +/turf/simulated/floor/plating, +/area/ministation/dorms) "fV" = ( -/obj/machinery/power/apc{ - name = "_South APC"; - pixel_y = -24 +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1447; + listening = 0; + name = "Station Intercom (AI Private)"; + pixel_y = -30; + dir = 1 }, -/obj/structure/cable, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/plating, -/area/ministation/security) -"fX" = ( -/obj/item/gun/energy/taser, -/obj/structure/closet/secure_closet/guncabinet, -/obj/item/gun/energy/taser, -/obj/item/gun/projectile/shotgun/pump, -/obj/item/gun/projectile/shotgun/pump, -/turf/simulated/floor/plating, -/area/ministation/security) -"fY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 + dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"fW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden, /turf/simulated/floor/tiled, -/area/ministation/security) -"fZ" = ( -/obj/effect/floor_decal/corner/red{ - dir = 6 - }, +/area/ministation/engine) +"fX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/structure/cable{ icon_state = "2-4" }, /turf/simulated/floor/tiled, -/area/ministation/security) -"ga" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/area/ministation/hall/s1) +"fZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/floor_decal/corner/yellow{ + dir = 10 }, /turf/simulated/floor/tiled, -/area/ministation/security) -"gb" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 +/area/ministation/hall/s1) +"ga" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, +/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"gb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/flora/pottedplant/minitree, /turf/simulated/floor/tiled, -/area/ministation/security) -"gc" = ( -/obj/structure/closet/secure_closet/brig, -/turf/simulated/floor/tiled, -/area/ministation/security) -"gd" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular/open{ - id_tag = "slimeblast1"; - name = "enclosure 1 blast door" - }, -/turf/simulated/floor, -/area/ministation/science) +/area/ministation/hall/s1) "ge" = ( -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" }, -/obj/structure/window/reinforced{ - dir = 1 +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"gg" = ( +/obj/machinery/conveyor{ + dir = 8; + id_tag = "trash_sort" }, -/obj/machinery/button/blast_door{ - id_tag = "slimeblast1"; - name = "Enclosure 1 Blastdoors Button" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/floor_decal/industrial/warning{ +/obj/structure/window/reinforced, +/turf/simulated/floor/plating, +/area/ministation/trash) +"gi" = ( +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ dir = 4 }, -/obj/machinery/camera/network/research{ - dir = 1 +/obj/machinery/light{ + dir = 4; + icon_state = "bulb1" }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"gf" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"gg" = ( -/obj/abstract/landmark/start{ - name = "Scientist" +/obj/machinery/atmospherics/pipe/simple/visible/supply, +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 22 }, -/obj/item/stool/padded, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"gh" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"gi" = ( -/obj/machinery/smartfridge/secure/extract, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) "gj" = ( /obj/machinery/light{ dir = 8; icon_state = "tube1" }, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 - }, /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/vehicle/train/cargo/trolley, +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/mining/brace, /turf/simulated/floor/tiled, /area/ministation/cargo) "gk" = ( @@ -2367,6 +1405,21 @@ }, /turf/simulated/floor/tiled, /area/ministation/cargo) +"gm" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"gn" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/space, +/area/space) "go" = ( /obj/machinery/light{ dir = 4; @@ -2377,14 +1430,13 @@ dir = 6 }, /obj/item/toy/prize/powerloader, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, /area/ministation/cargo) "gq" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" - }, -/obj/machinery/fabricator, +/obj/effect/wallframe_spawn, /turf/simulated/floor/tiled, /area/ministation/cargo) "gr" = ( @@ -2397,23 +1449,16 @@ /obj/abstract/landmark/start{ name = "Cargo Technician" }, -/obj/structure/bed/chair, /obj/effect/floor_decal/corner/beige{ dir = 6 }, +/obj/structure/bed/chair/office, /turf/simulated/floor/tiled, /area/ministation/cargo) "gt" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/window/brigdoor/westleft, -/obj/machinery/door/blast/shutters/open{ - id_tag = "cargoshut"; - name = "cargo shutters" - }, +/obj/machinery/door/airlock/glass/mining, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, /area/ministation/cargo) "gu" = ( @@ -2427,13 +1472,13 @@ /turf/simulated/floor/tiled, /area/ministation/hall/n) "gw" = ( -/obj/structure/closet/crate/bin/ministation, /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/item/chems/drinks/juicebox/random, -/obj/item/chems/drinks/juicebox/random, -/obj/item/chems/drinks/juicebox/sensible_random, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/disposal, /turf/simulated/floor/tiled, /area/ministation/hall/n) "gx" = ( @@ -2443,6 +1488,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, /area/ministation/hall/n) "gy" = ( @@ -2451,117 +1497,49 @@ }, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"gA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"gB" = ( -/obj/machinery/door/airlock/glass/command{ - autoset_access = 0; - name = "Armory airlock"; - req_access = list("ACCESS_ARMORY") - }, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"gC" = ( -/obj/effect/floor_decal/corner/red{ - dir = 6 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/security) "gD" = ( -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/window/brigdoor/eastright{ - id_tag = "Cell 2" - }, -/obj/effect/floor_decal/corner/red{ - dir = 9 +/obj/machinery/port_gen/pacman/super, +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/simulated/floor/tiled, -/area/ministation/security) +/turf/simulated/floor/plating, +/area/ministation/engine) "gE" = ( -/obj/structure/table/reinforced, -/obj/item/toy/eightball, -/obj/machinery/light/small{ +/obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"gF" = ( -/obj/effect/floor_decal/corner/purple, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"gG" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/purple{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"gH" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/floor_decal/corner/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/unary/vent_pump/high_volume{ + dir = 4; + external_pressure_bound = 0; + external_pressure_bound_default = 0; + icon_state = "map_vent_in"; + id_tag = "air_out"; + internal_pressure_bound = 2000; + internal_pressure_bound_default = 2000; + pressure_checks = 2; + pressure_checks_default = 2; + pump_direction = 0; + use_power = 1 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/reinforced/airmix, +/area/ministation/atmospherics) "gI" = ( -/obj/structure/table, -/obj/item/chems/spray/extinguisher{ - pixel_x = 4; - pixel_y = 3 +/obj/machinery/light/small{ + dir = 8 }, -/obj/item/chems/spray/extinguisher, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "l1ne_vent" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) "gJ" = ( -/obj/structure/table, -/obj/machinery/light, -/obj/item/storage/box/monkeycubes, -/obj/item/stack/material/puck/mapped/uranium/ten, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"gK" = ( -/obj/structure/table, -/obj/item/storage/box/syringes, -/obj/item/chems/glass/beaker/large, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/hall/n) "gL" = ( -/obj/vehicle/train/cargo/trolley, +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/mining/drill, /turf/simulated/floor/tiled, /area/ministation/cargo) "gM" = ( @@ -2570,22 +1548,15 @@ }, /turf/simulated/floor/tiled, /area/ministation/cargo) -"gN" = ( -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/tiled, -/area/ministation/cargo) "gO" = ( /obj/machinery/door/firedoor{ dir = 8 }, +/obj/effect/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled, /area/ministation/cargo) "gP" = ( -/obj/machinery/photocopier, -/obj/effect/floor_decal/corner/beige{ - dir = 6 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled, /area/ministation/cargo) "gQ" = ( @@ -2604,6 +1575,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, /area/ministation/hall/n) "gT" = ( @@ -2611,140 +1583,101 @@ /turf/simulated/floor/tiled, /area/ministation/hall/n) "gU" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "pqm_airlock_interior" +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + dir = 4 }, -/obj/machinery/button/access/interior{ - id_tag = "pqm_airlock"; - name = "interior access button"; - pixel_x = 10; - pixel_y = 20 +/obj/effect/floor_decal/corner/blue{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) "gV" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/light{ + dir = 1 }, -/obj/structure/bookcase/skill_books/random, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"gX" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/obj/effect/floor_decal/industrial/loading{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/security) -"ha" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/area/space) +"gW" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 1; + id_tag = "stern_engineering_vent" }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hb" = ( -/obj/effect/floor_decal/corner/red{ - dir = 6 +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "stern_engineering_airlock"; + pixel_y = -6; + tag_airpump = "stern_engineering_vent"; + tag_chamber_sensor = "stern_engineering_sensor"; + tag_exterior_door = "stern_engineering_airlock_exterior"; + tag_interior_door = "stern_engineering_airlock_interior"; + dir = 4; + pixel_x = -20; + name = "2. Airlock Controller" }, -/obj/machinery/door_timer/cell_2{ - pixel_x = 31; - pixel_y = -1 +/turf/simulated/floor/plating, +/area/ministation/engine) +"gX" = ( +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"gY" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 9 }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/plating, +/area/ministation/engine) +"gZ" = ( +/obj/machinery/computer/modular/preset/engineering{ + dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/security) +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/smcontrol) "hc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/wall/r_wall, -/area/ministation/security) -"hd" = ( -/obj/structure/bed, -/obj/item/bedsheet/mime, -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -27 +/obj/machinery/alarm{ + dir = 4; + pixel_x = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"he" = ( -/obj/machinery/door/airlock/glass, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/disused) -"hf" = ( -/obj/structure/table, -/obj/item/wrench, -/obj/item/crowbar/red, -/obj/machinery/light{ +/obj/machinery/computer/modular/preset/civilian{ dir = 1 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hg" = ( -/obj/structure/table, -/obj/item/clothing/mask/gas/budget, -/obj/item/clothing/glasses/science, -/obj/machinery/camera/network/research, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hh" = ( -/obj/structure/closet/l3closet/scientist, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hi" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"hf" = ( +/turf/simulated/floor/plating, +/area/ministation/trash) +"hk" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"hj" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass/science, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hm" = ( -/obj/machinery/atmospherics/unary/vent_pump/siphon/on, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/science) +/turf/simulated/floor/plating, +/area/ministation/supermatter) "hn" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/design_database, -/turf/simulated/floor/tiled/dark, -/area/ministation/science) +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) "ho" = ( /obj/machinery/atmospherics/portables_connector{ pixel_x = -3 @@ -2753,20 +1686,10 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "hp" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, +/obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled, /area/ministation/cargo) "hq" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = -32 - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -2776,27 +1699,20 @@ }, /turf/simulated/floor/tiled, /area/ministation/cargo) -"hr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/effect/floor_decal/corner/paleblue/full, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) "hs" = ( -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -23 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning/fulltile, +/obj/machinery/light{ + icon_state = "tube1" + }, /turf/simulated/floor/tiled, /area/ministation/cargo) "ht" = ( @@ -2805,101 +1721,50 @@ pixel_y = -22 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled, /area/ministation/cargo) "hu" = ( /obj/machinery/door/firedoor{ dir = 8 }, -/obj/machinery/door/airlock/mining, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"hv" = ( -/obj/structure/closet/secure_closet/security, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hw" = ( -/obj/structure/table, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/head/earmuffs, -/obj/item/clothing/head/earmuffs, -/obj/machinery/network/requests_console{ - department = "Security"; - pixel_y = 30 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hx" = ( -/obj/structure/table, -/obj/item/storage/box/handcuffs{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/box/flashbangs, -/obj/machinery/recharger/wallcharger{ - pixel_y = 25 - }, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hz" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hA" = ( -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 + icon_state = "4-8" }, -/obj/machinery/computer/modular/preset/security{ - dir = 4 +/obj/effect/floor_decal/industrial/warning/fulltile, +/obj/machinery/door/airlock/double/mining{ + dir = 8 }, -/turf/simulated/floor/wood, -/area/ministation/detective) -"hB" = ( -/turf/simulated/floor/carpet/red, -/area/ministation/detective) -"hC" = ( -/obj/structure/table/woodentable, -/obj/item/camera, -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/item/taperecorder, -/obj/item/folder/yellow, -/obj/item/storage/secure/safe{ - pixel_x = 4; - pixel_y = 26 +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"hv" = ( +/obj/machinery/atmospherics/pipe/simple/visible/red{ + dir = 6 }, -/obj/structure/filing_cabinet/wall{ - pixel_x = 32 +/obj/effect/floor_decal/corner/blue, +/obj/structure/fireaxecabinet{ + pixel_y = 32 }, -/turf/simulated/floor/carpet/red, -/area/ministation/detective) +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) "hE" = ( /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; @@ -2907,113 +1772,9 @@ }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"hF" = ( -/obj/machinery/button/blast_door{ - id_tag = "scishut"; - name = "Science Shutter Button"; - pixel_x = -25; - pixel_y = -6 - }, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hG" = ( -/obj/effect/floor_decal/corner/purple{ - dir = 4 - }, -/obj/structure/sign/department/xenobio_3{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/purple{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hI" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/structure/table, -/obj/item/disk/tech_disk, -/obj/item/disk/tech_disk, -/obj/item/disk/design_disk, -/obj/item/disk/design_disk, -/obj/effect/floor_decal/corner/purple{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hJ" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hK" = ( -/obj/structure/table, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/manipulator, -/obj/machinery/alarm{ - pixel_y = 23 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hL" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/scanning_module, -/obj/item/stock_parts/scanning_module{ - pixel_x = 2; - pixel_y = 3 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"hM" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/science) -"hN" = ( -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 5 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/science) -"hO" = ( -/obj/machinery/atmospherics/pipe/manifold/visible{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark, -/area/ministation/science) "hP" = ( /obj/structure/sign/warning/docking_area{ - pixel_y = 30 + pixel_y = 32 }, /obj/machinery/door/airlock/external/bolted{ id_tag = "cargo_airlock_interior"; @@ -3029,9 +1790,6 @@ /obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, /turf/simulated/floor/tiled, /area/ministation/cargo) "hR" = ( @@ -3044,9 +1802,6 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "hS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/closet/crate, -/obj/item/stack/material/ore/slag, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -3054,29 +1809,27 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "hT" = ( -/obj/structure/closet/crate, -/obj/item/stack/material/ore/glass, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/camera/network/mining{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 10 }, /turf/simulated/floor/tiled, /area/ministation/cargo) "hU" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, /turf/simulated/floor/plating, -/area/ministation/maint/se) +/area/ministation/maint/eastatmos) "hV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ @@ -3085,73 +1838,19 @@ }, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"hW" = ( -/obj/machinery/newscaster{ - pixel_x = -32 +"hY" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/flora/pottedplant/largebush, -/obj/machinery/camera/network/security{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" }, /turf/simulated/floor/tiled, -/area/ministation/security) -"hY" = ( -/obj/structure/table, -/obj/item/assembly/timer, -/obj/item/flash, -/turf/simulated/floor/tiled, -/area/ministation/security) -"hZ" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/security) -"ia" = ( -/obj/effect/floor_decal/corner/red{ - dir = 6 - }, -/obj/machinery/door_timer/cell_1{ - pixel_x = 31 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"ib" = ( -/obj/machinery/network/requests_console{ - department = "Detective's office"; - pixel_x = -30 - }, -/obj/machinery/forensic, -/turf/simulated/floor/wood, -/area/ministation/detective) -"ic" = ( -/obj/abstract/landmark/start{ - name = "Detective" - }, -/obj/structure/bed/chair/office/comfy/brown{ - dir = 4 - }, -/turf/simulated/floor/carpet/red, -/area/ministation/detective) -"id" = ( -/obj/structure/table/woodentable, -/obj/item/folder/red, -/obj/item/hand_labeler, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/simulated/floor/carpet/red, -/area/ministation/detective) +/area/ministation/hall/n) "ie" = ( /obj/machinery/door/airlock/external/bolted{ id_tag = "cargo_airlock_exterior"; @@ -3161,97 +1860,41 @@ /turf/simulated/floor/plating, /area/ministation/cargo) "if" = ( -/obj/machinery/door/window/eastright, -/obj/machinery/door/blast/shutters/open{ - id_tag = "scishut"; - name = "science shutters" +/obj/machinery/fabricator/pipe, +/obj/effect/floor_decal/corner/yellow{ + dir = 4 }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor{ +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/science) -"ig" = ( -/obj/effect/floor_decal/industrial/warning/corner, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ih" = ( -/obj/effect/floor_decal/industrial/warning, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ii" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/obj/effect/floor_decal/industrial/warning, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) "ij" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/floor_decal/industrial/warning/corner{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ik" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"in" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/recharger, -/obj/structure/table, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"io" = ( -/obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/science) -"ip" = ( -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 9 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/science) -"iq" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"ir" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"is" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"it" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/meter{ - name = "Distribution Loop" +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"il" = ( +/turf/simulated/wall/r_wall, +/area/ministation/supermatter) +"iq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/w) +/turf/simulated/floor/tiled, +/area/ministation/cargo) "iu" = ( /obj/machinery/vending/cola{ dir = 4; @@ -3259,187 +1902,46 @@ }, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"iv" = ( -/obj/machinery/vending/snack{ - dir = 8; - pixel_x = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"iw" = ( -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 - }, -/obj/machinery/computer/modular/preset/security{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"ix" = ( -/obj/abstract/landmark/start{ - name = "Security Officer" - }, -/obj/structure/bed/chair, -/turf/simulated/floor/tiled, -/area/ministation/security) -"iy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) "iz" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"iA" = ( -/obj/effect/floor_decal/corner/red{ - dir = 6 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" }, -/turf/simulated/floor/tiled, -/area/ministation/security) +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) "iB" = ( -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/window/brigdoor/eastright{ - id_tag = "Cell 1" - }, -/obj/effect/floor_decal/corner/red{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"iC" = ( -/obj/effect/decal/cleanable/blood, -/turf/simulated/floor/tiled, -/area/ministation/security) -"iD" = ( -/obj/structure/table/reinforced, -/obj/item/synthesized_instrument/violin, -/obj/machinery/light/small{ - dir = 4 +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/turf/simulated/floor/tiled, -/area/ministation/security) +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) "iE" = ( -/obj/structure/closet/secure_closet/detective, -/turf/simulated/floor/wood, -/area/ministation/detective) -"iG" = ( -/obj/structure/table/woodentable, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/storage/fancy/cigarettes, -/obj/item/handcuffs, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/turf/simulated/floor/carpet/red, -/area/ministation/detective) -"iH" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/abstract/landmark/latejoin/cryo, -/obj/machinery/camera/network/medbay{ - dir = 1 +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"iI" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/pen, -/obj/machinery/network/requests_console{ - department = "Science"; - name = "Science Requests Console"; - pixel_x = -30 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iJ" = ( -/obj/effect/floor_decal/industrial/warning{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iK" = ( -/obj/machinery/fabricator/imprinter, -/turf/simulated/floor/tiled/techfloor, -/area/ministation/science) -"iL" = ( -/turf/simulated/floor/tiled/techfloor, -/area/ministation/science) -"iM" = ( -/obj/machinery/destructive_analyzer, -/turf/simulated/floor/tiled/techfloor, -/area/ministation/science) -"iN" = ( /obj/effect/floor_decal/industrial/warning{ - dir = 8 + dir = 1; + icon_state = "warning" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"iM" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iQ" = ( -/obj/abstract/landmark/start{ - name = "Scientist" - }, -/obj/structure/bed/chair/office/light, -/obj/item/radio/intercom{ - dir = 8; - pixel_x = 20 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iR" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/portables_connector{ +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"iN" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"iS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass/science, -/obj/machinery/atmospherics/pipe/simple/visible, -/turf/simulated/floor/tiled/dark, -/area/ministation/science) -"iT" = ( -/obj/machinery/atmospherics/pipe/manifold/visible, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/tiled, +/area/ministation/hall/n) "iU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/binary/pump/on{ @@ -3449,339 +1951,96 @@ /turf/simulated/floor/tiled, /area/ministation/cargo) "iV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/closet/crate, -/obj/item/stack/material/ore/glass, -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "cargo_vent" }, -/turf/simulated/floor/tiled, +/turf/simulated/floor/plating, /area/ministation/cargo) "iW" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/closet/crate, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/cargo) -"iX" = ( -/turf/simulated/wall, -/area/ministation/commons) -"iY" = ( -/obj/machinery/door/airlock/double/glass/civilian, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"iZ" = ( -/obj/machinery/vending/coffee{ - dir = 4; - pixel_x = -5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"ja" = ( -/obj/machinery/vending/cigarette{ - dir = 8; - pixel_x = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"jb" = ( -/obj/machinery/computer/prisoner{ - dir = 4 - }, -/obj/machinery/button/blast_door{ - id_tag = "secshut"; - name = "security shutter button"; - pixel_y = -32 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"jc" = ( -/obj/effect/shuttle_landmark/escape_shuttle/station, -/turf/space, -/area/space) "jd" = ( -/obj/machinery/computer/station_alert/security{ - dir = 8 +/obj/machinery/door/airlock/hatch/maintenance{ + autoset_access = 0 }, -/turf/simulated/floor/tiled, -/area/ministation/security) +/turf/simulated/floor/plating, +/area/ministation/trash) "je" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/closet/crate/bin/ministation, -/turf/simulated/floor/tiled, -/area/ministation/security) -"jg" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/button/alternate/door{ - dir = 1; - id_tag = "secdoor"; - name = "security airlock access button"; - pixel_x = -25; - pixel_y = -25 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"jh" = ( -/obj/effect/floor_decal/corner/red{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"jf" = ( +/obj/machinery/atmospherics/binary/circulator{ + anchored = 1; dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"ji" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -23 - }, -/turf/simulated/floor/wood, -/area/ministation/detective) -"jj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/wood, -/area/ministation/detective) -"jk" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/machinery/camera/network/security{ - dir = 1 - }, -/turf/simulated/floor/wood, -/area/ministation/detective) -"jl" = ( -/obj/structure/rack, -/obj/random/maintenance, -/obj/item/clothing/suit/storage/toggle/bomber, /turf/simulated/floor/plating, -/area/ministation/maint/detective) -"jm" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jn" = ( -/obj/machinery/fabricator/protolathe, -/turf/simulated/floor/tiled/techfloor, -/area/ministation/science) -"jo" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/simulated/floor/tiled/techfloor, -/area/ministation/science) -"jp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/computer/design_console{ - dir = 8 +/area/ministation/supermatter) +"jh" = ( +/turf/simulated/wall, +/area/ministation/maint/l1central) +"jj" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -24 }, -/turf/simulated/floor/tiled/techfloor, -/area/ministation/science) +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "jq" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/effect/floor_decal/corner/purple, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/floor_decal/corner/purple{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"js" = ( -/obj/structure/table, -/obj/item/chems/glass/beaker/large, -/obj/item/chems/glass/beaker/sulphuric, -/obj/item/chems/dropper, -/obj/effect/floor_decal/corner/purple{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jt" = ( -/obj/structure/table, -/obj/item/stock_parts/console_screen, -/obj/item/stock_parts/console_screen, -/obj/item/stock_parts/console_screen, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ju" = ( -/obj/structure/table, -/obj/item/clothing/glasses/welding, -/obj/item/stack/material/pane/mapped/glass/fifty, -/obj/item/stack/material/reinforced/mapped/fiberglass/fifty, -/obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/shiny/mapped/aluminium/fifty, -/obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/machinery/camera/network/research{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jv" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = 3 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jw" = ( -/obj/abstract/landmark{ - name = "blobstart" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jx" = ( -/obj/effect/floor_decal/industrial/warning/corner{ - dir = 4 - }, -/obj/item/radio/intercom{ - dir = 8; - pixel_x = 20 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) "jy" = ( -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, +/obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, -/area/ministation/cargo) +/area/ministation/dorms) "jz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"jB" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/obj/structure/closet/secure_closet{ + closet_appearance = /decl/closet_appearance/secure_closet/security; + req_access = list("ACCESS_BRIG"); + name = "Security locker" }, -/obj/structure/table, -/obj/random/plushie, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 +/turf/simulated/floor/tiled, +/area/ministation/eva) +"jA" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 9 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) +/turf/simulated/floor/plating, +/area/ministation/supermatter) "jC" = ( -/obj/machinery/alarm{ - pixel_y = 23 - }, -/obj/structure/closet/wardrobe/pjs, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"jD" = ( -/obj/machinery/photocopier, -/obj/machinery/status_display{ - pixel_y = 32 +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/blast/regular/open{ + id_tag = "scraplock"; + dir = 4; + name = "External Blast Doors" }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"jE" = ( -/obj/structure/table/woodentable, -/obj/machinery/fabricator/book, -/obj/machinery/light{ - dir = 1 +/obj/machinery/atmospherics/pipe/manifold/visible/red{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/commons) +/turf/simulated/floor/plating, +/area/ministation/atmospherics) "jF" = ( -/obj/machinery/camera/autoname, -/obj/structure/bookcase/skill_books/random, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"jG" = ( -/obj/machinery/washing_machine, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/tiled, -/area/ministation/commons) +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) "jH" = ( /obj/machinery/alarm{ pixel_y = 23 @@ -3789,38 +2048,34 @@ /turf/simulated/floor/plating, /area/ministation/ai_sat) "jI" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, +/obj/structure/closet/secure_closet/cargotech, +/obj/item/key/cargo_train, /turf/simulated/floor/tiled, -/area/ministation/hall/n) +/area/ministation/cargo) "jL" = ( -/obj/machinery/door/airlock/glass/security{ - autoset_access = 0; - name = "Detective's Office"; - req_access = list("ACCESS_FORENSICS") +/obj/item/pen, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"jM" = ( +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/wood, -/area/ministation/detective) +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/reinforced/airmix, +/area/ministation/atmospherics) "jO" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/ministation/maint/detective) -"jP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass/science, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/obj/structure/table/gamblingtable, +/obj/item/paicard, +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) "jQ" = ( /obj/machinery/light/small{ dir = 1 @@ -3830,36 +2085,16 @@ }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"jR" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/item/integrated_circuit_printer, -/obj/structure/table, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"jS" = ( -/obj/structure/table, -/obj/item/book/skill/service/cooking, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) "jT" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 - }, -/obj/item/storage/pill_bottle, -/obj/machinery/light{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/item/eftpos, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) "jU" = ( /obj/structure/sign/warning/docking_area{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /obj/machinery/door/airlock/external/bolted{ id_tag = "cargo_airlock_interior"; @@ -3873,11 +2108,15 @@ /area/ministation/cargo) "jV" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 8 }, +/obj/machinery/camera/network/mining{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/stack/material/ore/slag, /turf/simulated/floor/tiled, /area/ministation/cargo) "jW" = ( @@ -3886,6 +2125,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, +/obj/item/stack/material/ore/sand, /turf/simulated/floor/tiled, /area/ministation/cargo) "jX" = ( @@ -3895,517 +2135,220 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, +/obj/machinery/light, /turf/simulated/floor/tiled, /area/ministation/cargo) "jY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"ka" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"kb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"kc" = ( -/obj/machinery/door/airlock/civilian, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"kd" = ( -/obj/abstract/landmark/start{ - name = "Assistant" - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) "ke" = ( -/obj/machinery/alarm{ - pixel_y = 23 - }, -/obj/machinery/vending/games, +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/commons) +/area/ministation/hall/n) "kf" = ( -/obj/effect/wallframe_spawn/no_grille, -/turf/simulated/floor/plating, -/area/ministation/commons) -"kg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = 32 +/turf/simulated/wall, +/area/ministation/hall/n) +"kg" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 5 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/closet/secure_closet{ + closet_appearance = /decl/closet_appearance/secure_closet/command/hop; + req_access = list("ACCESS_HEAD_OF_PERSONNEL"); + name = "Lieutenant's locker" }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) +/area/ministation/eva) "kh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"ki" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"kj" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/detective) -"kk" = ( -/obj/item/stool/padded, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"kl" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/detective) "km" = ( /obj/machinery/light/small{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor, -/area/ministation/atmospherics) -"kn" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ko" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kp" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 5 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kr" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"ks" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/industrial/warning{ +/area/ministation/maint/eastatmos) +"kq" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/floor_decal/corner/purple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kt" = ( +/turf/simulated/floor/reinforced/airmix, +/area/ministation/atmospherics) +"kv" = ( +/obj/machinery/light, +/obj/machinery/suit_cycler/engineering/ministation, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"kw" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/floor_decal/corner/purple{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"kx" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ku" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/machinery/door/blast/regular/open{ + id_tag = "scraplock"; + dir = 4; + name = "External Blast Doors" }, -/obj/effect/floor_decal/corner/purple{ - dir = 1 +/turf/simulated/floor/plating, +/area/ministation/atmospherics) +"ky" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kv" = ( /obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/closet/crate/bin/ministation, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kx" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ky" = ( -/obj/machinery/camera/network/research, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kz" = ( -/mob/living/simple_animal/cat/fluff/ran, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kA" = ( -/obj/machinery/atmospherics/pipe/simple/visible/universal{ - dir = 4 + dir = 8; + pixel_x = -24 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"kB" = ( -/obj/structure/dogbed, -/obj/item/clothing/shoes/color/brown{ - desc = "Old, but sensible brown shoes. These belong to Ian." +/area/ministation/cargo) +"kA" = ( +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"kC" = ( -/obj/machinery/atmospherics/pipe/simple/visible/universal{ +/obj/structure/bed/chair/janicart{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"kD" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/eftpos, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"kE" = ( -/obj/machinery/camera/autoname{ - dir = 1 - }, -/obj/machinery/lapvend{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"kF" = ( -/obj/structure/table/woodentable, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/electrical, -/obj/item/clothing/gloves/insulated/cheap, -/obj/item/clothing/gloves/insulated/cheap, -/obj/machinery/light, /turf/simulated/floor/tiled, -/area/ministation/commons) -"kG" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/area/ministation/janitor) +"kC" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green, +/obj/machinery/atmospherics/binary/pump{ + dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/disused) +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) "kH" = ( /obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor, -/area/ministation/atmospherics) +/area/ministation/maint/eastatmos) "kI" = ( -/obj/abstract/landmark/start{ - name = "Assistant" - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"kJ" = ( -/obj/abstract/landmark{ - name = "bluespace_a" - }, -/obj/structure/table/gamblingtable, -/obj/item/deck/cag/black, -/obj/item/deck/cag/white{ - pixel_z = -6 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 5 }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"kK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/extinguisher_cabinet{ + pixel_x = -29; dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/light/small{ + dir = 8 }, /turf/simulated/floor/tiled, -/area/ministation/commons) +/area/ministation/eva) "kL" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"kM" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/obj/structure/hygiene/toilet, +/obj/structure/window/reinforced/tinted{ dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"kN" = ( -/obj/abstract/landmark{ - name = "lightsout" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"kO" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"kP" = ( -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/airlock/glass/science, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/window/reinforced/tinted{ + dir = 4; + icon_state = "twindow" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/window/reinforced/tinted{ + dir = 8; + icon_state = "twindow" }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"kQ" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/start{ + name = "Deck Hand" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"kM" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kR" = ( -/obj/effect/floor_decal/industrial/warning{ +/turf/simulated/floor/plating, +/area/ministation/hall/n) +"kN" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/unary/outlet_injector{ + dir = 4; + icon_state = "map_injector"; + id_tag = "n2_in"; + use_power = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/effect/floor_decal/corner/white/diagonal, +/obj/effect/floor_decal/corner/white/diagonal{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kS" = ( -/obj/structure/fireaxecabinet{ - pixel_z = 23 - }, -/turf/simulated/floor, +/turf/simulated/floor/reinforced/airmix, /area/ministation/atmospherics) -"kT" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"kU" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kV" = ( -/obj/abstract/landmark{ - name = "bluespace_a" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kW" = ( -/obj/abstract/landmark/start{ - name = "Scientist" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"kX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/abstract/landmark{ - name = "Observer-Start" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"kY" = ( -/obj/structure/closet, -/obj/item/clothing/mask/gas/clown_hat, -/obj/item/clothing/shoes/clown_shoes, -/obj/item/clothing/under/clown, -/obj/item/stamp/clown, -/obj/item/storage/backpack/clown, -/obj/item/bikehorn, -/obj/item/storage/fancy/crayons, -/turf/simulated/floor/plating, -/area/ministation/maint/se) "kZ" = ( /turf/simulated/wall, -/area/ministation/hall/w) -"la" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/hall/w) +/area/ministation/janitor) "lb" = ( -/obj/machinery/atmospherics/portables_connector{ - pixel_x = -3 - }, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"lc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"ld" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"le" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4 }, -/obj/random/trash, -/obj/random/trash, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"le" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/obj/effect/floor_decal/corner/red{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/visible/red, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"lf" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) +/turf/space, +/area/space) "lg" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"lh" = ( -/obj/machinery/alarm{ - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) +/turf/space, +/area/space) "li" = ( /obj/machinery/atmospherics/pipe/simple/visible{ dir = 4 @@ -4428,28 +2371,11 @@ }, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"lm" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) "ln" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /turf/simulated/floor/tiled, /area/ministation/engine) -"lo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) "lp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -4457,171 +2383,98 @@ /turf/simulated/floor/tiled, /area/ministation/hall/n) "lq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 1 +/obj/machinery/camera/network/mining{ + dir = 8 }, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/structure/closet/crate, +/obj/item/stack/material/brick/mapped/sandstone/forty, /turf/simulated/floor/tiled, -/area/ministation/hall/n) +/area/ministation/cargo) "lr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"ls" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/n) +/area/ministation/engine) "lt" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"lv" = ( -/obj/structure/closet/emcloset, -/obj/effect/floor_decal/industrial/warning{ - dir = 10 +/obj/effect/floor_decal/corner/red/diagonal{ + dir = 4 }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/obj/effect/floor_decal/corner/red/diagonal, +/obj/structure/window/reinforced{ + health = 1e+007 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lw" = ( -/obj/structure/closet/firecloset, -/obj/effect/floor_decal/industrial/warning, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lx" = ( -/obj/structure/closet/firecloset, -/obj/effect/floor_decal/industrial/warning{ - dir = 6 +/turf/simulated/floor/reinforced/nitrogen, +/area/ministation/atmospherics) +"ly" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastinterior" }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lz" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/science) -"lA" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/effect/floor_decal/corner/purple, +/turf/simulated/floor/plating, +/area/ministation/smcontrol) +"lA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 + dir = 9 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "lB" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/purple{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/disposaloutlet{ dir = 4 }, -/obj/effect/floor_decal/corner/purple{ +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/structure/sign/department/xenoflora{ - pixel_y = -32 +/obj/machinery/conveyor{ + dir = 4; + id_tag = "trash_sort" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/turf/simulated/floor/plating, +/area/ministation/trash) +"lC" = ( +/obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -23 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lF" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lG" = ( -/obj/machinery/light, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lH" = ( -/obj/machinery/recharge_station, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"lI" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/structure/bed/chair, -/obj/machinery/status_display{ - pixel_x = -32 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"lJ" = ( -/obj/structure/bed/chair, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"lK" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/closet/crate/bin/ministation, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 + dir = 9 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"lL" = ( -/obj/machinery/vending/snack, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) +/area/ministation/eva) "lM" = ( -/obj/machinery/vending/cola, -/obj/machinery/atmospherics/pipe/simple/hidden{ +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "westatmos_airlock_exterior" + }, +/obj/machinery/button/access/interior{ + id_tag = "westatmos_airlock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"lN" = ( -/obj/machinery/space_heater, -/turf/simulated/floor/plating, -/area/ministation/maint/w) +/turf/simulated/floor/airless, +/area/ministation/maint/westatmos) "lO" = ( /obj/machinery/door/airlock/external/glass{ autoset_access = 0; @@ -4633,2128 +2486,1399 @@ /obj/machinery/button/access/interior{ id_tag = "sat1_airlock"; name = "exterior access button"; - pixel_x = -10; - pixel_y = 20; + pixel_y = 24; command = "cycle_exterior" }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"lP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"lQ" = ( -/obj/structure/rack{ - dir = 1 - }, -/obj/item/borg/sight/meson, -/obj/item/clothing/mask/gas/budget, -/turf/simulated/floor/plating, -/area/ministation/maint/w) "lR" = ( -/obj/structure/rack{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/chems/spray/extinguisher, -/obj/item/clothing/head/hardhat/red, -/obj/random/gloves, /turf/simulated/floor/plating, -/area/ministation/maint/w) +/area/ministation/ai_sat) "lS" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"lT" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, +"lW" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"lU" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/commons) -"lV" = ( -/obj/structure/closet/medical_wall/ministation{ - pixel_y = -32 - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"lW" = ( -/obj/machinery/computer/modular/preset/civilian{ - dir = 1 - }, -/obj/machinery/light, +/obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/tiled, -/area/ministation/commons) +/area/ministation/hall/s1) "lX" = ( -/obj/structure/table/woodentable, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/pen, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"lY" = ( -/obj/structure/closet/wardrobe/mixed, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"lZ" = ( -/obj/structure/closet, -/obj/item/clothing/under/owl, -/obj/item/clothing/mask/gas/owl_mask, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) +/turf/simulated/wall, +/area/ministation/ai_sat) "ma" = ( -/obj/structure/table/woodentable, -/obj/item/paicard, -/obj/random/coin, -/obj/machinery/recharger, -/turf/simulated/floor/tiled, -/area/ministation/commons) +/obj/machinery/atmospherics/omni/filter{ + tag_east = 1; + tag_north = 3; + tag_south = 4; + tag_west = 2 + }, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) "mb" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastexterior" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"mc" = ( -/obj/machinery/vending/coffee{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) +/area/ministation/supermatter) "md" = ( -/obj/machinery/vending/cigarette{ - dir = 1 +/obj/machinery/meter, +/obj/effect/floor_decal/corner/blue{ + dir = 9 }, -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) "me" = ( -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"mf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = 6; + pixel_y = -5 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass/science, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/obj/item/multitool, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled, +/area/ministation/cargo) "mg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/item/radio/intercom{ name = "Common Channel"; - pixel_y = 25 + pixel_y = 20 }, /obj/structure/displaycase, /obj/item/toy/shipmodel, -/turf/simulated/floor/tiled, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) -"mh" = ( +"ml" = ( /obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"mi" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"mj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 6 }, +/obj/structure/tank_rack/oxygen, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"mk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/area/ministation/eva) +"mn" = ( +/obj/machinery/atmospherics/binary/pump{ + name = "waste pump" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"mo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"mp" = ( -/obj/machinery/light/small{ - dir = 4 +/area/ministation/supermatter) +"mq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/portables_connector{ - dir = 8 +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" }, -/obj/machinery/portable_atmospherics/powered/pump, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"mq" = ( -/turf/simulated/wall, -/area/ministation/maint/w) +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) "mr" = ( /obj/machinery/light{ dir = 8; icon_state = "tube1" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/ministation/hall/n) "ms" = ( /turf/simulated/wall, -/area/ministation/hall/s) -"mv" = ( +/area/ministation/hall/s1) +"mu" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/maint/e) +/area/space) +"mv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) "mw" = ( -/obj/machinery/vending/assist/ministation, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"mx" = ( -/obj/machinery/vending/tool, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"my" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/science) +/area/ministation/ai_sat) "mz" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/ministation/science) -"mA" = ( -/obj/machinery/seed_extractor, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mB" = ( -/obj/machinery/botany/editor, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/area/ministation/trash) "mC" = ( -/obj/machinery/botany/extractor, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mD" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/biogenerator, -/obj/effect/floor_decal/corner/purple{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 5 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/engine) +"mH" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/purple{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mF" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/vending/hydronutrients, -/obj/effect/floor_decal/corner/purple{ - dir = 1 + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"mN" = ( +/obj/machinery/camera/network/ministation/sat{ + dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mG" = ( -/obj/structure/table, -/obj/item/scanner/gas, -/obj/item/wrench, -/obj/item/minihoe, -/obj/item/hatchet, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/machinery/camera/network/research, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mH" = ( -/obj/machinery/atmospherics/portables_connector, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"mI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"mJ" = ( -/turf/simulated/floor/reinforced, -/area/ministation/science) -"mK" = ( -/obj/machinery/portable_atmospherics/hydroponics/soil, -/turf/simulated/floor/grass, -/area/ministation/science) -"mL" = ( -/obj/structure/table/woodentable, -/obj/item/eftpos, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"mM" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1 - }, -/obj/machinery/suit_cycler/ministation, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"mO" = ( -/obj/abstract/landmark/latejoin, /turf/simulated/floor/plating, -/area/ministation/hall/w) +/area/ministation/ai_sat) "mP" = ( -/obj/machinery/door/airlock/external{ - name = "Arrival Airlock"; - autoset_access = 0 +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "l1ne_airlock_interior" }, -/turf/simulated/floor/plating, -/area/ministation/hall/w) -"mQ" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"mR" = ( -/obj/effect/floor_decal/industrial/loading{ +/obj/machinery/button/access/interior{ + id_tag = "l1ne_airlock"; + name = "interior access button"; + pixel_x = 20; dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) "mS" = ( /turf/simulated/floor/tiled, -/area/ministation/hall/w) +/area/ministation/janitor) +"mT" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 4 + }, +/turf/space, +/area/space) "mV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/ministation/engine) "mW" = ( -/obj/effect/floor_decal/corner/beige{ - dir = 5 - }, /obj/machinery/atmospherics/portables_connector, /obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/tiled, /area/ministation/cargo) -"mY" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/powered/pump, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"mZ" = ( -/obj/machinery/network/relay, -/turf/simulated/floor/plating, -/area/ministation/maint/w) "na" = ( -/obj/effect/floor_decal/industrial/custodial{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) "nb" = ( -/obj/machinery/conveyor{ - dir = 4; - id_tag = "recycler" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nc" = ( -/obj/machinery/material_processing/compressor, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nd" = ( -/obj/machinery/conveyor{ - dir = 9; - id_tag = "recycler" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) +/turf/simulated/floor/tiled, +/area/ministation/cargo) "ne" = ( -/obj/machinery/material_processing/stacker, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nf" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/commons) +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "ng" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/hygiene/toilet{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nh" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/window/reinforced/tinted, +/obj/structure/window/reinforced/tinted{ + dir = 4; + icon_state = "twindow" }, -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/w) +/obj/structure/window/reinforced/tinted{ + dir = 8; + icon_state = "twindow" + }, +/obj/effect/decal/cleanable/dirt, +/obj/random_multi/single_item/captains_spare_id, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) "ni" = ( /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/cable{ - icon_state = "1-4" - }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, /area/ministation/hall/n) "nj" = ( -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/simulated/floor/bluegrid, -/area/ministation/bridge/vault) -"nk" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"nl" = ( -/turf/simulated/wall/r_wall, -/area/ministation/eva) -"nm" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"nn" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "_West APC"; - pixel_x = -25 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"no" = ( -/obj/machinery/power/apc{ +/obj/structure/disposalpipe/segment{ dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-2" + icon_state = "pipe-c" }, -/turf/simulated/floor/plating, -/area/ministation/hall/n) -"np" = ( /obj/machinery/alarm{ - pixel_y = 23 + dir = 1; + pixel_y = -21 }, -/turf/simulated/floor/plating, -/area/ministation/hall/n) -"nq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"nk" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"nr" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +/area/ministation/maint/l1central) +"nn" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" }, -/obj/structure/table, -/obj/item/storage/box/syringes, -/obj/item/storage/box/botanydisk, -/obj/item/chems/glass/beaker/large, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ns" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ +/obj/structure/sign/warning/vent_port{ dir = 1; - level = 2 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"nt" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 + pixel_y = -34 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) +/obj/machinery/atmospherics/pipe/manifold/visible/black, +/turf/simulated/floor/plating, +/area/ministation/supermatter) "nu" = ( -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 5 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"nv" = ( -/obj/machinery/door/window/westleft, -/obj/machinery/door/window/eastleft, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 +/obj/structure/closet, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, -/turf/simulated/floor/reinforced, -/area/ministation/science) +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) "nw" = ( -/obj/machinery/atmospherics/unary/vent_pump{ +/obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/reinforced, -/area/ministation/science) -"nx" = ( -/obj/machinery/camera/autoname, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/floor_decal/industrial/warning{ +/obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/suit_cycler/ministation, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"ny" = ( -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 - }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/unary/outlet_injector{ + dir = 8; + icon_state = "map_injector"; + id_tag = "n2_in"; + use_power = 1 }, -/obj/machinery/suit_cycler/ministation, -/turf/simulated/floor/tiled, -/area/ministation/eva) +/turf/simulated/floor/reinforced/nitrogen, +/area/ministation/atmospherics) +"nx" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) "nz" = ( /obj/machinery/suit_cycler/engineering/ministation, -/turf/simulated/floor/tiled, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) "nA" = ( /obj/machinery/light/small{ dir = 1 }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"nB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"nC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"nD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"nE" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/item/clothing/glasses/meson, -/obj/item/flashlight, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"nI" = ( -/obj/effect/floor_decal/industrial/custodial/corner{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 +/area/ministation/maint/westatmos) +"nD" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nJ" = ( +/turf/space, +/area/space) +"nE" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"nG" = ( /obj/effect/floor_decal/industrial/custodial{ dir = 1 }, /obj/structure/railing/mapped{ dir = 1 }, -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nK" = ( -/obj/structure/grille, -/obj/structure/wall_frame, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nL" = ( -/obj/machinery/conveyor{ - id_tag = "recycler" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nM" = ( /obj/machinery/conveyor_switch/oneway{ id_tag = "recycler"; name = "recycler conveyor" }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"nN" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ +/area/ministation/trash) +"nH" = ( +/obj/structure/railing/mapped, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"nO" = ( -/obj/structure/table, -/obj/effect/floor_decal/industrial/warning{ - dir = 9 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"nR" = ( +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ + dir = 8 }, -/obj/item/blueprints, -/obj/item/cell, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"nP" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/obj/machinery/space_heater, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"nS" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/closet/crate, -/obj/item/stack/material/shiny/mapped/aluminium/fifty, -/obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/reinforced/mapped/plasteel/fifty, -/obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/pane/mapped/glass/fifty, -/obj/item/stack/material/reinforced/mapped/fiberglass/fifty, -/obj/item/stack/material/pane/mapped/rglass/fifty, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"nQ" = ( -/obj/machinery/door/airlock/hatch/maintenance, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"nY" = ( +/obj/machinery/airlock_sensor{ + id_tag = "westatmos_sensor"; + pixel_y = 4; + pixel_x = -20; dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"nR" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "westatmos_airlock"; + pixel_y = -4; + tag_airpump = "westatmos_vent"; + tag_chamber_sensor = "westatmos_sensor"; + tag_exterior_door = "westatmos_airlock_exterior"; + tag_interior_door = "westatmos_airlock_interior"; + dir = 4; + pixel_x = -20 }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"nS" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"nT" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/area/ministation/maint/westatmos) +"ob" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"nU" = ( -/obj/structure/tank_rack/oxygen, -/obj/effect/floor_decal/industrial/warning{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"nV" = ( -/obj/machinery/light/small{ +/obj/structure/undies_wardrobe, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"oc" = ( +/obj/structure/table/woodentable, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"od" = ( +/obj/structure/bed/chair/comfy/black, +/obj/machinery/light, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"oi" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"nW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"nX" = ( -/obj/abstract/landmark{ - name = "blobstart" +/turf/simulated/floor, +/area/ministation/maint/westatmos) +"ow" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"nZ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"oa" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/firedoor{ +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"oy" = ( +/turf/simulated/wall/r_wall, +/area/ministation/smcontrol) +"oC" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 8 }, -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/science) -"ob" = ( +/turf/space, +/area/space) +"oE" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"oc" = ( /obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"od" = ( -/obj/machinery/computer/air_control{ - dir = 8; - id_tag = "xenobot"; - name = "Xenoflora Gas Monitor" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"oe" = ( -/obj/machinery/air_sensor{ - id_tag = "xenobot"; - name = "Xenoflora Gas Sensor" - }, -/turf/simulated/floor/reinforced, -/area/ministation/science) -"of" = ( -/obj/machinery/camera/autoname{ - dir = 4 - }, -/obj/machinery/commsrelay, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"og" = ( -/obj/machinery/door/airlock/glass/command{ - autoset_access = 0; - name = "Telecommunications glass airlock"; - req_access = list("ACCESS_TELECOMS") - }, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"oh" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/machinery/embedded_controller/radio/airlock/docking_port{ - dir = 4; - id_tag = "station1"; - tag_airpump = "escape1_vent"; - tag_chamber_sensor = "escape1_sensor"; - tag_exterior_door = "escape1_airlock_exterior"; - tag_interior_door = "escape1_airlock_interior"; - pixel_x = -20 + icon_state = "2-4" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"oi" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/glass/command, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"oj" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/eva) +"oF" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor, +/area/ministation/engine) +"oI" = ( +/obj/abstract/landmark/start{ + name = "Janitor" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/item/stool, +/turf/simulated/floor/tiled, +/area/ministation/janitor) +"oK" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + name = "SM APC"; + pixel_x = -27; + pixel_y = null; dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/hidden/green, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ok" = ( +/area/ministation/supermatter) +"oM" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/machinery/power/smes/buildable/max_cap_in_out, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"oO" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastinterior" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ol" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/door/firedoor{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/smcontrol) +"oS" = ( +/obj/effect/floor_decal/corner/red{ + dir = 5 }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"oV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"om" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"oX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"pa" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"on" = ( -/obj/effect/floor_decal/industrial/custodial{ - dir = 1 +/area/ministation/maint/l1ne) +"pe" = ( +/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"pf" = ( +/obj/machinery/shieldgen, +/turf/simulated/floor/plating, +/area/ministation/engine) +"ph" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"oo" = ( -/obj/effect/floor_decal/industrial/custodial/corner{ +/area/ministation/engine) +"pi" = ( +/obj/structure/window/reinforced{ dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"op" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"oq" = ( -/obj/machinery/door/airlock/glass, +/turf/simulated/floor/reinforced/airmix, +/area/ministation/atmospherics) +"po" = ( /obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"or" = ( +"pr" = ( +/obj/machinery/door/airlock/glass, /obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"os" = ( -/obj/structure/table, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/item/clothing/head/welding, -/obj/machinery/recharger, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"ot" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"ou" = ( -/turf/simulated/floor/tiled, -/area/ministation/eva) -"ov" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"ow" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/floor_decal/industrial/warning{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"ox" = ( +"ps" = ( +/obj/structure/ladder, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"px" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"oy" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"pz" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"oz" = ( -/turf/simulated/wall, -/area/ministation/medical) -"oA" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"oB" = ( -/obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/floor_decal/corner/green/full, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"oC" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/chems/glass/bucket, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"oD" = ( +/area/ministation/cargo) +"pB" = ( /obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor, -/area/ministation/science) -"oE" = ( -/obj/machinery/light, -/turf/simulated/floor/reinforced, -/area/ministation/science) -"oF" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastinterior" }, -/obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, -/area/ministation/telecomms) -"oG" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/area/ministation/smcontrol) +"pJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/structure/closet/crate, -/obj/item/stock_parts/circuitboard/telecomms_hub, -/obj/item/cell, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"oH" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"pQ" = ( +/obj/machinery/atmospherics/pipe/simple/visible/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + dir = 5 + }, +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"oI" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"pS" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/vehicle/train/cargo/trolley, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"oJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 +/area/ministation/cargo) +"pV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 +/turf/simulated/floor/plating, +/area/ministation/engine) +"pZ" = ( +/obj/effect/floor_decal/industrial/custodial/corner{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"oK" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; - dir = 8 + pixel_x = -24 }, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"oL" = ( +/area/ministation/trash) +"qa" = ( +/obj/machinery/door/airlock/hatch/maintenance, /obj/structure/cable{ icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"oM" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/janitor) -"oN" = ( -/turf/simulated/wall, -/area/ministation/janitor) -"oQ" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/table/woodentable, -/obj/item/stack/material/panel/mapped/plastic/ten, -/obj/item/stack/material/plank/mapped/wood/ten, -/obj/item/stack/material/plank/mapped/wood/ten, -/obj/item/stack/material/panel/mapped/plastic/ten, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"oR" = ( -/obj/machinery/light/small, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"oS" = ( -/mob/living/simple_animal/mouse, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"oT" = ( +/area/ministation/cargo) +"qb" = ( /obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"oU" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/multitool, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/item/clothing/gloves/insulated, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"oV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"oW" = ( -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"oX" = ( -/obj/item/pen, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"oY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"oZ" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/floor_decal/industrial/warning{ - dir = 4 + pixel_y = 24 }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"pa" = ( +/turf/simulated/floor/pool, +/area/ministation/dorms) +"qd" = ( +/obj/machinery/door/airlock/hatch/maintenance, /obj/structure/cable{ icon_state = "1-2" }, -/mob/living/simple_animal/mouse, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"qe" = ( +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"qf" = ( +/obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"pb" = ( +/area/ministation/supermatter) +"qr" = ( /obj/structure/closet, /obj/random/maintenance, +/obj/item/clothing/accessory/toggleable/hawaii, +/obj/random/gloves, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"pc" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "_East APC"; - pixel_x = 27; - pixel_y = 2 +/area/ministation/maint/l1ne) +"qt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/structure/table/woodentable, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 }, -/turf/simulated/floor/plating, -/area/ministation/medical) -"pd" = ( -/obj/structure/flora/pottedplant/flower, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pe" = ( -/obj/item/stool/padded, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pf" = ( -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/obj/item/pen, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/stool/padded, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pg" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 - }, -/area/ministation/cafe) -"ph" = ( +/obj/item/poster, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"qu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/camera/autoname{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, /obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"pi" = ( -/obj/machinery/power/apc{ dir = 8; - name = "_West APC"; - pixel_x = -25 + icon_state = "tube1" }, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"qA" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/turf/simulated/floor/plating, -/area/ministation/hall/w) -"pj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"qD" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" + }, +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"qG" = ( +/obj/effect/floor_decal/industrial/custodial/corner{ + dir = 1 }, +/turf/simulated/floor/plating, +/area/ministation/trash) +"qI" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-2" }, -/obj/machinery/light/small, -/obj/machinery/atmospherics/portables_connector{ +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"qL" = ( +/obj/machinery/camera/network/engineering{ + name = "SM West"; dir = 8 }, -/obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"pk" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "_East APC"; - pixel_x = 27; - pixel_y = 2 +/area/ministation/supermatter) +"qM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/janitor) -"pl" = ( -/obj/machinery/light{ +/area/ministation/maint/l1ne) +"qN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"qO" = ( +/obj/machinery/alarm{ dir = 8; - icon_state = "tube1" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 + pixel_x = 24 }, -/obj/structure/closet/jcloset, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/janitor) -"pm" = ( +/area/ministation/hall/n) +"qP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 - }, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"pn" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/camera/autoname, -/obj/item/chems/spray/cleaner, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"po" = ( -/obj/structure/table, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/storage/box/lights/mixed, -/obj/item/grenade/chem_grenade/cleaner, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"pp" = ( -/obj/effect/decal/cleanable/blood/oil, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/door/airlock/hatch/maintenance, /turf/simulated/floor/plating, -/area/ministation/maint/ne) -"pq" = ( -/obj/machinery/atmospherics/portables_connector{ +/area/ministation/maint/westatmos) +"qQ" = ( +/obj/structure/railing/mapped{ dir = 1 }, -/obj/machinery/portable_atmospherics/powered/scrubber, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"pr" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"ps" = ( +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"qY" = ( +/obj/structure/lattice, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 9 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"pt" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "_East APC"; - pixel_x = 27; - pixel_y = 2 +/turf/space, +/area/space) +"rb" = ( +/obj/machinery/light{ + dir = 8 }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"rc" = ( /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/hall/s) -"pu" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/chems/spray/extinguisher, -/obj/effect/floor_decal/industrial/warning{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"pv" = ( -/obj/effect/floor_decal/industrial/warning, -/obj/item/storage/firstaid/regular{ - pixel_x = 6; - pixel_y = -5 - }, -/obj/structure/table, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 + dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"pw" = ( -/obj/effect/floor_decal/industrial/warning/corner{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"rd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"px" = ( -/obj/effect/floor_decal/industrial/warning/corner, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/alarm{ + pixel_y = 23 }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"py" = ( -/obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"re" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"rf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"pz" = ( -/obj/structure/rack{ - dir = 8 + dir = 4 }, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide, /obj/effect/floor_decal/industrial/warning{ - dir = 6 - }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/shoes/magboots, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"pA" = ( -/obj/machinery/power/apc{ - name = "_South APC"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/hall/e) -"pB" = ( -/obj/machinery/alarm{ dir = 1; - pixel_y = -22 + icon_state = "warning" }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"rn" = ( +/obj/machinery/light/small, /obj/structure/cable{ icon_state = "1-8" }, /turf/simulated/floor/plating, -/area/ministation/hall/e) -"pC" = ( -/obj/machinery/space_heater, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"pD" = ( -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pE" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"pF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/area/ministation/maint/l1central) +"rp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"pG" = ( -/obj/item/sign/diploma/fake/medical{ - pixel_y = 31 - }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"rq" = ( +/obj/machinery/door/airlock/glass/engineering, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"pH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/item/stool/padded, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"pI" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"ru" = ( +/obj/effect/floor_decal/corner/white{ + dir = 6 }, -/obj/item/stool/padded, -/obj/machinery/light{ +/obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/meter, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"rz" = ( +/obj/machinery/conveyor{ + dir = 8; + id_tag = "trash_sort" }, -/turf/simulated/wall, -/area/ministation/medical) -"pK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/body_scan_display{ - pixel_y = 20 +/turf/simulated/floor/plating, +/area/ministation/trash) +"rA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/bodyscanner{ - dir = 8 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"rD" = ( +/obj/structure/table, +/obj/item/radio/intercom/locked{ + pixel_y = 20 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pL" = ( +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"rH" = ( +/obj/machinery/door/airlock, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/body_scanconsole{ +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"rI" = ( +/obj/structure/bed/chair/comfy/black{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 }, -/obj/machinery/light{ - dir = 1 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"rQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/table, -/obj/item/storage/box/masks, -/obj/item/storage/box/gloves, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"rT" = ( +/obj/machinery/conveyor{ + id_tag = "recycler" + }, +/turf/simulated/floor/plating, +/area/ministation/trash) +"rU" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/closet/secure_closet/engineering_chief, +/turf/simulated/floor/carpet/orange, +/area/ministation/engine) +"sb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/vending/medical{ - pixel_x = -2 +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"sc" = ( +/obj/abstract/turbolift_spawner/ministation{ + dir = 1; + icon_state = "" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/turf/simulated/floor, +/area/ministation/hall/s1) +"sf" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/camera/network/medbay, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pP" = ( -/obj/structure/table, -/obj/item/surgicaldrill, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pQ" = ( -/obj/structure/table, -/obj/item/hemostat, -/obj/item/retractor, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pR" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 +/obj/machinery/door/airlock/external/glass{ + locked = 1; + id_tag = "stern_engineering_airlock_exterior"; + autoset_access = 0 }, -/obj/item/circular_saw, -/obj/machinery/light{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/visible/black, +/turf/simulated/floor/plating, +/area/ministation/engine) +"sh" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pS" = ( -/obj/structure/table, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/item/bonesetter, -/obj/item/bonegel, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pT" = ( -/obj/structure/table, -/obj/item/cautery{ - pixel_x = 4 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/obj/item/sutures, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"pU" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/medical) -"pV" = ( -/obj/abstract/landmark/start{ - name = "Clown" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/cafe) -"pW" = ( -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 - }, -/obj/effect/decal/cleanable/blood, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 +/area/ministation/hall/n) +"sl" = ( +/obj/machinery/atmospherics/omni/filter{ + tag_east = 1; + tag_north = 4; + tag_west = 2; + use_power = 0 }, -/area/ministation/cafe) -"pX" = ( -/obj/machinery/firealarm{ - pixel_y = 24 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/camera/autoname, -/obj/structure/closet/secure_closet/freezer/meat, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"sq" = ( +/turf/simulated/floor/pool, +/area/ministation/dorms) +"sx" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/space, +/area/space) +"sy" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/area/ministation/cafe) -"pY" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"pZ" = ( -/obj/structure/closet/l3closet/janitor, -/obj/item/grenade/chem_grenade/cleaner, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"qa" = ( +/obj/structure/closet/jcloset, /turf/simulated/floor/tiled, /area/ministation/janitor) -"qb" = ( -/obj/abstract/landmark/start{ - name = "Janitor" +"sz" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/item/stool, +/obj/machinery/camera/autoname, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, /turf/simulated/floor/tiled, /area/ministation/janitor) -"qc" = ( +"sA" = ( /obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 }, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/storage/box/lights/mixed, +/obj/item/grenade/chem_grenade/cleaner, /turf/simulated/floor/tiled, /area/ministation/janitor) -"qd" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "_West APC"; - pixel_x = -25 - }, +"sC" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"sG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"qe" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/area/ministation/maint/eastatmos) +"sJ" = ( +/obj/structure/cable{ + icon_state = "4-8" }, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"qg" = ( +/area/ministation/ai_sat) +"sK" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "4-8" + }, +/obj/structure/table, +/obj/item/stack/cable_coil, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"sO" = ( +/obj/machinery/alarm{ + pixel_y = 23 }, /obj/effect/floor_decal/industrial/warning{ - dir = 8 + dir = 1 }, -/obj/effect/wallframe_spawn/no_grille, +/obj/structure/closet/crate, +/obj/item/stack/material/shiny/mapped/aluminium/fifty, +/obj/item/stack/material/sheet/mapped/steel/fifty, +/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/reinforced/mapped/plasteel/fifty, +/obj/item/stack/material/ingot/mapped/copper/fifty, +/obj/item/stack/material/pane/mapped/glass/fifty, +/obj/item/stack/material/reinforced/mapped/fiberglass/fifty, +/obj/item/stack/material/pane/mapped/rglass/fifty, /turf/simulated/floor/tiled, /area/ministation/eva) -"qh" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/door/airlock/glass/command, -/obj/machinery/door/firedoor, +"sR" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"qi" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/status_display{ + pixel_y = -32; + dir = 1 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 4 +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"sT" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 8 }, -/obj/effect/wallframe_spawn/no_grille, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"qj" = ( -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; +/turf/simulated/floor/plating, +/area/space) +"sV" = ( +/obj/machinery/light/small{ dir = 1 }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"qk" = ( -/turf/simulated/wall, -/area/ministation/hall/e) -"ql" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/medical) -"qm" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/area/ministation/maint/l1central) +"sX" = ( +/obj/effect/floor_decal/corner/red{ dir = 4 }, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"qn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/visible/red, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"ta" = ( +/obj/machinery/shieldwallgen, +/turf/simulated/floor/plating, +/area/ministation/engine) +"tc" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/wall, +/area/ministation/dorms) +"tg" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/table, -/obj/item/book/skill/medical, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"qo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/disposalpipe/segment{ dir = 4 }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"th" = ( /obj/structure/table, -/obj/item/newspaper, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"qp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"qq" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"qr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/paleblue{ - dir = 6 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qs" = ( -/obj/machinery/door/firedoor{ +/obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/effect/floor_decal/corner/paleblue/full, -/obj/machinery/door/airlock/double/medical{ - name = "medbay airlock"; - autoset_access = 0; - id_tag = "medleave" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/item/clothing/head/welding, +/obj/machinery/recharger, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"tj" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/turf/simulated/floor/plating, +/area/space) +"tk" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qx" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qy" = ( -/obj/structure/table, -/obj/item/storage/box/gloves, -/obj/item/storage/box/masks, -/obj/item/clothing/suit/surgicalapron, -/obj/item/clothing/suit/surgicalapron, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/space, +/area/space) +"tl" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 6 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qA" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qB" = ( -/obj/structure/table, -/obj/item/chems/glass/rag, -/obj/item/trash/stick, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qC" = ( -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 - }, -/area/ministation/cafe) -"qD" = ( -/obj/effect/floor_decal/snow, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 - }, -/area/ministation/cafe) -"qE" = ( -/obj/machinery/firealarm{ - pixel_y = 32 - }, -/obj/structure/bed/chair/comfy/beige, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"qF" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/structure/bed/chair/comfy/beige, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"qG" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"qH" = ( -/obj/structure/table/woodentable, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/machinery/status_display{ - pixel_y = 32 - }, -/obj/structure/sign/warning/smoking{ - pixel_x = 32 - }, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"qI" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 +/turf/space, +/area/space) +"tm" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"qJ" = ( +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"tq" = ( /obj/item/chems/glass/bucket, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/janitor) -"qK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +"tr" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/janitor) -"qL" = ( -/obj/effect/floor_decal/industrial/loading{ +"ts" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/janitor) -"qM" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/door/firedoor{ - dir = 8 +"tt" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/janitor) -"qN" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"qO" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"qP" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"qQ" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/skele_stand, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"qR" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, -/turf/simulated/floor/plating, -/area/ministation/eva) -"qS" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, +/area/ministation/hall/s1) +"tu" = ( +/obj/structure/ore_box, /turf/simulated/floor/tiled, -/area/ministation/eva) -"qT" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/cargo) +"tv" = ( +/obj/abstract/landmark{ + name = "bluespace_a" }, +/turf/simulated/floor, +/area/ministation/hall/s1) +"tw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"qU" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/floor_decal/industrial/warning{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"qV" = ( -/obj/machinery/light/small{ +/turf/simulated/wall/r_wall, +/area/ministation/ai_upload) +"tz" = ( +/obj/structure/railing/mapped{ dir = 8 }, -/obj/structure/hygiene/toilet{ - pixel_y = 10 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"tB" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 }, -/obj/effect/decal/cleanable/vomit, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"qW" = ( -/obj/structure/hygiene/sink{ +/obj/machinery/power/apc/high{ dir = 1; - pixel_y = 25 + pixel_y = 20 }, -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"qX" = ( -/obj/structure/reagent_dispensers/water_cooler{ +/turf/simulated/floor/plating, +/area/ministation/trash) +"tD" = ( +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"qY" = ( -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"qZ" = ( -/obj/machinery/light, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"ra" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/carpet/blue2, -/area/ministation/medical) -"rb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/paleblue{ - dir = 6 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rc" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 +/obj/machinery/portable_atmospherics/canister/helium{ + start_pressure = 2559.63 }, -/obj/machinery/status_display{ - pixel_x = -32 +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"tH" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rd" = ( /obj/abstract/landmark/start{ - name = "Medical Doctor" - }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 - }, -/obj/machinery/button/alternate/door{ - dir = 4; - id_tag = "medleave"; - name = "Interior medbay doors button"; - pixel_x = -32; - pixel_y = -32 + name = "Assistant" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"re" = ( -/obj/abstract/landmark/start{ - name = "Medical Doctor" +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"tO" = ( +/obj/effect/floor_decal/carpet/blue2{ + dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rg" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/structure/closet/crate/bin/ministation, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"tU" = ( +/obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/hygiene/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"ri" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/abstract/landmark/start{ + name = "Assistant" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rk" = ( -/obj/machinery/optable, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rl" = ( -/obj/effect/decal/cleanable/blood, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rm" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/obj/structure/table/gamblingtable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/item/flashlight/lamp/green, +/obj/item/poster, +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) +"tW" = ( +/obj/machinery/door/airlock/mining, +/turf/simulated/floor/plating, +/area/ministation/cargo) +"ua" = ( +/obj/machinery/power/solar, +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ro" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/plating, +/area/space) +"ue" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/camera/network/hallway{ + dir = 8 }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"ug" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"uh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rq" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/area/ministation/hall/s1) +"ui" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"uj" = ( +/obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 2 +/obj/effect/floor_decal/corner/beige{ + dir = 9 }, +/obj/item/chems/drinks/juicebox/random, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rr" = ( -/obj/structure/table/woodentable, -/obj/item/storage/fancy/cigarettes{ - pixel_y = 2 +/area/ministation/hall/n) +"ul" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/obj/item/flame/lighter/random, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"rs" = ( -/obj/structure/table/woodentable, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/rack{ + dir = 8 }, -/obj/item/pen, -/obj/item/camera, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"rt" = ( -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"ru" = ( -/obj/structure/bed/chair/comfy/beige{ +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"um" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/light{ +/obj/effect/floor_decal/corner/red/diagonal{ dir = 4 }, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"rv" = ( +/obj/effect/floor_decal/corner/red/diagonal, +/obj/machinery/meter/turf, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/reinforced/nitrogen, +/area/ministation/atmospherics) +"un" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/visible/red, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"ur" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"us" = ( /obj/machinery/firealarm{ dir = 8; pixel_x = -24 @@ -6764,11464 +3888,8589 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled, /area/ministation/janitor) -"rw" = ( -/obj/machinery/network/requests_console{ - department = "Janitorial"; - pixel_y = -29 +"ut" = ( +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"rx" = ( -/obj/structure/closet/crate/bin/ministation, -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -23 +/obj/effect/floor_decal/industrial/warning{ + dir = 8 }, +/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/tiled, -/area/ministation/janitor) -"ry" = ( -/obj/machinery/vending/tool{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"rz" = ( -/obj/machinery/vending/assist/ministation{ - dir = 1 +/area/ministation/eva) +"uy" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 6 }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"rA" = ( -/obj/machinery/camera/autoname{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/light{ +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) +"uB" = ( +/obj/structure/tank_rack/oxygen, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"uE" = ( +/obj/effect/floor_decal/industrial/loading{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"rC" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"rD" = ( -/obj/effect/floor_decal/industrial/warning{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 + dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/eva) -"rE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 +/area/ministation/janitor) +"uG" = ( +/obj/machinery/door/airlock/atmos, +/turf/simulated/floor/tiled, +/area/ministation/smcontrol) +"uH" = ( +/obj/structure/bed/chair/comfy/black, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"uK" = ( +/turf/simulated/wall, +/area/ministation/maint/westatmos) +"uL" = ( +/obj/machinery/door/airlock/glass/engineering{ + autoset_access = 0; + req_access = list("ACCESS_CHIEF_ENGINEER") }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rF" = ( -/obj/item/soap{ - icon_state = "soap-oval" - }, -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"rG" = ( -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"rH" = ( -/obj/structure/hygiene/shower{ +/area/ministation/engine) +"uM" = ( +/obj/machinery/light/small{ dir = 8 }, -/obj/item/bikehorn/rubberducky, -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"rI" = ( -/obj/item/stool/padded, -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 +/obj/machinery/conveyor{ + id_tag = "trash_sort" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/paleblue{ - dir = 10 +/turf/simulated/floor/plating, +/area/ministation/trash) +"uS" = ( +/obj/effect/floor_decal/corner/yellow/diagonal, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/paleblue{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 }, -/obj/machinery/light{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"uT" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rL" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/structure/curtain/medical, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rM" = ( -/obj/machinery/network/requests_console{ - department = "Medbay"; - name = "Medbay RC"; - pixel_y = -30 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, -/obj/structure/closet/crate/bin/ministation, -/obj/random/trash, -/obj/item/chems/syringe, -/obj/item/trash/stick, -/obj/item/organ/internal/appendix, -/obj/effect/decal/cleanable/vomit, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rN" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"uX" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rO" = ( +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"uY" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"va" = ( +/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/pane/mapped/glass/fifty, +/obj/item/stock_parts/circuitboard/airlock_electronics, +/obj/item/stock_parts/circuitboard/airlock_electronics, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/closet/crate, +/obj/item/cell, +/obj/item/cell, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"vf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/conveyor{ + dir = 8; + id_tag = "trash_sort" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/turf/simulated/floor/plating, +/area/ministation/trash) +"vg" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/hall/s1) +"vk" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 1 + }, +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ dir = 4 }, +/obj/machinery/portable_atmospherics/powered/pump/filled, /obj/machinery/light{ - dir = 4 + dir = 4; + icon_state = "bulb1" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"vl" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/wall, -/area/ministation/medical) -"rR" = ( -/obj/machinery/vitals_monitor, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rS" = ( -/obj/structure/hygiene/sink{ +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/structure/sign/warning/radioactive{ + pixel_y = -10; dir = 4; - pixel_x = 11 + pixel_x = -34 }, -/obj/machinery/camera/network/medbay{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/green{ + dir = 6 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"rT" = ( -/obj/structure/kitchenspike, -/obj/effect/floor_decal/snow, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"vp" = ( +/turf/simulated/wall, +/area/ministation/supermatter) +"vq" = ( +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"vv" = ( +/obj/machinery/light/small{ + dir = 1 }, -/area/ministation/cafe) -"rU" = ( -/obj/machinery/light/small, -/obj/effect/floor_decal/snow, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 - }, -/area/ministation/cafe) -"rV" = ( -/obj/machinery/gibber, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 - }, -/area/ministation/cafe) -"rW" = ( -/obj/machinery/light, -/obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rX" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"vx" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"rY" = ( -/obj/structure/closet/crate/bin/ministation, -/obj/random/trash, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/carpet, -/area/ministation/hall/w) -"rZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/civilian, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"sa" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"vz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/fabricator, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"vA" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 21 + }, +/obj/machinery/camera/network/engineering{ + dir = 8; + name = "Tank Storage" }, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/door/firedoor, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"sb" = ( -/obj/structure/cable{ - icon_state = "0-4" +/area/ministation/engine) +"vC" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 5 }, -/obj/effect/floor_decal/industrial/warning{ +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/item/pen/red, +/obj/effect/floor_decal/corner/beige{ + dir = 6 + }, +/obj/machinery/button/blast_door{ + id_tag = "cargoshut"; + name = "Cargo Shutters Button"; + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stamp/cargo, +/obj/item/folder/yellow, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/tiled, -/area/ministation/eva) -"sc" = ( +/area/ministation/cargo) +"vI" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/computer/atmos_alert{ + dir = 8 }, -/obj/machinery/door/airlock/glass/command, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"vK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"sd" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/chair/wood{ + dir = 8 }, -/obj/effect/floor_decal/industrial/warning{ +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"vL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"vP" = ( +/obj/effect/floor_decal/industrial/warning/corner, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/no_grille, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/floor/tiled, /area/ministation/eva) -"se" = ( -/obj/machinery/door/airlock/civilian, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled/freezer, -/area/ministation/hall/e) -"sf" = ( -/obj/structure/closet/crate/bin/ministation, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sg" = ( -/obj/structure/bed/chair, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sh" = ( -/obj/machinery/vending/snack, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"si" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +"vV" = ( +/obj/machinery/door/airlock/glass, /obj/machinery/door/firedoor, -/obj/effect/floor_decal/corner/paleblue/full, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" - }, -/obj/machinery/door/airlock/double/medical{ - name = "Medbay Lobby airlock"; - autoset_access = 0 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor, -/obj/effect/floor_decal/corner/paleblue/full, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sk" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sm" = ( -/obj/effect/floor_decal/corner/paleblue{ - dir = 6 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sn" = ( -/obj/machinery/door/firedoor{ - dir = 8 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"vY" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/structure/bed/chair{ + dir = 4 }, -/obj/machinery/door/airlock/medical, -/obj/effect/floor_decal/corner/paleblue/full, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"so" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"wb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sq" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"wd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sr" = ( -/turf/simulated/floor/tiled/dark/monotile{ - name = "telecomms dark floor"; - temperature = 263 +/obj/structure/sign/warning/radioactive{ + pixel_y = -34; + dir = 1; + pixel_x = -8 }, -/area/ministation/telecomms) -"ss" = ( +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"we" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/network/hallway{ + dir = 4 + }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"st" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 +/area/ministation/hall/s1) +"wg" = ( +/turf/simulated/wall/r_wall, +/area/space) +"wm" = ( +/obj/structure/closet/secure_closet/quartermaster{ + req_access = list("ACCESS_MINING") }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"su" = ( +/area/ministation/cargo) +"wp" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"ws" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/camera/autoname, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sv" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"wt" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood, +/area/ministation/engine) +"wu" = ( +/obj/machinery/vending/fitness, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"wx" = ( /obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sw" = ( -/obj/structure/closet/crate/trashcart, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sy" = ( -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/machinery/camera/network/hallway{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sz" = ( -/obj/structure/cable{ - icon_state = "2-4" +/area/ministation/hall/n) +"wA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/engine) +"wB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sA" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/glass, -/obj/machinery/door/firedoor{ +/area/ministation/cargo) +"wC" = ( +/obj/structure/closet, +/obj/item/gun/launcher/foam/crossbow, +/obj/item/storage/box/foam_darts, +/obj/item/storage/box/foam_darts, +/obj/item/gun/launcher/foam/revolver, +/obj/item/gun/launcher/foam/revolver, +/obj/item/gun/launcher/foam, +/obj/item/gun/launcher/foam, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"wD" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"wJ" = ( +/obj/machinery/camera/autoname{ dir = 8 }, +/turf/simulated/floor/plating, +/area/ministation/trash) +"wK" = ( +/obj/structure/bed/padded, +/turf/simulated/floor/carpet/orange, +/area/ministation/engine) +"wM" = ( +/obj/structure/closet/emcloset, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"sC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"sD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/glass, -/obj/machinery/door/firedoor{ +/area/ministation/hall/s1) +"wN" = ( +/obj/structure/rack{ dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sF" = ( +/obj/item/storage/belt, +/obj/item/storage/belt, +/obj/item/storage/belt, +/obj/item/storage/belt, +/obj/item/storage/belt, /obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" + dir = 1; + icon_state = "tube1" }, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sG" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/cargo) +"wP" = ( +/obj/machinery/light{ + dir = 8 }, -/obj/machinery/firealarm{ - pixel_y = 32 +/obj/structure/table/steel, +/obj/item/stack/material/puck/mapped/uranium/ten, +/turf/simulated/floor/plating, +/area/ministation/engine) +"wS" = ( +/obj/machinery/status_display{ + pixel_y = -32; + dir = 1 }, +/obj/item/plunger, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sH" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/sign/department/eva{ - pixel_y = 32 +/area/ministation/janitor) +"wT" = ( +/obj/structure/closet/lasertag/blue, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"wZ" = ( +/obj/item/mollusc/barnacle{ + pixel_x = 20 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sI" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/airless, +/area/space) +"xg" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"xj" = ( +/obj/machinery/power/sensor{ + id_tag = "Engine Power"; + name = "Powernet Sensor - Engine Power" }, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sJ" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/cable/cyan{ + icon_state = "0-8" }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"xk" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Hard Storage" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sL" = ( +/turf/simulated/floor/plating, +/area/ministation/engine) +"xm" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/floor_decal/corner/lightgrey/bordercorner{ - dir = 4 - }, -/obj/effect/floor_decal/corner/lightgrey{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/sign/warning/high_voltage{ - pixel_y = 29 +/obj/abstract/landmark/start{ + name = "Assistant" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/floor_decal/corner/white/border{ - dir = 1 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 1 - }, -/obj/effect/floor_decal/corner/lightgrey/half{ - dir = 1 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"xo" = ( +/obj/machinery/emitter, +/turf/simulated/floor/plating, +/area/ministation/engine) +"xq" = ( +/obj/structure/ladder, +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"xr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/department/eva{ + pixel_y = 30 }, -/obj/effect/floor_decal/corner/lightgrey{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/area/ministation/hall/n) +"xt" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 4 }, -/obj/effect/floor_decal/corner/lightgrey{ - dir = 1 - }, -/obj/structure/sign/department/watercloset{ - pixel_y = 32 +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"xw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"xE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8; + icon_state = "warningcorner" }, /obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sQ" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 + dir = 4; + icon_state = "tube1" }, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"sR" = ( +/area/ministation/hall/s1) +"xJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/industrial/firstaid{ - dir = 8 + dir = 5 }, -/obj/effect/decal/cleanable/blood, -/obj/structure/sign/department/redcross{ - pixel_y = 32 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"sS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"xN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/paleblue{ - dir = 5 +/turf/simulated/floor/pool, +/area/ministation/dorms) +"xQ" = ( +/obj/machinery/light/small, +/obj/machinery/conveyor{ + dir = 4; + id_tag = "trash_sort" + }, +/turf/simulated/floor/plating, +/area/ministation/trash) +"xX" = ( +/obj/machinery/material_processing/compressor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"sT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 + dir = 6 }, -/obj/effect/floor_decal/corner/paleblue{ +/turf/simulated/floor/plating, +/area/ministation/trash) +"xZ" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 5 }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"sU" = ( -/obj/structure/table/reinforced, -/obj/machinery/camera/autoname, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/turf/space, +/area/space) +"yc" = ( +/obj/machinery/alarm{ + pixel_y = 23 }, -/obj/machinery/door/firedoor{ +/turf/simulated/floor/pool, +/area/ministation/dorms) +"yh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/engine) +"yi" = ( +/obj/machinery/light/small, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/obj/machinery/atmospherics/portables_connector{ dir = 8 }, -/obj/item/storage/medical_lolli_jar{ - pixel_y = 7 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"yj" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 4 }, -/obj/effect/floor_decal/corner/paleblue/full, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"yk" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ + dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sV" = ( -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 +/obj/machinery/camera/network/engineering{ + name = "SM East"; + dir = 4 }, -/obj/structure/table/reinforced, -/obj/machinery/button/blast_door{ - id_tag = "quarantine"; - name = "Infirmary Quarantine Button" - }, -/obj/machinery/button/alternate/door{ - id_tag = "medleave"; - name = "Interior medbay doors button"; - pixel_y = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sW" = ( -/obj/machinery/computer/modular/preset/medical, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sX" = ( -/obj/machinery/sleeper/standard, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sY" = ( -/obj/structure/table, -/obj/item/chems/dropper, -/obj/item/chems/glass/beaker, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"sZ" = ( -/obj/structure/table, -/obj/item/storage/box/syringes, -/obj/machinery/light, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"ta" = ( -/obj/structure/iv_drip, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tb" = ( -/obj/item/chems/ivbag/blood/AMinus, -/obj/item/chems/ivbag/blood/APlus, -/obj/item/chems/ivbag/blood/BMinus, -/obj/item/chems/ivbag/blood/BPlus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OPlus, -/obj/structure/closet/crate/freezer, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tc" = ( -/obj/structure/cable{ - icon_state = "2-4" +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"ym" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering Hard Storage" }, -/turf/simulated/floor/tiled/dark/monotile{ - name = "telecomms dark floor"; - temperature = 263 +/obj/structure/cable{ + icon_state = "1-2" }, -/area/ministation/telecomms) -"td" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/engine) +"yo" = ( +/obj/machinery/atmospherics/portables_connector, +/obj/effect/floor_decal/industrial/outline/blue, +/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup, +/turf/simulated/floor/plating, +/area/ministation/engine) +"yp" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/tiled/dark/monotile{ - name = "telecomms dark floor"; - temperature = 263 +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"yu" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 }, -/area/ministation/telecomms) -"te" = ( -/obj/machinery/light{ +/obj/structure/sign/warning/airlock{ dir = 8; - icon_state = "tube1" + pixel_x = 43 }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tf" = ( +/area/ministation/eva) +"yv" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/space) +"yx" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/floor_decal/ss13/l1, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tg" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"yz" = ( +/obj/machinery/vending/engineering{ dir = 8 }, -/obj/effect/floor_decal/ss13/l3, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"th" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/ss13/l5, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ti" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/ss13/l7, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"yC" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/effect/floor_decal/ss13/l9, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tk" = ( -/obj/effect/floor_decal/ss13/l11, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 +/area/ministation/ai_sat) +"yD" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tl" = ( -/obj/effect/floor_decal/ss13/l13, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/floor_decal/ss13/l15, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tn" = ( -/obj/abstract/landmark{ - name = "lightsout" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tp" = ( /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tq" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tr" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"yE" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ts" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"yH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tt" = ( -/obj/machinery/door/firedoor{ +/obj/abstract/landmark/start{ + name = "Assistant" + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"yL" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"tu" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, +/area/ministation/trash) +"yO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/obj/machinery/mining/brace, +/obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"tv" = ( +/area/ministation/cargo) +"yP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5; + pixel_x = 2; + pixel_y = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"yS" = ( /obj/abstract/landmark{ name = "bluespace_a" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"tw" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"tx" = ( -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/effect/wallframe_spawn/no_grille, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"ty" = ( -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tz" = ( -/obj/structure/cable{ - icon_state = "1-4" +/turf/space, +/area/space) +"yT" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"za" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/janitor) +"ze" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 5 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tC" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/light, +/obj/structure/emergency_dispenser/west, +/obj/machinery/meter, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"zg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 }, -/obj/structure/hygiene/drain, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tD" = ( -/obj/structure/cable{ - icon_state = "2-8" +/area/ministation/engine) +"zk" = ( +/obj/structure/transit_tube, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tE" = ( -/obj/abstract/landmark{ - name = "lightsout" +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tG" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 +/turf/space, +/area/ministation/engine) +"zl" = ( +/obj/machinery/light{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"zm" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"tH" = ( -/obj/effect/floor_decal/industrial/firstaid{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"zr" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"zw" = ( +/obj/structure/table/woodentable, +/obj/machinery/light{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"zy" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"tI" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"zz" = ( +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 22 }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"tJ" = ( -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"tK" = ( -/obj/structure/table/reinforced, -/obj/item/folder, -/obj/machinery/door/firedoor{ - dir = 8 +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/structure/closet/crate, +/obj/item/stack/material/brick/mapped/sandstone/five, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"zB" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/black, +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/effect/floor_decal/corner/paleblue/full, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"zH" = ( +/obj/machinery/atmospherics/omni/mixer{ + active_power_usage = 7500; + tag_east_con = 0; + tag_north = 1; + tag_north_con = 0.21; + tag_south = 1; + tag_south_con = 0.79; + tag_west = 2 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/floor_decal/corner/white{ + dir = 9 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tL" = ( -/obj/abstract/landmark/start{ - name = "Medical Doctor" +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"zJ" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"zN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/yellow/diagonal, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"zR" = ( +/obj/effect/wallframe_spawn/reinforced_borosilicate, +/obj/machinery/door/blast/regular/open{ + dir = 2; + id_tag = "SupermatterPort"; + name = "Reactor Blast Door" }, -/obj/structure/bed/chair/office/light{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"zS" = ( +/obj/machinery/door/blast/regular/open{ + dir = 2; + id_tag = "SupermatterPort"; + name = "Reactor Blast Door" }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 +/obj/effect/wallframe_spawn/reinforced_borosilicate, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"zW" = ( +/turf/simulated/wall, +/area/ministation/dorms) +"zX" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 10 }, +/turf/space, +/area/space) +"zY" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tM" = ( -/obj/abstract/landmark{ - name = "bluespace_a" +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"zZ" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ab" = ( +/obj/structure/window/reinforced{ + dir = 1 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tN" = ( -/obj/machinery/door/firedoor{ +/obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/door/airlock/medical, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/floor_decal/corner/blue/diagonal, +/obj/effect/floor_decal/corner/blue/diagonal{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tO" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/meter/turf, +/turf/simulated/floor/reinforced/oxygen, +/area/ministation/atmospherics) +"Ad" = ( +/obj/structure/rack{ + dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"tP" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/storage/belt/utility, +/obj/item/wrench, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"tQ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"tR" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ae" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 +/obj/machinery/camera/network/engineering{ + name = "Office"; + dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Ai" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/machinery/washing_machine, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Aj" = ( +/obj/machinery/light{ + dir = 1 }, +/obj/machinery/vending/coffee, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"tS" = ( -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 +/area/ministation/hall/s1) +"Ak" = ( +/obj/structure/table/gamblingtable, +/obj/machinery/chemical_dispenser/bar_soft/full, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Al" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/mouse/brown/Tom, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"tT" = ( -/obj/machinery/atmospherics/unary/freezer{ - dir = 8; - set_temperature = 263 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"tU" = ( -/obj/structure/cable{ - icon_state = "1-8" +/turf/simulated/floor/pool, +/area/ministation/dorms) +"Am" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 }, -/turf/simulated/floor/tiled/dark/monotile{ - name = "telecomms dark floor"; - temperature = 263 +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"Ao" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/ministation/telecomms) -"tV" = ( -/obj/machinery/network/router, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Aq" = ( +/obj/structure/rack{ + dir = 8 }, -/area/ministation/telecomms) -"tW" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/storage/belt/utility, +/obj/item/wrench, +/obj/item/weldingtool, +/obj/item/clothing/head/welding/engie, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/effect/floor_decal/ss13/l2, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/floor_decal/ss13/l4, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ar" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, -/obj/effect/floor_decal/ss13/l6, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"tZ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/effect/floor_decal/ss13/l8, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ua" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"As" = ( +/obj/machinery/alarm{ + pixel_y = 21 }, -/obj/abstract/landmark{ - name = "bluespace_a" +/obj/structure/cable/cyan{ + icon_state = "2-8" }, -/obj/effect/floor_decal/ss13/l10, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ub" = ( +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Ax" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, -/obj/effect/floor_decal/ss13/l12, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uc" = ( +/area/ministation/eva) +"Az" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"AB" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/floor_decal/ss13/l14, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ud" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/door/airlock/external/glass{ + id_tag = "port_engineering_airlock_exterior"; + locked = 1; + autoset_access = 0 }, -/obj/effect/floor_decal/ss13/l16, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ue" = ( -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uf" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/machinery/button/access/interior{ + id_tag = "port_engineering_airlock"; + name = "exterior access button"; + pixel_y = 24; + command = "cycle_exterior" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ug" = ( -/obj/machinery/door/airlock/glass, -/obj/machinery/door/firedoor{ +/turf/simulated/floor/plating, +/area/ministation/engine) +"AC" = ( +/obj/structure/lattice, +/turf/simulated/wall, +/area/space) +"AD" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"AF" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"AH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"ui" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"uj" = ( -/obj/machinery/door/airlock/glass, -/obj/machinery/door/firedoor{ - dir = 8 +/area/ministation/hall/s1) +"AJ" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"ul" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/power/smes/buildable/max_cap_in_out{ + capacity = 5e+009 }, -/obj/structure/sign/double/barsign{ - dir = 1; - pixel_x = 1; - pixel_y = -63 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"AK" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"um" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/airlock_sensor{ + id_tag = "stern_engineering_sensor"; + pixel_y = 10; + pixel_x = -20; dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"un" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"AM" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"AN" = ( +/obj/machinery/conveyor{ + dir = 4; + id_tag = "recycler" }, -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"uo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/camera/autoname{ - dir = 1 +/turf/simulated/floor/plating, +/area/ministation/trash) +"AP" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastinterior" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"up" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 +/turf/simulated/floor/plating, +/area/ministation/smcontrol) +"AQ" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastinterior" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"uq" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "1-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"us" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/plating, +/area/ministation/smcontrol) +"AR" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/floor_decal/industrial/firstaid{ +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"AU" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"ut" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"uu" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/machinery/door/firedoor{ +/turf/simulated/floor/tiled, +/area/ministation/eva) +"AV" = ( +/obj/machinery/photocopier, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"AW" = ( +/obj/machinery/portable_atmospherics/canister/air/airlock, +/obj/machinery/atmospherics/portables_connector{ dir = 8 }, -/obj/effect/floor_decal/corner/paleblue/full, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" +/turf/simulated/floor, +/area/ministation/maint/westatmos) +"AX" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"uv" = ( /obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 + dir = 4; + pixel_x = 24 }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Ba" = ( +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"uw" = ( -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -23 +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"Bb" = ( +/obj/structure/railing/mapped{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"ux" = ( -/obj/machinery/newscaster{ - pixel_x = 32 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Be" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Bg" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"uy" = ( -/obj/structure/morgue, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"uA" = ( -/obj/machinery/network/mainframe, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"uB" = ( -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 }, -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uC" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Bh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uE" = ( -/obj/effect/floor_decal/industrial/loading{ +/area/ministation/ai_sat) +"Bi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uF" = ( -/obj/effect/floor_decal/industrial/hatch/yellow, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"uI" = ( /turf/simulated/wall/r_wall, -/area/ministation/hop) -"uJ" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/ai_sat) +"Bj" = ( +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 }, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"uK" = ( -/turf/simulated/wall, -/area/ministation/maint/sw) -"uL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/glass/civilian, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"uM" = ( -/obj/effect/wallframe_spawn/no_grille, -/obj/machinery/door/firedoor, /turf/simulated/floor/plating, -/area/ministation/cafe) -"uN" = ( +/area/ministation/engine) +"Bk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock/glass/civilian, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"uO" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 }, -/obj/effect/floor_decal/corner/green/half, -/obj/machinery/light{ +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Bn" = ( +/obj/effect/floor_decal/carpet/blue2{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"uP" = ( -/obj/effect/floor_decal/corner/green/half, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/area/ministation/hall/s1) +"Bo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"uS" = ( -/obj/effect/floor_decal/corner/green/half, +/area/ministation/engine) +"Bp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"uT" = ( -/obj/effect/floor_decal/industrial/firstaid{ +/area/ministation/cargo) +"Bq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/bed/chair/wood{ dir = 8 }, -/obj/machinery/light, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"uU" = ( -/obj/effect/floor_decal/corner/paleblue{ - dir = 10 +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Bt" = ( +/obj/structure/table/gamblingtable, +/turf/simulated/floor/carpet/blue2, +/area/ministation/hall/s1) +"Bu" = ( +/obj/structure/ladder, +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"uV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" +/obj/structure/cable{ + icon_state = "16-0" }, -/obj/structure/sign/warning/nosmoking_1{ - pixel_x = -32 +/obj/machinery/atmospherics/pipe/zpipe/up/supply{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"uW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/zpipe/up/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"uX" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 +/obj/structure/disposalpipe/up{ + dir = 4 }, -/obj/machinery/light/small{ +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"Bw" = ( +/obj/structure/bed/chair/comfy/black{ dir = 8 }, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"uZ" = ( -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"va" = ( -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/pane/mapped/glass/fifty, -/obj/item/stock_parts/circuitboard/airlock_electronics, -/obj/item/stock_parts/circuitboard/airlock_electronics, -/obj/structure/extinguisher_cabinet{ - pixel_x = -5; - pixel_y = 30 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Bx" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/obj/structure/closet/crate, -/obj/item/cell, -/obj/item/cell, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"vb" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"vc" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"vd" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"ve" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "hopshut"; - name = "office shutters" +/obj/structure/table/gamblingtable, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/gloves/insulated/cheap, +/obj/item/clothing/gloves/insulated/cheap, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/hop) -"vf" = ( -/obj/structure/cable{ - icon_state = "0-8" +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) +"Bz" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sat2_airlock_exterior" }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "hopshut"; - name = "office shutters" +/obj/machinery/button/access/interior{ + id_tag = "sat2_airlock"; + name = "exterior access button"; + pixel_x = -32; + pixel_y = 24; + command = "cycle_exterior" }, -/obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, -/area/ministation/hop) -"vg" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/southright, -/obj/machinery/door/firedoor, -/obj/machinery/door/blast/shutters/open{ - id_tag = "hopshut"; - name = "office shutters" +/area/ministation/ai_sat) +"BB" = ( +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ + dir = 10 }, +/obj/machinery/meter, /turf/simulated/floor/plating, -/area/ministation/hop) -"vi" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/machinery/recharger, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vj" = ( +/area/ministation/supermatter) +"BC" = ( /obj/structure/table, -/obj/item/folder/blue, -/obj/machinery/network/requests_console{ - announcementConsole = 1; - department = "Lieutenant Office"; - name = "Lieutenant RC"; - pixel_y = 30 - }, -/obj/item/storage/box/PDAs, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vk" = ( -/obj/structure/closet/crate/bin/ministation, -/obj/machinery/light{ - dir = 4 +/obj/machinery/cell_charger, +/obj/item/multitool, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 }, +/obj/item/clothing/gloves/insulated, /turf/simulated/floor/tiled, -/area/ministation/hop) -"vm" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/eva) +"BD" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"vn" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/ladder, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"vq" = ( -/obj/machinery/vending/cigarette, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vr" = ( -/obj/machinery/computer/arcade, -/obj/structure/noticeboard{ - default_pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vs" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vt" = ( -/obj/machinery/light{ - dir = 1 +/area/ministation/maint/l1ne) +"BF" = ( +/obj/machinery/atmospherics/pipe/manifold/visible{ + dir = 8 }, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/radio/intercom{ - pixel_y = 25 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"BG" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vv" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"vx" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/small{ - dir = 1 - }, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"vy" = ( -/obj/machinery/vending/boozeomat, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"vz" = ( -/obj/machinery/newscaster{ - pixel_y = 32 +/area/ministation/ai_sat) +"BM" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 9 }, -/obj/structure/table, -/obj/machinery/chemical_dispenser/bar_coffee/full, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"vA" = ( -/obj/structure/table, -/obj/machinery/chemical_dispenser/bar_soft/full, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"vB" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass/civilian, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"vC" = ( -/obj/effect/wallframe_spawn/no_grille, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"vD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft, -/obj/structure/table/reinforced, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"vE" = ( -/obj/item/synthesized_instrument/guitar, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southright, -/obj/structure/table/reinforced, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"vF" = ( -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" - }, -/obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, -/area/ministation/medical) -"vG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/southright, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" +/area/ministation/supermatter) +"BN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/medical) -"vH" = ( -/obj/structure/table, -/obj/item/chems/dropper, -/obj/item/storage/box/syringes, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"vI" = ( +/area/ministation/ai_sat) +"BP" = ( /obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/computer/modular/preset/engineering{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"vJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 6 - }, -/mob/living/simple_animal/crow{ - desc = "She's not a real doctor but she is a real bird."; - name = "Dr. Bird"; - stop_automated_movement = 0 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"vK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/airlock/medical, -/obj/effect/floor_decal/corner/paleblue/full, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"vL" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 + icon_state = "1-2" }, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"vM" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/closet/coffin, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"vN" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -32 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"vO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/plating, +/area/space) +"BQ" = ( +/obj/structure/fitness/punchingbag, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"BS" = ( /obj/machinery/light{ - dir = 8 + dir = 4; + icon_state = "bulb1" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"vP" = ( -/obj/effect/floor_decal/industrial/warning, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"vQ" = ( -/obj/machinery/light, -/obj/effect/floor_decal/industrial/warning, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"vR" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/towel, +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"BW" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/green{ + dir = 1 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"BY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"BZ" = ( +/obj/machinery/conveyor_switch/oneway{ + id_tag = "trash_sort" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"vS" = ( +/turf/simulated/floor/plating, +/area/ministation/trash) +"Ca" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/command, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Cb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vT" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/button/blast_door{ - id_tag = "hopshut"; - name = "Office Shutters Button"; - pixel_y = 30 +/obj/abstract/landmark/start{ + name = "Assistant" }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Cg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vU" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ch" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/machinery/door/airlock/highsecurity, +/turf/simulated/floor/airless, +/area/ministation/ai_upload) +"Ci" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vV" = ( -/obj/machinery/computer/modular/preset/cardslot/command{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vW" = ( -/obj/abstract/landmark/start{ - name = "Lieutenant" - }, -/obj/item/stool/padded, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vX" = ( -/obj/machinery/computer/account_database{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"vY" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/structure/bed/chair{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"vZ" = ( -/obj/structure/bed/chair/office/comfy/brown{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"wa" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"wc" = ( +/turf/simulated/floor/plating, +/area/ministation/hall/n) +"Cm" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Cn" = ( +/turf/simulated/wall, +/area/ministation/maint/eastatmos) +"Cp" = ( +/obj/machinery/ai_status_display, +/turf/simulated/wall/r_wall, +/area/ministation/ai_upload) +"Cq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"we" = ( -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"wf" = ( -/obj/effect/decal/cleanable/filth, -/obj/machinery/power/apc{ +/area/ministation/ai_sat) +"Cr" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" + level = 2 }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"wh" = ( -/obj/machinery/door/firedoor{ +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Cs" = ( +/obj/machinery/light/small{ dir = 8 }, -/obj/structure/window/basic/full, /turf/simulated/floor/plating, -/area/ministation/cafe) -"wi" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"wj" = ( -/obj/item/stool/padded, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"wk" = ( -/obj/item/stool/padded, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"wl" = ( +/area/ministation/ai_sat) +"Ct" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"wm" = ( -/obj/item/stool/bar/padded, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"wn" = ( -/obj/structure/table/marble, -/obj/structure/sign/painting/monkey_painting{ - pixel_y = 24 - }, -/obj/machinery/door/firedoor{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Cv" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 }, -/obj/item/sticky_pad{ - pixel_x = -8; - pixel_y = 1 +/turf/simulated/floor/plating, +/area/ministation/engine) +"Cw" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "barshut"; - name = "bar shutters" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/light_switch{ - pixel_x = -5; - pixel_y = 35 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Cx" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"wo" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/button/blast_door{ - id_tag = "barshut"; - name = "Bar Shutters Button"; - pixel_x = -24; - pixel_y = 36 +/obj/machinery/door/airlock/highsecurity/bolted, +/turf/simulated/floor/plating, +/area/ministation/ai_core) +"Cy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Cz" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 5 }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"wp" = ( -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"wq" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"wr" = ( -/obj/machinery/door/window/brigdoor/westleft, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor{ +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"CA" = ( +/obj/effect/floor_decal/industrial/warning/corner{ dir = 8 }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "barshut"; - name = "bar shutters" - }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"ws" = ( -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"wt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"wu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"wv" = ( -/obj/machinery/network/requests_console{ - department = "Garden"; - pixel_x = 30 +/area/ministation/eva) +"CB" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"CE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"ww" = ( -/obj/machinery/chemical_dispenser/full, -/obj/item/chems/glass/beaker/large, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wx" = ( -/obj/structure/bed/chair/office/light, -/obj/abstract/landmark/start{ - name = "Medical Doctor" +/area/ministation/hall/s1) +"CF" = ( +/obj/machinery/atmospherics/binary/pump/on, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"CG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"CH" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"CJ" = ( +/obj/machinery/atmospherics/portables_connector, +/obj/effect/floor_decal/corner/blue{ + dir = 9 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wy" = ( -/obj/machinery/chem_master, -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wz" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wA" = ( -/obj/machinery/door/firedoor{ +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"CL" = ( +/obj/structure/grille, +/obj/structure/wall_frame, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/trash) +"CN" = ( +/obj/machinery/light/small{ dir = 8 }, -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/westright, /turf/simulated/floor/plating, -/area/ministation/medical) -"wB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/area/ministation/maint/l1central) +"CQ" = ( +/obj/machinery/door/airlock/external{ + autoset_access = 0; + id_tag = "starboard_engineering_airlock_interior"; + locked = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wC" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/camera/network/medbay{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wD" = ( -/obj/machinery/hologram/holopad, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 +/obj/machinery/button/access/interior{ + id_tag = "starboard_engineering_airlock"; + name = "interior access button"; + pixel_y = 24 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"wE" = ( +/turf/simulated/floor, +/area/ministation/engine) +"CS" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, /turf/simulated/floor/tiled, -/area/ministation/hop) -"wF" = ( -/turf/simulated/floor/tiled, -/area/ministation/hop) -"wG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/area/ministation/engine) +"CV" = ( +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"wH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"CW" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"CZ" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume{ + dir = 4; + external_pressure_bound = 140; + external_pressure_bound_default = 140; + icon_state = "map_vent_out"; + use_power = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"wJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/turf/simulated/floor/airless, +/area/ministation/atmospherics) +"Da" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" }, -/mob/living/simple_animal/corgi/Ian, /turf/simulated/floor/tiled, -/area/ministation/hop) -"wK" = ( -/obj/machinery/camera/autoname{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 +/area/ministation/engine) +"Df" = ( +/obj/machinery/alarm{ + pixel_y = 22 }, /turf/simulated/floor/tiled, -/area/ministation/hop) -"wL" = ( +/area/ministation/cargo) +"Di" = ( +/obj/machinery/door/airlock/atmos, +/turf/simulated/floor/reinforced/airless, +/area/ministation/supermatter) +"Dk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/network/hallway{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"wM" = ( -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"wN" = ( -/obj/structure/table, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/kitchen/utensil/fork, -/obj/item/knife/table, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"wO" = ( -/obj/structure/table, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/chems/condiment/small/peppermill, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"wP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/stool/padded, /turf/simulated/floor/tiled, -/area/ministation/cafe) -"wQ" = ( -/obj/structure/table/marble, -/obj/item/storage/box/donut, -/obj/machinery/door/firedoor{ +/area/ministation/hall/s1) +"Dl" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "barshut"; - name = "bar shutters" +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"wR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"wS" = ( -/obj/machinery/network/requests_console{ - department = "Bar"; - pixel_x = 30 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Dm" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/table, -/obj/item/flame/lighter/zippo, -/obj/item/clothing/head/collectable/tophat, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"wT" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"wU" = ( -/obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"wV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/obj/machinery/portable_atmospherics/canister/hydrogen, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Dn" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"wW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"wX" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wY" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"wZ" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Do" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 6 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xa" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/door/firedoor{ - dir = 8 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/machinery/door/airlock/medical, -/obj/effect/floor_decal/corner/paleblue/full, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xb" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Dp" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/floor_decal/corner/paleblue{ - dir = 9 +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xc" = ( -/obj/machinery/firealarm{ - pixel_y = 24 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/structure/table, -/obj/item/defibrillator, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xd" = ( -/obj/machinery/light{ - dir = 1 +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Dq" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/table, -/obj/item/roller{ - pixel_y = 10 +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/item/roller{ - pixel_y = 10 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/item/storage/belt/medical/emt, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xe" = ( +/obj/machinery/portable_atmospherics/canister/helium, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Dr" = ( +/obj/structure/closet/firecloset, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Ds" = ( /obj/item/radio/intercom{ name = "Common Channel"; - pixel_y = 25 - }, -/obj/structure/table, -/obj/item/storage/firstaid/o2{ - pixel_x = -2; - pixel_y = 4 + pixel_y = 20 }, -/obj/item/storage/firstaid/o2{ - pixel_x = -2; - pixel_y = 4 +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xf" = ( -/obj/structure/closet/emcloset, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"xg" = ( -/obj/machinery/light{ - dir = 1 +/area/ministation/engine) +"Dt" = ( +/turf/simulated/wall, +/area/ministation/engine) +"Du" = ( +/obj/machinery/atmospherics/binary/pump/on{ + dir = 8 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"xh" = ( -/obj/machinery/vending/coffee{ - dir = 1 +/obj/machinery/light{ + dir = 1; + icon_state = "bulb1" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"xi" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 +/obj/effect/floor_decal/corner/blue{ + dir = 10 }, -/obj/structure/closet/secure_closet/hop, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"Dv" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"Dw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"xk" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"xl" = ( -/obj/machinery/photocopier, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"xm" = ( -/obj/structure/filing_cabinet/chestdrawer, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"xn" = ( -/obj/structure/table, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/chems/condiment/small/sugar, -/obj/item/chems/condiment/small/saltshaker, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xo" = ( -/obj/structure/table, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/kitchen/utensil/spoon, -/obj/item/trash/plate{ - pixel_z = -2 +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/item/trash/plate{ - pixel_w = 2 +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/item/trash/plate{ - pixel_z = 2 +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 }, -/obj/item/trash/plate{ - pixel_w = -2; - pixel_z = 4 +/obj/machinery/alarm{ + pixel_y = -24; + dir = 1 }, -/obj/item/trash/plate{ - pixel_z = 6 +/turf/simulated/floor/plating, +/area/ministation/hall/s1) +"Dx" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/stool/padded, -/obj/item/deck/cards, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xq" = ( -/obj/abstract/landmark{ - name = "bluespace_a" +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/floor_decal/corner/red/diagonal, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, -/area/ministation/cafe) -"xr" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/vomit, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xs" = ( -/obj/structure/table/marble, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "barshut"; - name = "bar shutters" - }, -/obj/item/trash/tray, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"xt" = ( -/obj/item/chems/drinks/shaker, -/obj/structure/table, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"xu" = ( +/area/ministation/hall/s1) +"Dy" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -23 - }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"xv" = ( -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" }, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"xw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/area/ministation/hall/s1) +"DB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"xx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"xy" = ( -/obj/effect/decal/cleanable/dirt, +/area/ministation/smcontrol) +"DC" = ( /turf/simulated/floor/tiled, -/area/ministation/hydro) -"xz" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "quarantine"; - name = "quarantine shutters" +/area/ministation/engine) +"DD" = ( +/turf/simulated/wall/r_wall, +/area/ministation/maint/westatmos) +"DE" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/door/window/brigdoor/eastleft, -/turf/simulated/floor/plating, -/area/ministation/medical) -"xA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 + dir = 10 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/paleblue{ - dir = 6 +/obj/machinery/light_switch{ + pixel_y = 10; + pixel_x = 21; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xC" = ( +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"DF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 6 }, -/obj/machinery/door/airlock/medical, -/obj/machinery/door/firedoor{ - dir = 8 +/turf/simulated/wall, +/area/ministation/hall/s1) +"DG" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/floor_decal/corner/paleblue{ +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"DH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xE" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"DK" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/medical) -"xH" = ( -/obj/structure/table, -/obj/item/storage/firstaid/fire{ - pixel_x = -2; - pixel_y = 4 +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/item/storage/firstaid/fire{ - pixel_x = -2; - pixel_y = 4 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"xI" = ( -/obj/structure/table, -/turf/simulated/wall/r_wall, -/area/ministation/hop) -"xJ" = ( -/turf/simulated/wall, -/area/ministation/hop) -"xK" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/door/window/southleft, +/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup, +/turf/simulated/floor/plating, +/area/ministation/engine) +"DL" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/machinery/door/airlock/command, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor, -/area/ministation/hop) -"xL" = ( -/obj/structure/table, -/obj/machinery/faxmachine, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"xM" = ( -/obj/machinery/papershredder, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"xN" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/structure/table, -/obj/machinery/recharger, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xO" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xP" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/stool/padded, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xQ" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xR" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"xT" = ( -/obj/item/stool/bar/padded, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"xU" = ( -/obj/structure/table/marble, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/door/window/southleft, +/obj/machinery/portable_atmospherics/canister/hydrogen, +/turf/simulated/floor/plating, +/area/ministation/engine) +"DM" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/door/firedoor{ +/obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "barshut"; - name = "bar shutters" - }, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"xV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/obj/machinery/door/window/southleft, +/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/effect/decal/cleanable/flour, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"xW" = ( -/obj/structure/table/marble, -/obj/machinery/status_display{ - pixel_y = -29 +/turf/simulated/floor/plating, +/area/ministation/engine) +"DN" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/machinery/door/firedoor{ +/obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/door/blast/shutters/open{ - id_tag = "barshut"; - name = "bar shutters" +/obj/machinery/door/window/southleft, +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/item/chems/condiment/ketchup, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"xX" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/plating, +/area/ministation/engine) +"DO" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/machinery/light{ +/obj/structure/window/reinforced{ dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"xY" = ( -/obj/machinery/light{ +/obj/machinery/door/window/southleft, +/obj/machinery/conveyor{ + id_tag = "CanisterStore" + }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"DP" = ( +/obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"xZ" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/closet/crate/bin/ministation, -/obj/machinery/light, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"ya" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yb" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder/juicer, -/obj/item/chems/glass/beaker, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yc" = ( -/obj/structure/table, -/obj/machinery/reagent_temperature/cooler, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yd" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/machinery/door/window/southleft, +/obj/machinery/conveyor{ + id_tag = "CanisterStore" }, -/obj/structure/table, -/obj/machinery/reagent_temperature, -/obj/machinery/camera/network/medbay{ +/obj/machinery/portable_atmospherics/canister/helium, +/turf/simulated/floor/plating, +/area/ministation/engine) +"DQ" = ( +/obj/structure/rack{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"ye" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 }, -/obj/machinery/vending/coffee{ +/obj/item/clothing/mask/gas/budget, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"DR" = ( +/obj/machinery/light{ dir = 4; - pixel_x = -5 + icon_state = "tube1" }, -/obj/machinery/light{ +/obj/machinery/camera/network/engineering{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"DT" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/closet/wardrobe/mixed, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yg" = ( -/obj/machinery/light{ +/obj/machinery/door/airlock/glass/atmos, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/engine) +"DU" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yh" = ( +/turf/simulated/floor/airless, +/area/space) +"DV" = ( /obj/structure/table, -/obj/item/storage/firstaid/toxin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/toxin{ - pixel_x = -2; - pixel_y = 4 +/obj/machinery/alarm{ + pixel_y = 23 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yl" = ( -/obj/structure/displaycase, -/obj/item/clothing/mask/gas/owl_mask{ - desc = "So realistic, you'd almost think it's the real thing."; - name = "replica 'The Owl' mask"; - pixel_x = 1; - pixel_y = -5 +/obj/machinery/recharger, +/obj/machinery/cell_charger{ + pixel_y = 14 }, -/turf/simulated/floor/carpet, -/area/ministation/hop) -"ym" = ( -/obj/structure/closet/crate/freezer/rations, -/turf/simulated/floor/tiled, -/area/ministation/bridge/vault) -"yn" = ( -/obj/structure/table/woodentable, -/obj/item/flashlight/lamp/green, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"DW" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4 }, -/obj/item/radio/intercom{ - name = "Common Channel"; +/obj/machinery/light_switch{ pixel_y = 25 }, -/turf/simulated/floor/carpet, -/area/ministation/hop) -"yp" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/closet, -/obj/random/maintenance, -/obj/random/suit, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"yq" = ( -/obj/machinery/recharge_station, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"yr" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/machinery/media/jukebox/old, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"ys" = ( -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"yt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"yu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/light, -/obj/effect/floor_decal/corner/red/diagonal, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"yv" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"yw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"yx" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"yy" = ( -/obj/item/stool/bar/padded, -/obj/machinery/light, -/turf/simulated/floor/carpet, -/area/ministation/cafe) -"yz" = ( -/obj/machinery/vending/engineering{ - dir = 8 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/simulated/floor/tiled, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) -"yA" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/effect/decal/cleanable/tomato_smudge, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"yB" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -32 - }, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"yC" = ( +"DX" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-4" }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"yD" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/obj/machinery/power/smes/buildable/max_cap_in_out{ + capacity = 5e+009; + charge = 5e+009 }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"yE" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 +/obj/machinery/camera/network/engineering{ + name = "Engineering Hub" }, -/obj/effect/floor_decal/corner/green/half{ - dir = 1 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"DY" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"yF" = ( -/obj/machinery/camera/autoname{ +/obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/structure/hygiene/sink{ - dir = 4; - pixel_x = 11 +/obj/machinery/status_display{ + pixel_y = 32 }, -/obj/item/chems/glass/bucket, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"yG" = ( -/obj/structure/closet/secure_closet/personal/patient, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yH" = ( -/obj/structure/closet/secure_closet/medical1, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yI" = ( -/obj/structure/table, -/obj/item/clothing/accessory/stethoscope, -/obj/item/chems/hypospray/vial{ - desc = "One of the first hyposprays ever made. Supposedly only a handful exist."; - name = "prototype hypospray"; - origin_tech = null - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yJ" = ( -/obj/structure/table, -/obj/item/gun/launcher/syringe, -/obj/item/flashlight/pen, -/obj/item/flashlight/pen, -/obj/item/clothing/suit/straight_jacket, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yK" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"DZ" = ( /obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/storage/firstaid/regular{ - pixel_x = -2; - pixel_y = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"yN" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"yO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"yP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5; - pixel_x = 2; - pixel_y = 1 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"yQ" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, -/turf/simulated/floor/airless, -/area/space) -"yS" = ( -/obj/abstract/landmark{ - name = "bluespace_a" +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 }, -/turf/space, -/area/space) -"yU" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 }, -/obj/structure/closet/secure_closet/hop2, -/obj/item/book/skill/organizational/finance, -/turf/simulated/floor/carpet, -/area/ministation/hop) -"yV" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/clothing/gloves/insulated, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/carpet, -/area/ministation/hop) -"yW" = ( -/obj/structure/bed, -/obj/item/bedsheet/hop, -/turf/simulated/floor/carpet, -/area/ministation/hop) -"yX" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Eb" = ( /obj/machinery/power/apc{ dir = 1; name = "_North APC"; pixel_y = 24 }, /obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/plating, -/area/ministation/hop) -"yY" = ( -/obj/machinery/alarm{ - pixel_y = 23 + icon_state = "0-8" }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/hop) -"yZ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/power/sensor{ + id_tag = "Station Power"; + name = "Powernet Sensor - Station Power" }, -/obj/structure/cable{ - icon_state = "2-4" +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ec" = ( +/obj/machinery/light, +/obj/machinery/vending/snack{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ed" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/vending/cola{ + dir = 4; + pixel_x = -5 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"za" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ee" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zb" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ef" = ( +/obj/abstract/landmark{ + name = "lightsout" }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-2" }, /obj/structure/cable{ icon_state = "2-8" }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zd" = ( -/obj/abstract/landmark/start{ - name = "Robot" +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Eg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ze" = ( -/turf/simulated/wall, -/area/ministation/maint/e) -"zf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/civilian{ - autoset_access = 0; - name = "Kitchen airlock"; - req_access = list("ACCESS_KITCHEN") +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Eh" = ( +/obj/machinery/vending/snack{ + dir = 8; + pixel_x = 5 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, /turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ei" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = -24; + dir = 1; + pixel_x = -1 + }, +/turf/simulated/floor/wood/yew, /area/ministation/engine) -"zh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/civilian{ - autoset_access = 0; - name = "Kitchen airlock"; - req_access = list("ACCESS_KITCHEN") +"Ej" = ( +/obj/machinery/conveyor_switch{ + id_tag = "CanisterStore" }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"zi" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Ek" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"El" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"zj" = ( -/obj/structure/table/glass, -/obj/item/hatchet, -/obj/item/hatchet, -/obj/item/minihoe, -/obj/item/minihoe, -/obj/item/book/skill/service/botany, +/area/ministation/engine) +"Em" = ( +/obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/tiled, -/area/ministation/hydro) -"zk" = ( +/area/ministation/engine) +"En" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Eo" = ( /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, -/area/ministation/hydro) -"zq" = ( +/area/ministation/engine) +"Eq" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-8" }, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor, -/area/ministation/hop) -"zr" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zs" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 6 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Er" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4 }, -/mob/living/simple_animal/mouse, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zt" = ( +/obj/item/stool/padded, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/abstract/landmark/start{ + name = "Atmospheric Technician" + }, +/turf/simulated/floor/wood, +/area/ministation/engine) +"Es" = ( +/obj/machinery/power/terminal{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zu" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-2" }, -/obj/machinery/atmospherics/binary/pump/on{ - dir = 4 +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zv" = ( -/obj/machinery/meter{ - use_power = 0 +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Station Engineer" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/turf/simulated/floor/wood, +/area/ministation/engine) +"Et" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Atmospheric Technician" }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/wood, +/area/ministation/engine) +"Eu" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Ev" = ( +/obj/structure/cable, +/obj/machinery/computer/air_control/supermatter_core{ + dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zx" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ew" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zy" = ( -/obj/machinery/light{ +/obj/machinery/vending/coffee{ dir = 4; - icon_state = "tube1" + pixel_x = -5 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"zz" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"zC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/window/westleft, -/obj/machinery/door/window/eastleft, -/turf/simulated/floor/tiled/steel_ridged, -/area/ministation/cafe) -"zD" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/obj/structure/hygiene/sink/kitchen{ - pixel_y = 25 +/area/ministation/hall/s1) +"Ex" = ( +/obj/machinery/vending/cigarette{ + dir = 8; + pixel_x = 5 }, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ey" = ( +/obj/machinery/fabricator/pipe/disposal, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ez" = ( +/obj/item/stool/padded, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zF" = ( -/obj/machinery/vending/dinnerware, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zG" = ( -/obj/structure/table/woodentable, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/reagentgrinder/juicer, -/obj/item/chems/glass/beaker, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zH" = ( -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 +/obj/abstract/landmark/start{ + name = "Station Engineer" }, -/obj/structure/table/woodentable, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zI" = ( -/obj/machinery/cooker/oven, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zJ" = ( -/obj/machinery/cooker/grill, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"zK" = ( -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/wood, -/area/ministation/cafe) -"zL" = ( -/obj/structure/closet/crate/bin/ministation, -/obj/machinery/light{ +/area/ministation/engine) +"EB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/floor/wood, -/area/ministation/cafe) -"zM" = ( -/obj/machinery/vending/hydronutrients{ - dir = 1 - }, -/obj/effect/floor_decal/corner/beige/half, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"zN" = ( -/obj/machinery/seed_extractor, -/obj/effect/floor_decal/corner/beige/half, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"zO" = ( -/obj/machinery/biogenerator, -/obj/effect/floor_decal/corner/beige/half, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"zP" = ( -/obj/effect/floor_decal/corner/beige/half, -/obj/machinery/vending/hydroseeds{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"zQ" = ( -/turf/simulated/wall, -/area/ministation/hydro) -"zT" = ( +/area/ministation/engine) +"EE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zU" = ( -/obj/structure/rack{ - dir = 8 +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" }, -/obj/item/tank/emergency, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zV" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/sign/department/janitor{ + dir = 4; + pixel_x = -33 }, -/obj/effect/floor_decal/industrial/warning, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 10 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"EJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zW" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/visible, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/power/apc{ +/obj/machinery/light{ dir = 8; - name = "_West APC"; - pixel_x = -25 + icon_state = "tube1" }, -/obj/structure/cable, -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/meter, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"zZ" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/closet/secure_closet/engineering_welding, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"EK" = ( +/obj/effect/decal/cleanable/blood/oil, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Aa" = ( -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"Ab" = ( -/obj/machinery/network/message_server, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"Ad" = ( -/obj/structure/rack{ - dir = 8 - }, -/obj/item/storage/belt/utility, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/engine) -"Ae" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"Af" = ( +"EL" = ( /obj/abstract/landmark/start{ - name = "Bartender" + name = "Station Engineer" }, +/obj/item/stool/padded, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Ag" = ( -/obj/abstract/landmark/start{ - name = "Bartender" - }, +/area/ministation/engine) +"EM" = ( +/obj/item/boombox, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/structure/table/woodentable_reinforced/walnut/maple, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Ah" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"Ai" = ( -/obj/effect/decal/cleanable/flour, +/area/ministation/engine) +"EN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/item/chems/chem_disp_cartridge/coffee{ + name = "coffee canister" }, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Aj" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/area/ministation/engine) +"EO" = ( +/obj/item/chems/food/old/pizza, +/obj/item/stack/material/puck/mapped/uranium/ten, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/icecream_vat, +/obj/structure/table/woodentable_reinforced/walnut/maple, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Ak" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/engine) +"EP" = ( +/obj/machinery/vending/materials{ + dir = 4 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/hydro) -"Al" = ( -/obj/structure/closet, -/obj/random/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Am" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"EQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"An" = ( -/obj/structure/cable, -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/atmospherics/pipe/simple/visible, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Ao" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 }, -/obj/machinery/atmospherics/pipe/simple/visible, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Ap" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"ER" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Aq" = ( -/obj/structure/rack{ - dir = 8 +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"ES" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/item/storage/belt/utility, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding/engie, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"ET" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/effect/floor_decal/corner/yellow/three_quarters, +/obj/structure/sign/warning/engineering_access{ + pixel_y = -32; + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Ar" = ( -/obj/structure/lattice, -/obj/machinery/meter{ - use_power = 0 +/area/ministation/hall/s1) +"EU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/yellow{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/visible, -/turf/space, -/area/space) -"As" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/hidden, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"EV" = ( +/obj/effect/floor_decal/corner/yellow/three_quarters{ + dir = 4 + }, +/obj/structure/sign/department/engineering{ + dir = 1; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"EW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/wall/r_wall, /area/ministation/engine) -"At" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +"EX" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo" +/obj/machinery/fabricator/pipe, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"EY" = ( +/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"EZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Fa" = ( +/obj/structure/closet/secure_closet/engineering_electrical{ + req_access = list("ACCESS_ENGINEERING") + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Fb" = ( +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Station Engineer" }, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Au" = ( -/obj/structure/closet/chefcloset, -/obj/item/storage/box/ammo/beanbags, -/obj/item/gun/projectile/shotgun/doublebarrel, -/obj/item/clothing/suit/storage/toggle/wintercoat/hydro, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"Av" = ( -/obj/machinery/cooker/fryer, +/area/ministation/engine) +"Fc" = ( +/obj/item/wrench, +/obj/item/clothing/gloves/insulated, +/obj/structure/table/woodentable_reinforced/walnut/maple, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Aw" = ( -/obj/machinery/camera/autoname{ - dir = 1 +/area/ministation/engine) +"Fd" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/structure/table/woodentable, -/obj/item/chems/condiment/enzyme, +/obj/item/stack/tape_roll/barricade_tape/atmos, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/item/chems/spray/cleaner, /turf/simulated/floor/wood, -/area/ministation/cafe) -"Ax" = ( -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 +/area/ministation/engine) +"Fe" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/ministation/telecomms) -"Ay" = ( -/obj/machinery/reagentgrinder, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"Az" = ( -/obj/machinery/cooker/cereal, +/obj/item/chems/drinks/glass2/coffeecup/metal, +/obj/item/chems/drinks/glass2/coffeecup/metal, +/obj/structure/table/woodentable_reinforced/walnut/maple, /turf/simulated/floor/wood, -/area/ministation/cafe) -"AA" = ( -/obj/machinery/cooker/candy, +/area/ministation/engine) +"Ff" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/opossum/poppy, +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Station Engineer" + }, /turf/simulated/floor/wood, -/area/ministation/cafe) -"AB" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "_East APC"; - pixel_x = 27; - pixel_y = 2 +/area/ministation/engine) +"Fg" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 }, -/obj/structure/cable, -/turf/simulated/floor/plating, -/area/ministation/hydro) -"AC" = ( -/turf/simulated/wall, -/area/ministation/maint/se) -"AD" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas/budget, -/obj/item/clothing/glasses/sunglasses, -/obj/random/suit, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AE" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AF" = ( -/obj/abstract/landmark{ - name = "blobstart" +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Fh" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 }, +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"Fi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AG" = ( -/obj/machinery/atmospherics/unary/outlet_injector{ - dir = 1 +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"Fj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/airless, -/area/space) -"AH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AL" = ( -/obj/machinery/network/telecomms_hub, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"AM" = ( -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"AN" = ( -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - dir = 0; - id_tag = "pfm_airlock"; - pixel_y = 24; - tag_airpump = "pfm_vent"; - tag_chamber_sensor = "pfm_sensor"; - tag_exterior_door = "pfm_airlock_exterior"; - tag_interior_door = "pfm_airlock_interior" +/obj/structure/disposalpipe/segment, +/turf/simulated/floor, +/area/ministation/engine) +"Fk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "pfm_vent" +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"Fm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/airlock_sensor{ - id_tag = "pfm_sensor"; - pixel_y = 20 +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood, +/area/ministation/engine) +"Fn" = ( +/obj/machinery/space_heater, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"AO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch/maintenance, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/cafe) -"AP" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/hydro) -"AR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AS" = ( -/obj/structure/cable{ - icon_state = "1-8" +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Fo" = ( +/obj/machinery/space_heater, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 + dir = 4 }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Fp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AT" = ( +/obj/machinery/portable_atmospherics/powered/scrubber, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Fr" = ( +/obj/structure/tank_rack/oxygen, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Fs" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ft" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 5 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"AV" = ( +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Fu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood, +/area/ministation/engine) +"Fv" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "2-4" }, -/obj/machinery/power/apc{ +/turf/simulated/floor/wood, +/area/ministation/engine) +"Fw" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/wood, +/area/ministation/engine) +"Fx" = ( +/obj/machinery/vending/engivend{ + dir = 8 + }, +/obj/effect/floor_decal/corner/yellow{ + dir = 6 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Fy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"Fz" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/floor_decal/corner/yellow/three_quarters{ + dir = 8 + }, +/obj/machinery/light{ dir = 8; - name = "_West APC"; - pixel_x = -25 + icon_state = "tube1" }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FA" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/area/ministation/telecomms) -"AW" = ( +/obj/effect/decal/cleanable/blood/oil, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/obj/machinery/power/smes/buildable/max_cap_in_out, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FB" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/floor_decal/corner/yellow/three_quarters{ + dir = 1 }, -/area/ministation/telecomms) -"AX" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/light_switch{ + pixel_y = 25 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"FD" = ( +/obj/abstract/landmark/start{ + name = "Station Engineer" }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"AY" = ( +/turf/simulated/floor/tiled, +/area/ministation/engine) +"FE" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/obj/machinery/power/solar, +/turf/simulated/floor/airless, +/area/space) +"FF" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"AZ" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 +/obj/structure/cable{ + icon_state = "2-4" }, +/turf/simulated/floor/plating, +/area/space) +"FG" = ( /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 +/obj/machinery/power/solar, +/turf/simulated/floor/airless, +/area/space) +"FH" = ( +/obj/structure/closet/secure_closet/engineering_personal{ + req_access = list("ACCESS_ENGINEERING") }, -/turf/simulated/floor/plating, -/area/ministation/cafe) -"Ba" = ( +/obj/machinery/light, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FI" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/chems/spray/extinguisher{ + pixel_x = 8 + }, +/obj/item/clothing/gloves/thick, +/obj/item/hoist_kit, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/mobile_ladder, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FJ" = ( +/obj/machinery/port_gen/pacman/super, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FK" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, -/area/ministation/cargo) -"Bb" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Bc" = ( -/obj/structure/cable{ - icon_state = "2-4" +/area/ministation/engine) +"FM" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Bd" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/obj/machinery/light/small{ - dir = 1 +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/table/gamblingtable, +/obj/machinery/recharger, +/obj/item/poster, +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) +"FN" = ( +/obj/machinery/door/firedoor{ + dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Bf" = ( -/obj/machinery/door/airlock/hatch/maintenance, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Bh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/machinery/door/airlock/civilian, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Bi" = ( +/area/ministation/janitor) +"FO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/effect/floor_decal/corner/yellow{ + dir = 10 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"Bj" = ( -/obj/machinery/airlock_sensor{ - id_tag = "escape3_sensor"; - pixel_y = 20 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "escape1_vent" +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FP" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/door/airlock/glass/engineering, +/obj/machinery/door/firedoor{ + dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/hall/w) -"Bl" = ( -/obj/structure/rack, -/obj/item/beartrap, -/obj/random/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Bm" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "sqm_airlock_interior" +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/button/access/interior{ - id_tag = "sqm_airlock"; - name = "interior access button"; - pixel_x = -10; - pixel_y = 20 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Bn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Bp" = ( -/obj/machinery/power/terminal{ - dir = 8 +/turf/simulated/floor, +/area/ministation/engine) +"FQ" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, /obj/structure/cable{ - icon_state = "0-4" - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"Bq" = ( -/obj/machinery/camera/autoname{ - dir = 4; - preset_channels = list("Exodus") - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 - }, -/area/ministation/telecomms) -"Br" = ( -/obj/machinery/light/small, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - temperature = 263 + icon_state = "4-8" }, -/area/ministation/telecomms) -"Bs" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/telecomms) -"Bt" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Bu" = ( -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Bv" = ( -/obj/structure/table, -/obj/item/folder/blue, -/obj/item/pen/blue, -/obj/item/paper/monitorkey, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Bw" = ( -/obj/machinery/computer/message_monitor, -/obj/machinery/alarm{ - pixel_y = 23 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Bx" = ( -/obj/structure/table, -/obj/item/clothing/suit/storage/toggle/wintercoat, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = 20 +/obj/effect/floor_decal/corner/yellow{ + dir = 9 }, -/obj/item/radio, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"By" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Bz" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "sat2_airlock_exterior" +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FR" = ( +/obj/abstract/landmark{ + name = "bluespace_a" }, -/obj/machinery/button/access/interior{ - id_tag = "sat2_airlock"; - name = "exterior access button"; - pixel_x = -10; - pixel_y = 20; - command = "cycle_exterior" +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BA" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"BC" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"BD" = ( -/obj/structure/table, -/obj/item/paper_bin, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"BE" = ( -/obj/structure/bed/chair/padded/blue, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"BF" = ( -/obj/machinery/atmospherics/pipe/manifold/visible{ +/obj/structure/disposalpipe/segment/bent{ dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BG" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet{ - pixel_x = 32 - }, -/obj/item/disk/nuclear, -/obj/machinery/recharger, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"BH" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FS" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"FT" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/door/airlock/glass/engineering, +/obj/machinery/door/firedoor{ + dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BI" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock/double, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BJ" = ( +/turf/simulated/floor, +/area/ministation/engine) +"FU" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"FV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BK" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 10 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BL" = ( +/turf/simulated/floor/tiled, +/area/ministation/engine) +"FW" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/tiled, +/area/ministation/engine) +"FX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BM" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"BN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 +/obj/structure/extinguisher_cabinet{ + pixel_y = -29; + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"BO" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-8" }, /turf/simulated/floor/tiled, /area/ministation/engine) -"BP" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"BQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +"FY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"BR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/obj/machinery/camera/network/engineering{ + dir = 1; + name = "Tank Storage" }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"FZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"BS" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 - }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Ga" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/turf/simulated/floor/plating, -/area/ministation/engine) -"BT" = ( -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/simulated/floor/airless, +/turf/simulated/floor/plating, /area/space) -"BU" = ( -/obj/machinery/meter, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 4 +"Gb" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/airless, -/area/ministation/atmospherics) -"BV" = ( -/obj/effect/floor_decal/industrial/custodial/corner{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gd" = ( +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 10 +/obj/machinery/conveyor{ + dir = 8; + id_tag = "trash_sort" }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"BW" = ( -/obj/abstract/landmark{ - name = "bluespace_a" - }, -/turf/simulated/wall, -/area/ministation/janitor) -"BX" = ( -/obj/machinery/meter{ - name = "Distribution Loop" +/area/ministation/trash) +"Ge" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gf" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 6 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"BY" = ( -/obj/machinery/atmospherics/pipe/manifold/visible{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gh" = ( +/obj/structure/cable{ + icon_state = "0-4" }, +/obj/machinery/power/solar, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"BZ" = ( +/area/space) +"Gi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/glass/command{ - autoset_access = 0; - name = "Telecommunications glass airlock"; - req_access = list("ACCESS_TELECOMS") +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gj" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" }, /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Ca" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "sqm_airlock_exterior" +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gk" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 4 }, -/obj/machinery/button/access/interior{ - id_tag = "sqm_airlock"; - name = "exterior access button"; - pixel_x = 10; - pixel_y = 20; - command = "cycle_exterior" +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/portable_atmospherics/canister/empty, +/obj/structure/cable/yellow{ + icon_state = "2-4" }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"Cb" = ( -/obj/machinery/alarm{ - pixel_y = 20 +/area/ministation/supermatter) +"Gl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gm" = ( +/obj/structure/lattice, +/turf/simulated/wall, +/area/ministation/engine) +"Gn" = ( +/obj/structure/cable{ + icon_state = "0-4" }, +/obj/machinery/power/smes/buildable/preset, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Gp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/plating, -/area/ministation/commons) -"Cc" = ( +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gq" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Cd" = ( -/obj/machinery/turretid{ - control_area = "\improper AI Upload Chamber"; - name = "AI Upload turret control"; - pixel_y = -25 +/obj/effect/floor_decal/corner/yellow{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gr" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Ce" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/green, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gs" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gt" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gu" = ( +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/power/smes/buildable/preset, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Gv" = ( +/obj/machinery/power/terminal{ + dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/obj/structure/sign/warning/airlock{ + pixel_x = 32; + dir = 8 }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Gw" = ( +/obj/structure/cable, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Ch" = ( +/area/space) +"Gx" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2"; + pixel_y = 1 }, -/obj/machinery/door/airlock/highsecurity, -/turf/simulated/floor/airless, -/area/ministation/ai_upload) -"Ci" = ( -/mob/living/simple_animal/mouse, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Cj" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 +/obj/machinery/power/terminal{ + dir = 1 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Ck" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Cl" = ( -/obj/machinery/camera/autoname{ - preset_channels = list("Exodus") +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 }, -/obj/machinery/firealarm{ +/obj/structure/sign/warning/airlock{ dir = 4; - pixel_x = 24 + pixel_x = -32 }, -/obj/structure/closet/emcloset, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Gy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Gz" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Cm" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cn" = ( -/turf/simulated/wall, -/area/ministation/atmospherics) -"Co" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 +/obj/effect/floor_decal/corner/yellow{ + dir = 6 }, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Cp" = ( -/obj/machinery/ai_status_display, -/turf/simulated/wall/r_wall, -/area/ministation/ai_upload) -"Cq" = ( +/area/ministation/engine) +"GA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cr" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Cs" = ( -/obj/machinery/light/small{ +/turf/simulated/floor/tiled, +/area/ministation/engine) +"GB" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/obj/structure/lattice, +/turf/space, +/area/space) +"GC" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/turf/space, +/area/space) +"GF" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 8 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Ct" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cu" = ( +/obj/structure/lattice, +/turf/space, +/area/space) +"GG" = ( /obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cv" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Station Intercom (AI Private)"; - pixel_y = -29 + icon_state = "1-2" }, /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + icon_state = "1-4" }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cw" = ( /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Cx" = ( +/area/space) +"GH" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-8" }, -/obj/machinery/door/airlock/highsecurity/bolted, /turf/simulated/floor/plating, -/area/ministation/ai_core) -"Cy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Cz" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/visible{ - dir = 5 +/area/space) +"GI" = ( +/obj/structure/cable{ + icon_state = "0-4" }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"CA" = ( +/area/space) +"GJ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"CB" = ( -/obj/machinery/hologram/holopad, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/turf/simulated/floor/plating, +/area/space) +"GL" = ( +/obj/machinery/door/airlock/civilian{ + autoset_access = 0 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/trash) +"GM" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"CC" = ( -/obj/machinery/newscaster{ - pixel_x = 32 + icon_state = "0-2"; + pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/turf/simulated/floor/plating, +/area/space) +"GN" = ( +/obj/structure/cable{ + icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"CD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/black{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/sign/warning/server_room{ - pixel_x = -32 +/turf/simulated/floor/plating, +/area/space) +"GO" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"CE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"CF" = ( -/obj/machinery/atmospherics/binary/pump/on, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"CG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"CH" = ( -/obj/machinery/portable_atmospherics/canister/air, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"CI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/area/space) +"GP" = ( +/obj/machinery/power/tracker, +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/effect/catwalk_plated, /turf/simulated/floor/plating, -/area/ministation/engine) -"CJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/catwalk_plated, +/area/space) +"GQ" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, +/obj/machinery/power/tracker, /turf/simulated/floor/plating, -/area/ministation/engine) -"CK" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"CL" = ( -/obj/structure/rack, -/obj/random/maintenance, -/obj/item/borg/sight/meson, -/obj/item/flashlight, -/obj/random/maintenance, -/obj/random/trash, -/obj/random/gloves, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"CM" = ( -/obj/machinery/recharge_station, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"CN" = ( +/area/space) +"GR" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"CO" = ( -/obj/machinery/light/small{ - dir = 4 +/area/space) +"GS" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"CP" = ( -/obj/abstract/landmark/start{ - name = "Assistant" +/area/space) +"GT" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/item/stool/padded, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, +/turf/simulated/floor/plating, +/area/space) +"GU" = ( +/obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/tiled, -/area/ministation/commons) -"CT" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/area/ministation/hall/s1) +"GV" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/machinery/door/airlock/external/glass{ + id_tag = "port_engineering_airlock_interior"; + autoset_access = 0; + locked = 1 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"CU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/door/airlock/highsecurity{ - name = "Telecommunications" - }, -/obj/machinery/door/firedoor{ - dir = 8 +/obj/machinery/button/access/interior{ + id_tag = "port_engineering_airlock"; + name = "interior access button"; + pixel_y = 24 }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"GW" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/airlock_sensor{ + id_tag = "port_engineering_sensor"; + pixel_y = 24; + pixel_x = 8 }, -/turf/simulated/floor, -/area/ministation/telecomms) -"CV" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "port_engineering_airlock"; + pixel_y = 24; + tag_airpump = "port_engineering_vent"; + tag_chamber_sensor = "port_engineering_sensor"; + tag_exterior_door = "port_engineering_airlock_exterior"; + tag_interior_door = "port_engineering_airlock_interior"; + pixel_x = -8 }, -/obj/effect/floor_decal/corner/black{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 10 }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"GX" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + icon_state = "1-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"CW" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"CY" = ( -/obj/machinery/door/airlock/glass{ - autoset_access = 0; - name = "Court Room Airlock" +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 }, -/obj/machinery/door/firedoor{ +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"GY" = ( +/obj/machinery/power/solar_control{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"GZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"Ha" = ( +/obj/item/radio/intercom{ + canhear_range = 3; + name = "Common Channel"; + pixel_x = 22; + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"CZ" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Da" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ +/obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 9 }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Db" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Dc" = ( -/obj/machinery/newscaster{ - pixel_y = 32 +/area/ministation/engine) +"Hb" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 }, -/obj/structure/table, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"De" = ( -/obj/structure/table, -/obj/item/multitool, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/machinery/light_switch{ - dir = 1; - pixel_y = -23 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Hc" = ( +/obj/structure/window/reinforced{ + dir = 1 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Df" = ( -/obj/structure/table, -/obj/item/radio, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -35 +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Hd" = ( +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/item/chems/spray/extinguisher, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Dg" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"He" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/structure/filing_cabinet/chestdrawer, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/network/requests_console{ - announcementConsole = 1; - department = "Telecoms Admin"; - name = "Telecoms RC"; - pixel_x = 30 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"Dh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/black{ +/turf/simulated/floor/plating, +/area/space) +"Hf" = ( +/obj/structure/cable, +/obj/machinery/power/solar_control{ dir = 1 }, -/obj/structure/sign/department/telecomms{ - dir = 4; - pixel_x = -32 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Hg" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/camera/network/engineering{ + name = "Port Solars" }, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Dj" = ( -/obj/random/trash, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Dk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/camera/autoname{ - dir = 4 +/area/ministation/engine) +"Hh" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor, +/area/ministation/engine) +"Hi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Dl" = ( -/obj/structure/window/reinforced{ +/area/ministation/engine) +"Hj" = ( +/obj/machinery/light/small, +/obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" - }, -/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled, /area/ministation/engine) -"Dm" = ( -/obj/structure/window/reinforced{ - dir = 8 +"Hk" = ( +/obj/structure/transit_tube{ + dir = 4; + icon_state = "Block" }, -/obj/structure/window/reinforced{ +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Hl" = ( +/obj/structure/transit_tube_pod{ dir = 4 }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/structure/transit_tube/station{ + dir = 1 }, -/obj/machinery/portable_atmospherics/canister/hydrogen, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled, /area/ministation/engine) -"Dn" = ( -/obj/structure/window/reinforced{ - dir = 8 +"Hm" = ( +/obj/structure/transit_tube, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Hn" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Ho" = ( +/obj/structure/transit_tube, +/turf/space, +/area/space) +"Hp" = ( +/obj/structure/transit_tube{ + icon_state = "E-W-Pass" }, -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/lattice, +/turf/space, +/area/space) +"Hq" = ( +/obj/structure/transit_tube{ + icon_state = "W-SE" }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/turf/space, +/area/space) +"Hr" = ( +/obj/structure/transit_tube{ + icon_state = "D-SW" }, -/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, -/turf/simulated/floor/plating, +/turf/space, +/area/space) +"Hs" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor/tiled, /area/ministation/engine) -"Do" = ( -/obj/structure/window/reinforced{ - dir = 8 +"Ht" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 }, -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Hu" = ( +/obj/effect/decal/cleanable/blood/oil, +/obj/structure/sign/warning/radioactive{ + pixel_y = 42; + pixel_x = 9 }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled, /area/ministation/engine) -"Dp" = ( -/obj/structure/window/reinforced{ +"Hv" = ( +/obj/machinery/door/firedoor{ dir = 8 }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/machinery/door/blast/regular/open{ + id_tag = "smsafetydoor" }, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled, /area/ministation/engine) -"Dq" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 +"Hw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/portable_atmospherics/canister/helium, /turf/simulated/floor/plating, -/area/ministation/engine) -"Dr" = ( -/obj/structure/closet/firecloset, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ds" = ( -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/area/ministation/ai_sat) +"Hx" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 }, /turf/simulated/floor/tiled, /area/ministation/engine) -"Dt" = ( -/turf/simulated/wall, -/area/ministation/engine) -"Du" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "pqm_airlock_exterior" - }, -/obj/machinery/button/access/interior{ - id_tag = "pqm_airlock"; - name = "exterior access button"; - pixel_x = -10; - pixel_y = 20; - command = "cycle_exterior" +"Hy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Dv" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Hz" = ( +/obj/structure/transit_tube{ + icon_state = "D-NE" }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Dw" = ( +/obj/structure/lattice, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Dx" = ( +/turf/space, +/area/space) +"HA" = ( +/obj/structure/transit_tube{ + icon_state = "S-NW" + }, +/obj/structure/lattice, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Dy" = ( +/turf/space, +/area/space) +"HB" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/item/stool, +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; dir = 4 }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HC" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"DA" = ( -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -32 +/area/ministation/engine) +"HD" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/blast/regular/open{ + id_tag = "smsafetydoor" }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"DC" = ( /turf/simulated/floor/tiled, /area/ministation/engine) -"DD" = ( -/turf/simulated/wall/r_wall, -/area/ministation/maint/sw) -"DE" = ( +"HE" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/engine) -"DF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/wall, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, /area/ministation/engine) -"DG" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" +"HF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/obj/item/stool, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/floor_decal/corner/yellow{ +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"DH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 +/area/ministation/engine) +"HH" = ( +/obj/structure/transit_tube{ + icon_state = "N-S" }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"DI" = ( -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; +/turf/space, +/area/space) +"HI" = ( +/obj/structure/table, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/circuitboard/airlock_electronics, +/obj/item/stock_parts/circuitboard/airlock_electronics, +/obj/item/scanner/gas, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HJ" = ( +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/clothing/head/earmuffs, +/obj/item/stack/material/rods/fifty, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HK" = ( +/obj/machinery/atmospherics/portables_connector{ dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"DJ" = ( +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HL" = ( +/obj/structure/cable, +/obj/machinery/power/smes/buildable/preset, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"HM" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"DK" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/sign/warning/airlock{ + dir = 1; + pixel_y = -32 }, -/obj/structure/window/reinforced{ - dir = 8 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"HN" = ( +/obj/machinery/firealarm{ + pixel_y = 21 }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled, +/area/ministation/smcontrol) +"HO" = ( +/obj/structure/cable{ + icon_state = "0-8" }, -/obj/machinery/door/window/southleft, -/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup, -/turf/simulated/floor/plating, +/obj/machinery/power/solar_control{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) -"DL" = ( -/obj/structure/window/reinforced{ - dir = 4 +"HP" = ( +/obj/structure/table, +/obj/item/stack/material/pane/mapped/glass/fifty, +/obj/item/stack/material/pane/mapped/rglass, +/obj/item/stack/material/reinforced/mapped/fiberglass/fifty, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HQ" = ( +/obj/structure/table, +/obj/item/stack/material/sheet/mapped/steel/fifty, +/obj/item/stack/material/shiny/mapped/aluminium/fifty, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HR" = ( +/obj/structure/table, +/obj/item/stack/material/reinforced/mapped/plasteel, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"HS" = ( +/obj/structure/transit_tube{ + icon_state = "N-S" }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/structure/lattice, +/turf/space, +/area/space) +"HT" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/door/window/southleft, -/obj/machinery/portable_atmospherics/canister/hydrogen, /turf/simulated/floor/plating, -/area/ministation/engine) -"DM" = ( -/obj/structure/window/reinforced{ +/area/space) +"HU" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/southleft, -/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/simulated/floor/plating, -/area/ministation/engine) -"DN" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/window/reinforced{ - dir = 4 +/area/ministation/supermatter) +"HV" = ( +/obj/structure/transit_tube{ + icon_state = "N-S-Pass" }, -/obj/structure/window/reinforced{ +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 8 }, -/obj/machinery/door/window/southleft, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/turf/space, +/area/space) +"HW" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black, +/obj/machinery/door/blast/regular{ + id_tag = "EngineVent" }, /turf/simulated/floor/plating, -/area/ministation/engine) -"DO" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/structure/window/reinforced{ - dir = 4 +/area/ministation/supermatter) +"HY" = ( +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/structure/window/reinforced{ +/obj/machinery/power/solar, +/turf/simulated/floor/plating, +/area/space) +"Ia" = ( +/obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/machinery/door/window/southleft, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Ib" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/flora/pottedplant/aquatic, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ic" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/carpet/orange, /area/ministation/engine) -"DP" = ( -/obj/structure/window/reinforced{ - dir = 4 +"If" = ( +/obj/structure/cable, +/obj/machinery/power/solar, +/turf/simulated/floor/plating, +/area/space) +"Ig" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/window/reinforced{ +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "starboard_engineering_vent"; dir = 8 }, -/obj/machinery/door/window/southleft, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +/obj/machinery/airlock_sensor{ + id_tag = "starboard_engineering_sensor"; + pixel_y = 24 }, -/obj/machinery/portable_atmospherics/canister/helium, /turf/simulated/floor/plating, /area/ministation/engine) -"DQ" = ( -/obj/structure/rack{ +"Ih" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ii" = ( +/obj/structure/closet/crate/solar_assembly, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Ij" = ( +/obj/machinery/atmospherics/unary/tank/air, +/obj/machinery/atmospherics/portables_connector{ dir = 8 }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ik" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sat2_airlock_interior" }, -/obj/item/clothing/mask/gas/budget, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"DR" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/machinery/button/access/interior{ + id_tag = "sat2_airlock"; + name = "interior access button"; + pixel_x = 32; + pixel_y = 24 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"DS" = ( -/obj/structure/window/reinforced{ +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Il" = ( +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Im" = ( /obj/machinery/light/small{ - dir = 8 + dir = 1 }, -/turf/simulated/floor/airless, -/area/ministation/atmospherics) -"DT" = ( -/obj/structure/cable{ - icon_state = "1-4" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"In" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/obj/effect/floor_decal/corner/yellow{ - dir = 5 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ip" = ( +/obj/machinery/atmospherics/binary/pump/on{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"DU" = ( -/obj/structure/table, +/obj/machinery/camera/network/ministation/sat, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Iq" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/cell_charger, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"DV" = ( -/obj/structure/table, -/obj/machinery/alarm{ - pixel_y = 23 + icon_state = "2-8" }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/recharger, /turf/simulated/floor/tiled, /area/ministation/engine) -"DW" = ( -/obj/structure/cable{ - icon_state = "4-8" +"It" = ( +/obj/machinery/atmospherics/unary/outlet_injector{ + dir = 8 }, -/obj/effect/floor_decal/industrial/warning{ +/turf/simulated/floor/airless, +/area/space) +"Iu" = ( +/obj/machinery/light/small{ dir = 4 }, -/obj/machinery/light_switch{ - pixel_y = 25 +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Iv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"DX" = ( -/obj/structure/cable{ - icon_state = "0-4" +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) +"Iw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-8" +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) +"Ix" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/power/smes/buildable/max_cap_in_out, -/obj/machinery/camera/network/engineering, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"DY" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/door/airlock, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Iy" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) +"Iz" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/network/requests_console{ - department = "Engineering"; - name = "Engineering RC"; - pixel_y = 30 +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) +"IA" = ( +/obj/machinery/camera/autoname, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"ID" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IE" = ( +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"IF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) +"IG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IH" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29; + dir = 1 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"DZ" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/cargo) +"II" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IJ" = ( +/obj/machinery/alarm{ + pixel_y = 28 }, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IK" = ( +/obj/machinery/camera/network/mining, +/obj/machinery/atm{ + pixel_y = 32 }, -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_y = 25 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, -/obj/item/clothing/gloves/insulated, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ea" = ( -/obj/effect/decal/cleanable/blood/oil, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -32 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Eb" = ( +/area/ministation/cargo) +"IL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/random/maintenance, +/obj/structure/rack, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IM" = ( /obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 + name = "_South APC"; + pixel_y = -24 }, /obj/structure/cable{ icon_state = "0-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ec" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/light/small{ +/turf/simulated/floor/plating, +/area/ministation/maint/l1ne) +"IN" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Ed" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/vending/cola{ - dir = 4; - pixel_x = -5 +/area/ministation/ai_sat) +"IO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/storage/box, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ee" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 +/area/ministation/cargo) +"IP" = ( +/obj/structure/closet, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ef" = ( -/obj/abstract/landmark{ - name = "lightsout" +/obj/machinery/light{ + dir = 1 }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"IQ" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Eg" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IR" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Eh" = ( -/obj/machinery/vending/snack{ - dir = 8; - pixel_x = 5 +/turf/space, +/area/space) +"IW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ei" = ( -/obj/machinery/fabricator/pipe/disposal, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ej" = ( -/obj/machinery/conveyor_switch{ - id_tag = "CanisterStore" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"IY" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ek" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/machinery/computer/modular/preset/cardslot/command{ + dir = 8 }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"IZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, /area/ministation/engine) -"El" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +"Jb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Em" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"En" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Eo" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/engine) -"Ep" = ( -/turf/simulated/floor/reinforced/airmix, -/area/ministation/atmospherics) -"Eq" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Er" = ( -/obj/effect/floor_decal/industrial/warning/corner{ +/obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, -/obj/item/stool/padded, /turf/simulated/floor/tiled, /area/ministation/engine) -"Es" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, +"Jc" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/item/stool/padded, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Et" = ( -/obj/effect/floor_decal/industrial/warning/corner{ - dir = 1 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Jd" = ( +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "sat3_airlock"; + pixel_y = 24; + tag_airpump = "sat3_vent"; + tag_chamber_sensor = "sat3_sensor"; + tag_exterior_door = "sat3_airlock_exterior"; + tag_interior_door = "sat3_airlock_interior"; + pixel_x = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Eu" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ev" = ( -/obj/structure/cable, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ew" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/vending/coffee{ +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 4; - pixel_x = -5 + id_tag = "sat3_vent" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ex" = ( -/obj/machinery/vending/cigarette{ - dir = 8; - pixel_x = 5 +/obj/machinery/airlock_sensor{ + id_tag = "sat3_sensor"; + pixel_y = 24; + pixel_x = -8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ey" = ( -/obj/machinery/fabricator/pipe, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ez" = ( -/obj/effect/decal/cleanable/blood/oil, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EB" = ( +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Je" = ( +/turf/simulated/wall/r_wall, +/area/ministation/maint/eastatmos) +"Jg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall/r_wall, +/area/ministation/ai_core) +"Jh" = ( +/turf/simulated/wall/r_wall, +/area/ministation/ai_core) +"Ji" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/wall/r_wall, +/area/ministation/ai_core) +"Jj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"ED" = ( -/obj/machinery/atmospherics/binary/pump/on{ - dir = 8 +/obj/random/trash, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"Jk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Jl" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup, +/turf/simulated/floor/plating, /area/ministation/engine) -"EE" = ( -/obj/item/stool/padded, -/obj/abstract/landmark/start{ - name = "Security Officer" +"Jm" = ( +/obj/structure/table, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"EG" = ( -/obj/machinery/light/small/emergency{ - dir = 4 +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"EH" = ( -/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos/tank{ +/obj/machinery/light/small{ dir = 8 }, -/turf/simulated/floor/reinforced/airmix, -/area/ministation/atmospherics) -"EI" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/simulated/floor/reinforced/airmix, -/area/ministation/atmospherics) -"EJ" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/blood/oil, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EL" = ( -/obj/abstract/landmark/start{ - name = "Station Engineer" +/obj/machinery/button/alternate/door/bolts{ + name = "AI core door bolts" }, -/obj/item/stool/padded, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EM" = ( -/obj/structure/table/reinforced, -/obj/item/boombox, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EN" = ( +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"Jn" = ( +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"Jo" = ( +/obj/structure/table, +/obj/item/folder/blue, +/obj/machinery/camera/motion/ministation, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Jp" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/table/reinforced, -/obj/item/chems/chem_disp_cartridge/water, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EO" = ( -/obj/structure/table/reinforced, -/obj/item/chems/food/old/pizza, -/obj/item/stack/material/puck/mapped/uranium/ten, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EP" = ( -/obj/machinery/vending/materials{ +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Jq" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Jr" = ( +/obj/structure/table, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/light/small{ dir = 4 }, -/obj/machinery/light{ +/obj/item/aicard, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"Jt" = ( +/turf/simulated/floor/plating, +/area/space) +"Ju" = ( +/obj/structure/hygiene/shower{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ dir = 4; - icon_state = "tube1" + icon_state = "twindow" }, -/obj/machinery/computer/atmos_alert{ - dir = 8 +/obj/structure/window/reinforced/tinted, +/obj/structure/curtain/open/shower, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"ER" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/wall/r_wall, -/area/ministation/engine) -"ES" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"Jv" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Jw" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Jx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Jy" = ( +/obj/structure/cable{ + icon_state = "1-8" }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"JA" = ( +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"JB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/wall/r_wall, -/area/ministation/engine) -"ET" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/area/ministation/ai_core) +"JC" = ( +/obj/machinery/porta_turret{ dir = 4 }, -/obj/effect/floor_decal/corner/yellow/three_quarters, -/obj/structure/sign/warning/engineering_access{ - pixel_y = -32 +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"JD" = ( +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"JE" = ( +/obj/machinery/porta_turret{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"EU" = ( +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"JG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/floor_decal/corner/yellow{ - dir = 10 +/turf/simulated/wall/r_wall, +/area/ministation/ai_core) +"JH" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 }, +/turf/simulated/wall/r_wall, +/area/ministation/ai_core) +"JI" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"EV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"JJ" = ( +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"JK" = ( +/obj/machinery/flasher{ + pixel_y = -21; + dir = 1 }, -/obj/effect/floor_decal/corner/yellow/three_quarters{ - dir = 4 +/obj/machinery/ai_slipper{ + uses = 10 }, -/obj/structure/sign/department/engineering{ - dir = 1; - pixel_y = -32 +/obj/machinery/light, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"JL" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 }, -/obj/random/trash, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"EW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"JM" = ( +/obj/machinery/hologram/holopad, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"JN" = ( /turf/simulated/wall/r_wall, -/area/ministation/engine) -"EX" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" +/area/ministation/ai_upload) +"JO" = ( +/obj/structure/cable, +/obj/machinery/power/tracker, +/turf/simulated/floor/plating, +/area/space) +"JP" = ( +/obj/structure/transit_tube{ + icon_state = "N-SE" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EY" = ( -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"EZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fa" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fb" = ( -/mob/living/simple_animal/hostile/retaliate/parrot/Poly, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fc" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/clothing/gloves/insulated, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fd" = ( +/obj/structure/lattice, +/turf/space, +/area/space) +"JQ" = ( +/obj/structure/transit_tube{ + icon_state = "D-SW" + }, +/obj/structure/lattice, /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/table/reinforced, +/turf/space, +/area/space) +"JR" = ( /turf/simulated/floor/tiled, -/area/ministation/engine) -"Fe" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/ai_sat) +"JS" = ( +/obj/machinery/door/firedoor{ + dir = 8 }, -/obj/structure/table/reinforced, -/obj/item/chems/drinks/glass2/coffeecup/metal, -/obj/item/chems/drinks/glass2/coffeecup/metal, -/obj/item/chems/condiment/small/packet/coffee, -/obj/item/chems/condiment/small/packet/coffee, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ff" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/floor_decal/industrial/warning{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/opossum/poppy, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fg" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/structure/cable{ + icon_state = "4-8" }, /turf/simulated/floor/tiled, -/area/ministation/disused_office) -"Fh" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 +/area/ministation/ai_sat) +"JT" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 }, -/turf/simulated/wall/r_wall, -/area/ministation/engine) -"Fi" = ( +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"JU" = ( +/turf/simulated/wall, +/area/ministation/ai_core) +"JV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/wall/r_wall, -/area/ministation/engine) -"Fj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering, /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor, -/area/ministation/engine) -"Fk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/wall/r_wall, -/area/ministation/engine) -"Fl" = ( -/obj/abstract/landmark/start{ - name = "Assistant" + icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"Fm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/industrial/warning/fulltile, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Fn" = ( -/obj/machinery/space_heater, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/area/ministation/cargo) +"JW" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fo" = ( -/obj/machinery/space_heater, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/item/stock_parts/circuitboard/aiupload, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"JX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"JY" = ( +/obj/structure/table, +/obj/machinery/light{ dir = 4 }, -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/item/stock_parts/circuitboard/borgupload, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Ka" = ( +/obj/structure/transit_tube{ + icon_state = "D-NE" + }, +/turf/space, +/area/space) +"Kb" = ( +/obj/structure/transit_tube{ + icon_state = "E-NW" + }, +/turf/space, +/area/space) +"Kc" = ( +/obj/structure/lattice, +/obj/structure/transit_tube{ + icon_state = "E-W-Pass" + }, +/turf/space, +/area/space) +"Kd" = ( +/obj/structure/transit_tube, +/obj/structure/lattice, +/turf/space, +/area/space) +"Ke" = ( +/obj/structure/transit_tube, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/portable_atmospherics/powered/scrubber, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fq" = ( -/turf/simulated/wall/r_wall, -/area/ministation/court) -"Fr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/tank_rack/oxygen, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Kf" = ( +/obj/structure/transit_tube, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Fs" = ( -/obj/structure/closet/emcloset, +/area/ministation/ai_sat) +"Kg" = ( +/obj/structure/transit_tube/station{ + dir = 1 + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Ft" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/area/ministation/ai_sat) +"Kh" = ( +/obj/structure/transit_tube{ + dir = 8; + icon_state = "Block" + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Fu" = ( +/area/ministation/ai_sat) +"Ki" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 6 + }, +/obj/machinery/light{ + dir = 1; + icon_state = "bulb1" + }, +/obj/structure/closet/secure_closet/atmos_personal, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/suit/space/emergency, +/obj/item/clothing/head/helmet/space/emergency, +/obj/item/clothing/mask/breath/emergency, +/obj/item/storage/firstaid/o2, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"Kj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fv" = ( -/obj/structure/cable{ - icon_state = "2-4" +/turf/simulated/wall/r_wall, +/area/ministation/ai_core) +"Kk" = ( +/obj/machinery/porta_turret{ + dir = 4 }, -/obj/item/stool/padded, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fw" = ( +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Kl" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fx" = ( -/obj/machinery/vending/engivend{ - dir = 8 +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"Km" = ( +/obj/machinery/ai_slipper{ + uses = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Fy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall, -/area/ministation/engine) -"Fz" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light/small{ +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"Kn" = ( +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_x = -22; + pixel_y = 6; + dir = 4 + }, +/obj/item/radio/intercom{ + listening = 0; + name = "Custom Channel"; + pixel_y = 20 + }, +/obj/item/radio/intercom{ + frequency = 1447; + name = "Private Channel"; + pixel_x = 22; + pixel_y = 6; dir = 8 }, /obj/machinery/newscaster{ + pixel_x = -32; pixel_y = 32 }, -/obj/effect/floor_decal/corner/yellow/three_quarters{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FA" = ( -/obj/effect/floor_decal/corner/yellow{ - dir = 5 +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = 31 }, -/obj/effect/decal/cleanable/blood/oil, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/aicore/deactivated, +/obj/abstract/landmark/start/ai, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"Ko" = ( +/obj/machinery/porta_turret{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FB" = ( +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Kp" = ( +/obj/structure/table, +/obj/item/aiModule/asimov, +/obj/item/aiModule/corp, +/obj/item/aiModule/dais, +/obj/item/aiModule/paladin, +/obj/item/aiModule/protectStation, +/obj/item/aiModule/quarantine, +/obj/item/aiModule/reset, +/obj/item/aiModule/robocop, +/obj/item/aiModule/safeguard, +/obj/item/aiModule/tyrant, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Kq" = ( +/obj/machinery/light, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/floor_decal/corner/yellow/three_quarters{ +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Kr" = ( +/obj/machinery/computer/upload/ai{ dir = 1 }, -/obj/machinery/light_switch{ - pixel_y = 25 +/obj/machinery/flasher{ + pixel_y = -32; + dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall, -/area/ministation/engine) -"FD" = ( -/obj/abstract/landmark/start{ - name = "Station Engineer" +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Ks" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + name = "_South APC"; + pixel_y = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FE" = ( -/obj/structure/cable{ - icon_state = "0-4" +/turf/simulated/floor/bluegrid, +/area/ministation/ai_upload) +"Kt" = ( +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1447; + listening = 0; + name = "Station Intercom (AI Private)"; + pixel_y = -30; + dir = 1 }, -/obj/machinery/power/solar, -/turf/simulated/floor/airless, -/area/space) -"FF" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/computer/upload/robot{ + dir = 1 + }, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Ku" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Kv" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_upload) +"Kw" = ( +/obj/structure/window/reinforced{ + dir = 8 }, +/obj/structure/window/reinforced, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-2" }, -/turf/simulated/floor/plating, -/area/space) -"FG" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"Kx" = ( +/obj/machinery/door/window/southright, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/obj/machinery/power/solar, -/turf/simulated/floor/airless, -/area/space) -"FH" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FI" = ( -/obj/structure/rack{ - dir = 8 +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"Ky" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/item/chems/spray/extinguisher{ - pixel_x = 8 +/obj/structure/window/reinforced, +/obj/machinery/turretid{ + name = "AI Chamber turret control"; + pixel_x = 5; + pixel_y = 24 }, -/obj/item/clothing/gloves/thick, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FJ" = ( -/obj/machinery/port_gen/pacman, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FK" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 +/obj/machinery/flasher{ + pixel_x = -6; + pixel_y = 24 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/camera/motion/ministation, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"Kz" = ( +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" }, +/obj/machinery/conveyor{ + id_tag = "trash_sort"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/trash) +"KA" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"FO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/computer/modular/preset/engineering{ dir = 4 }, -/obj/effect/floor_decal/corner/yellow{ - dir = 10 +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"KB" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FP" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/door/airlock/glass/engineering, -/obj/machinery/door/firedoor{ +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"KC" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/machinery/computer/modular/preset/security{ dir = 8 }, -/turf/simulated/floor, -/area/ministation/engine) -"FQ" = ( +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"KD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FR" = ( -/obj/abstract/landmark{ - name = "bluespace_a" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KE" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/alarm{ + pixel_y = 28 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KH" = ( +/obj/structure/closet/lasertag/red, +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"KJ" = ( /obj/structure/cable{ icon_state = "1-4" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/machinery/computer/modular/preset/medical{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FT" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/machinery/door/airlock/glass/engineering, -/obj/machinery/door/firedoor{ - dir = 8 +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"KK" = ( +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/simulated/floor, -/area/ministation/engine) -"FU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"KL" = ( +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/effect/floor_decal/corner/yellow{ - dir = 10 +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"KM" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FW" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"KO" = ( +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/closet/emcloset, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KP" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = -32 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KQ" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/camera/network/engineering{ - dir = 1 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KR" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"FZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ga" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KS" = ( /obj/structure/cable{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KU" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KY" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"KZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/wall, +/area/ministation/ai_sat) +"La" = ( /obj/structure/cable{ icon_state = "1-2" }, +/turf/simulated/wall, +/area/ministation/ai_sat) +"Lb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 10 + }, /turf/simulated/floor/plating, /area/space) -"Gb" = ( +"Lc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Gc" = ( -/obj/machinery/firealarm{ +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ld" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/wall/r_wall, +/area/ministation/ai_sat) +"Le" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Lf" = ( +/obj/machinery/power/apc{ dir = 8; + name = "MiniSat Maint APC"; pixel_x = -24 }, -/obj/structure/closet/crate/bin/ministation, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Gd" = ( -/obj/structure/rack{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/item/clothing/suit/storage/hazardvest, -/obj/item/tank/emergency/oxygen/engi, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ge" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gf" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/area/ministation/ai_sat) +"Lg" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 3 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/machinery/status_display{ + pixel_y = 32 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Gh" = ( -/obj/structure/cable{ - icon_state = "0-4" +/area/ministation/ai_sat) +"Lh" = ( +/obj/machinery/alarm{ + pixel_y = 23 }, -/obj/machinery/power/solar, -/turf/simulated/floor/plating, -/area/space) -"Gi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gj" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, +/area/ministation/ai_sat) +"Li" = ( +/obj/structure/cable, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2" }, -/obj/machinery/door/firedoor, +/obj/machinery/power/smes/buildable/max_cap_in_out, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gk" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/area/ministation/ai_sat) +"Lj" = ( +/obj/machinery/power/terminal{ + dir = 8 }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Gl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Gm" = ( -/obj/structure/lattice, -/turf/simulated/wall, -/area/ministation/engine) -"Gn" = ( /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/smes/buildable/preset, +/obj/machinery/camera/network/ministation/sat, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/area/ministation/ai_sat) +"Lk" = ( +/obj/structure/rack, +/obj/item/crowbar/red, +/obj/item/wrench, /obj/structure/cable{ icon_state = "4-8" }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gq" = ( -/obj/structure/cable{ - icon_state = "1-8" +/area/ministation/ai_sat) +"Ll" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 22; + dir = 8 }, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/yellow{ - dir = 6 + icon_state = "2-8" }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gr" = ( -/obj/effect/floor_decal/corner/yellow{ - dir = 9 +/area/ministation/ai_sat) +"Lm" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Gs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ln" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gt" = ( +/area/ministation/ai_sat) +"Lo" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gu" = ( +/area/ministation/ai_sat) +"Lp" = ( /obj/structure/cable{ - icon_state = "0-8" + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/obj/machinery/power/smes/buildable/preset, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gv" = ( -/obj/machinery/power/terminal{ - dir = 8 +/area/ministation/ai_sat) +"Lq" = ( +/obj/structure/sign/department/cargo{ + dir = 1; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 + icon_state = "4-8" }, -/obj/structure/sign/warning/airlock{ - pixel_x = 32 +/obj/effect/floor_decal/industrial/warning{ + dir = 8 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gw" = ( -/obj/structure/cable, -/turf/simulated/floor/plating, -/area/space) -"Gx" = ( -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 +/area/ministation/hall/n) +"Lr" = ( +/obj/machinery/atmospherics/binary/pump{ + dir = 8 }, /obj/machinery/power/terminal{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Ls" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/blue{ + dir = 4 + }, +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ + dir = 4 + }, +/obj/machinery/meter, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"Lt" = ( +/obj/structure/window/reinforced/tinted{ + dir = 4; + icon_state = "twindow" + }, +/obj/structure/hygiene/shower{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/item/soap, +/obj/structure/curtain/open/shower, +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"Lu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Lv" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/light/small{ + dir = 8 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/area/ministation/ai_sat) +"Lw" = ( +/obj/abstract/landmark{ + name = "xeno_spawn"; + pixel_x = -1 + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Gz" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/ai_sat) +"Lx" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 }, -/obj/effect/floor_decal/corner/yellow{ - dir = 6 +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"Ly" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"GA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/area/ministation/ai_sat) +"Lz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LA" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"GB" = ( -/obj/structure/cable{ - icon_state = "1-4" +/area/ministation/ai_sat) +"LB" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LC" = ( +/obj/structure/table, +/obj/item/stack/material/pane/mapped/glass/fifty, +/obj/item/stack/cable_coil/yellow, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LD" = ( +/obj/item/stool, +/obj/item/radio, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LE" = ( +/obj/structure/bed, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LF" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/stack/material/puck/mapped/uranium/ten, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LG" = ( +/obj/structure/cable, +/obj/machinery/port_gen/pacman/super, +/turf/simulated/floor/tiled, +/area/ministation/ai_sat) +"LJ" = ( +/obj/effect/shuttle_landmark/supply/station, +/turf/space, +/area/ministation/supply_dock) +"LO" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"LP" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 1; + icon_state = "warningcorner" + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"GC" = ( -/obj/machinery/door/airlock/external{ - autoset_access = 0; - id_tag = "starboard_engineering_airlock_interior"; - locked = 1 +/area/ministation/hall/s1) +"LS" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"LY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"LZ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/button/access/interior{ - id_tag = "starboard_engineering_airlock"; - name = "interior access button"; - pixel_x = -10; - pixel_y = 20 +/obj/machinery/door/airlock/double{ + dir = 8 }, -/turf/simulated/floor, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ma" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 5 + }, +/turf/simulated/floor/plating, /area/ministation/engine) -"GD" = ( -/obj/structure/cable{ - icon_state = "4-8" +"Mc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/camera/autoname{ + dir = 8 }, -/obj/machinery/light/small{ - dir = 1 +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Md" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 8 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - id_tag = "starboard_engineering_vent"; +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Mg" = ( +/obj/structure/window/reinforced{ dir = 8 }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/conveyor{ + id_tag = "CanisterStore" + }, +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/plating, /area/ministation/engine) -"GF" = ( -/obj/machinery/door/airlock/external{ - locked = 1; - id_tag = "starboard_engineering_airlock_exterior"; - autoset_access = 0 +"Mh" = ( +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/machinery/button/access/interior{ - id_tag = "starboard_engineering_airlock"; - name = "exterior access button"; - pixel_x = 10; - pixel_y = 20; - command = "cycle_exterior" +/obj/machinery/conveyor{ + id_tag = "CanisterStore" + }, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/light{ + dir = 1 }, /turf/simulated/floor/plating, /area/ministation/engine) -"GH" = ( +"Mj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "4-8" }, /turf/simulated/floor/plating, -/area/space) -"GI" = ( -/obj/structure/cable{ - icon_state = "0-4" +/area/ministation/ai_sat) +"Ml" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200 + }, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Mm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/camera/network/ministation/sat{ + dir = 1 }, /turf/simulated/floor/plating, -/area/space) -"GJ" = ( +/area/ministation/ai_sat) +"Mn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Mo" = ( +/obj/structure/closet/crate, +/obj/item/stock_parts/circuitboard/smes, +/obj/item/stock_parts/circuitboard/smes, +/obj/item/stock_parts/smes_coil, +/obj/item/stock_parts/smes_coil, +/obj/item/stock_parts/smes_coil/super_capacity, +/obj/item/stock_parts/smes_coil/super_capacity, +/obj/item/stock_parts/smes_coil/super_io, +/obj/item/stock_parts/smes_coil/super_io, +/obj/item/stock_parts/smes_coil, +/obj/item/stock_parts/smes_coil, +/obj/item/stock_parts/smes_coil/super_capacity, +/obj/item/stock_parts/smes_coil/super_capacity, +/obj/item/stock_parts/smes_coil/super_io, +/obj/item/stock_parts/smes_coil/super_io, /turf/simulated/floor/plating, -/area/space) -"GL" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/engine) +"Mq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"GM" = ( -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Mv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/green, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Mx" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/status_display{ + pixel_y = 32 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled, /area/space) -"GN" = ( -/obj/structure/cable{ - icon_state = "1-8" +"MB" = ( +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/stool/padded, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"MC" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/space) -"GO" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/light{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/light_switch{ + pixel_y = 12; + dir = 8; + pixel_x = 24 }, -/turf/simulated/floor/plating, -/area/space) -"GP" = ( -/obj/machinery/power/tracker, -/obj/structure/cable{ - icon_state = "0-8" +/turf/simulated/floor/carpet/orange, +/area/ministation/engine) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 10 }, -/turf/simulated/floor/plating, -/area/space) -"GQ" = ( -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/cable/cyan{ + icon_state = "1-4" }, -/obj/machinery/power/tracker, /turf/simulated/floor/plating, -/area/space) -"GR" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/supermatter) +"MF" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/space) -"GS" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/stool/padded, +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) +"MI" = ( +/obj/effect/floor_decal/corner/white{ + dir = 9 }, -/turf/simulated/floor/plating, -/area/space) -"GT" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"MJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"MK" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 4 }, +/obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/plating, -/area/space) -"GV" = ( +/area/ministation/maint/l1ne) +"MM" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/external/glass{ - id_tag = "port_engineering_airlock_interior"; - autoset_access = 0; - locked = 1 - }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/button/access/interior{ - id_tag = "port_engineering_airlock"; - name = "interior access button"; - pixel_x = 10; - pixel_y = 20 +/obj/machinery/door/blast/regular/open{ + id_tag = "smsafetydoor" }, -/turf/simulated/floor/plating, +/turf/simulated/floor/tiled, /area/ministation/engine) -"GW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airlock_sensor{ - id_tag = "port_engineering_sensor"; - pixel_y = 20 - }, -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - id_tag = "port_engineering_airlock"; - pixel_y = 24; - tag_airpump = "port_engineering_vent"; - tag_chamber_sensor = "port_engineering_sensor"; - tag_exterior_door = "port_engineering_airlock_exterior"; - tag_interior_door = "port_engineering_airlock_interior" +"MN" = ( +/obj/structure/closet/l3closet/janitor, +/obj/item/grenade/chem_grenade/cleaner, +/turf/simulated/floor/tiled, +/area/ministation/janitor) +"MR" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 9 }, /turf/simulated/floor/plating, /area/ministation/engine) -"GX" = ( +"MS" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-4" }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "2-4" }, /obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 + dir = 4 }, /turf/simulated/floor/tiled, /area/ministation/engine) -"GY" = ( -/obj/machinery/power/solar_control{ +"MT" = ( +/obj/machinery/door/firedoor{ dir = 8 }, -/obj/structure/cable, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"GZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/abstract/landmark/start{ - name = "Robot" + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Ha" = ( -/obj/item/radio/intercom{ - canhear_range = 3; - name = "Common Channel"; - pixel_x = 27; - pixel_y = -3 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hb" = ( -/obj/effect/floor_decal/industrial/warning{ +/obj/effect/floor_decal/industrial/warning/fulltile, +/obj/machinery/door/airlock/double/mining{ dir = 8 }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hc" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hd" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"He" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "2-8" +/area/ministation/cargo) +"MW" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastexterior" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/space) -"Hf" = ( -/obj/structure/cable, -/obj/machinery/power/solar_control{ +/area/ministation/supermatter) +"MX" = ( +/turf/simulated/wall, +/area/ministation/trash) +"MZ" = ( +/obj/machinery/door/airlock/atmos, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Nc" = ( +/obj/effect/floor_decal/corner/red{ dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hg" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/camera/network/engineering, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hh" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/camera/network/engineering, -/turf/simulated/floor, -/area/ministation/engine) -"Hi" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hj" = ( -/obj/machinery/light/small, -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hk" = ( -/obj/structure/transit_tube{ - dir = 4; - icon_state = "Block" +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hl" = ( -/obj/structure/transit_tube_pod{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/transit_tube/station{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hm" = ( -/obj/structure/transit_tube, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hn" = ( -/obj/structure/transit_tube, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Nh" = ( +/obj/structure/sign/directions/engineering{ + pixel_x = -32; + pixel_y = -32 }, -/obj/structure/window/reinforced{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/turf/space, -/area/ministation/engine) -"Ho" = ( -/obj/structure/transit_tube, -/turf/space, -/area/space) -"Hp" = ( -/obj/structure/transit_tube{ - icon_state = "E-W-Pass" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/obj/structure/lattice, -/turf/space, -/area/space) -"Hq" = ( -/obj/structure/transit_tube{ - icon_state = "W-SE" +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/space, -/area/space) -"Hr" = ( -/obj/structure/transit_tube{ - icon_state = "D-SW" +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4; + icon_state = "warningcorner" }, -/turf/space, -/area/space) -"Hs" = ( /obj/machinery/light{ dir = 8; icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Ht" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, +/area/ministation/hall/s1) +"Ni" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hu" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/obj/machinery/atmospherics/portables_connector, +/obj/machinery/portable_atmospherics/canister/air/airlock{ + pixel_x = 1 }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/tiled, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) -"Hv" = ( -/obj/machinery/door/firedoor{ +"Nq" = ( +/obj/effect/floor_decal/corner/beige{ + dir = 6 + }, +/obj/item/eftpos, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hw" = ( -/obj/machinery/light{ - dir = 1 +/obj/machinery/alarm{ + pixel_y = 22 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"Hx" = ( -/obj/effect/floor_decal/corner/yellow{ +/area/ministation/cargo) +"Ns" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Hy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Nu" = ( +/obj/abstract/landmark/start{ + name = "Head Engineer" }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/bed/chair/office{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/wood/yew, /area/ministation/engine) -"Hz" = ( -/obj/structure/transit_tube{ - icon_state = "D-NE" +"Nw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/structure/lattice, -/turf/space, -/area/space) -"HA" = ( -/obj/structure/transit_tube{ - icon_state = "S-NW" +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 }, -/obj/structure/lattice, -/turf/space, -/area/space) -"HB" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-8" }, -/obj/item/stool, -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"Nx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HC" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/sign/warning/radioactive{ + pixel_y = -34; + dir = 1; + pixel_x = 9 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HD" = ( -/obj/machinery/door/firedoor{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"NB" = ( +/obj/machinery/firealarm{ + pixel_y = 21 }, -/obj/structure/cable{ +/obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HE" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/camera/network/engineering{ + name = "SM North" }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"NH" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"NI" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"HF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/area/ministation/cargo) +"NL" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "l1ne_airlock_exterior" }, -/obj/item/stool, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/button/access/interior{ + id_tag = "l1ne_airlock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/turf/simulated/floor/airless, +/area/ministation/maint/l1ne) +"NM" = ( +/obj/structure/cable{ + icon_state = "1-4" }, /obj/structure/cable{ icon_state = "1-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HH" = ( -/obj/structure/transit_tube{ - icon_state = "N-S" - }, +/turf/simulated/floor/plating, +/area/space) +"NO" = ( +/obj/abstract/level_data_spawner/main_level, /turf/space, /area/space) -"HI" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/circuitboard/airlock_electronics, -/obj/item/stock_parts/circuitboard/airlock_electronics, -/obj/item/scanner/gas, -/turf/simulated/floor/tiled, +"NQ" = ( +/turf/simulated/floor/plating, /area/ministation/engine) -"HJ" = ( -/obj/structure/table, -/obj/item/folder/yellow, -/obj/item/clothing/head/earmuffs, -/obj/item/stack/material/rods/fifty, +"NR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_x = -32; + pixel_y = 32 + }, /turf/simulated/floor/tiled, -/area/ministation/engine) -"HK" = ( -/obj/machinery/atmospherics/portables_connector{ +/area/ministation/hall/n) +"NS" = ( +/obj/machinery/door/airlock/atmos, +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/turf/simulated/floor/reinforced/airless, +/area/ministation/supermatter) +"NU" = ( +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + dir = 1; + id_tag = "sat2_airlock"; + pixel_y = -22; + tag_airpump = "sat2_vent"; + tag_chamber_sensor = "sat2_sensor"; + tag_exterior_door = "sat2_airlock_exterior"; + tag_interior_door = "sat2_airlock_interior"; + pixel_x = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "sat2_vent" + }, +/obj/machinery/airlock_sensor{ + id_tag = "sat2_sensor"; + pixel_y = -18; + pixel_x = -8; dir = 1 }, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HL" = ( -/obj/structure/cable, -/obj/machinery/power/smes/buildable/preset, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HM" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"NV" = ( +/obj/machinery/atmospherics/unary/vent_pump/engine{ + dir = 4; + external_pressure_bound = 100; + external_pressure_bound_default = 0; + icon_state = "map_vent_in"; + id_tag = "cooling_out"; + initialize_directions = 1; + pump_direction = 0; + use_power = 1 + }, +/turf/simulated/floor/reinforced/airless, +/area/ministation/supermatter) +"NW" = ( +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + dir = 10 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HN" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/meter, +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ + dir = 4 }, +/obj/structure/closet/secure_closet/atmos_personal, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"NX" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"NY" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HO" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/floor_decal/corner/yellow{ + dir = 6 }, -/obj/machinery/power/solar_control{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 6 }, /turf/simulated/floor/tiled, /area/ministation/engine) -"HP" = ( -/obj/structure/table, -/obj/item/stack/material/pane/mapped/glass/fifty, -/obj/item/stack/material/pane/mapped/rglass, -/obj/item/stack/material/reinforced/mapped/fiberglass/fifty, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"HQ" = ( -/obj/structure/table, -/obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/shiny/mapped/aluminium/fifty, -/turf/simulated/floor/tiled, +"Oa" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/plating, /area/ministation/engine) -"HR" = ( -/obj/structure/table, -/obj/item/stack/material/reinforced/mapped/plasteel, -/turf/simulated/floor/tiled, +"Oe" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/turf/simulated/floor/plating, /area/ministation/engine) -"HS" = ( -/obj/structure/transit_tube{ - icon_state = "N-S" - }, -/obj/structure/lattice, -/turf/space, -/area/space) -"HT" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "2-8" +"Of" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 }, /turf/simulated/floor/plating, -/area/space) -"HU" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/ai_sat) +"Og" = ( +/obj/machinery/door/airlock/external{ + locked = 1; + id_tag = "starboard_engineering_airlock_exterior"; + autoset_access = 0 }, -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - id_tag = "stern_engineering_airlock_interior"; - locked = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/button/access/interior{ - id_tag = "stern_engineering_airlock"; - name = "interior access button"; - pixel_x = 20; - pixel_y = 10 + id_tag = "starboard_engineering_airlock"; + name = "exterior access button"; + pixel_y = 24; + command = "cycle_exterior" + }, +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 4 }, /turf/simulated/floor/plating, /area/ministation/engine) -"HV" = ( -/obj/structure/transit_tube{ - icon_state = "N-S-Pass" +"Oh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 }, -/turf/space, -/area/space) -"HW" = ( +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Oi" = ( +/obj/machinery/light_switch{ + pixel_y = 8; + dir = 4; + pixel_x = -23 + }, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled, +/area/ministation/supermatter) +"Oj" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/airlock_sensor{ - id_tag = "stern_engineering_sensor"; - pixel_y = 10; - pixel_x = -20 - }, -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - id_tag = "stern_engineering_airlock"; - pixel_y = null; - tag_airpump = "stern_engineering_vent"; - tag_chamber_sensor = "stern_engineering_sensor"; - tag_exterior_door = "stern_engineering_airlock_exterior"; - tag_interior_door = "stern_engineering_airlock_interior"; - dir = 4; - pixel_x = -20 +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction, +/turf/simulated/floor/plating, +/area/space) +"Om" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/engine) -"HY" = ( +/area/ministation/ai_sat) +"On" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "0-4" + }, +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/power/solar, -/turf/simulated/floor/plating, -/area/space) -"HZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light/small, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"Ia" = ( -/obj/structure/window/basic{ +/area/ministation/maint/l1central) +"Oo" = ( +/obj/structure/fitness/weightlifter, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Or" = ( +/obj/machinery/light/small{ dir = 1 }, -/obj/structure/curtain/open/bed{ - icon_state = "closed"; - opacity = TRUE +/obj/structure/cable{ + icon_state = "2-8" }, /turf/simulated/floor/plating, -/area/ministation/disused_office) -"Ib" = ( -/turf/simulated/wall, -/area/ministation/disused_office) -"Ic" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/area/ministation/ai_sat) +"Ot" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Ov" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/n) +"Ow" = ( +/obj/machinery/camera/network/mining{ + dir = 1 + }, +/turf/simulated/floor/airless, +/area/space) +"Oy" = ( +/obj/effect/floor_decal/industrial/warning, +/obj/item/storage/firstaid/regular{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"Oz" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastexterior" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"OA" = ( +/obj/effect/decal/cleanable/blood/oil, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"OC" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Id" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 +/area/ministation/eva) +"OF" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/structure/sign/warning/vent_port{ + dir = 1; + pixel_y = -34 }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Ie" = ( -/obj/machinery/newscaster{ - pixel_x = -32 +/area/ministation/engine) +"OG" = ( +/obj/machinery/power/apc{ + name = "_South APC"; + pixel_y = -24 }, -/obj/item/stool/padded, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/ministation/eva) +"OH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/yellow/diagonal, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"OJ" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/green, +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"OK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"If" = ( -/obj/structure/cable, -/obj/machinery/power/solar, +"ON" = ( +/obj/machinery/door/airlock/hatch/maintenance, /turf/simulated/floor/plating, -/area/space) -"Ig" = ( -/obj/structure/lattice, -/obj/structure/transit_tube{ - icon_state = "N-S-Pass" +/area/ministation/hall/n) +"OO" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sat3_airlock_exterior" }, -/turf/space, -/area/space) -"Ih" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Ij" = ( -/obj/machinery/atmospherics/unary/tank/air, -/obj/machinery/atmospherics/portables_connector{ - dir = 8 +/obj/machinery/button/access/interior{ + id_tag = "sat3_airlock"; + name = "exterior access button"; + pixel_y = 24; + command = "cycle_exterior" }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"Ik" = ( +"OQ" = ( +/obj/machinery/door/airlock/glass/command{ + autoset_access = 0; + name = "Telecommunications relay airlock"; + req_access = list("ACCESS_TELECOMS") + }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"OR" = ( /obj/machinery/door/airlock/external/glass{ autoset_access = 0; name = "External Airlock Hatch"; req_access = list("ACCESS_EXTERNAL"); locked = 1; - id_tag = "sat2_airlock_interior" + id_tag = "mining_airlock_exterior" }, /obj/machinery/button/access/interior{ - id_tag = "sat2_airlock"; - name = "interior access button"; - pixel_x = 10; - pixel_y = 20 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ + id_tag = "mining_airlock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Il" = ( -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Im" = ( -/obj/machinery/light/small{ +/turf/simulated/floor/airless, +/area/ministation/cargo) +"OS" = ( +/obj/machinery/power/terminal{ dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"In" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/machinery/emitter{ + anchored = 1; + id_tag = "EngineEmitter"; + state = 2 }, +/obj/structure/cable, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Io" = ( +/area/ministation/supermatter) +"OT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"OU" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/bed/chair/wood/maple{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/abstract/landmark/start{ - name = "Enclave Representative" +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"Ip" = ( -/obj/machinery/atmospherics/binary/pump/on{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"OV" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/camera/network/ministation/sat, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Ir" = ( -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Is" = ( +/area/space) +"OW" = ( +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_x = -32; + pixel_y = 32 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"It" = ( -/obj/machinery/atmospherics/unary/outlet_injector{ - dir = 8 +/obj/effect/floor_decal/industrial/warning/corner{ + icon_state = "warningcorner" }, -/turf/simulated/floor/airless, -/area/space) -"Iu" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Iv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"OX" = ( +/obj/machinery/door/airlock/external{ + autoset_access = 0; + id_tag = "atmos_airlock_interior"; + locked = 1 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"Iw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/button/access/interior{ + id_tag = "atmos_airlock"; + name = "interior access button"; + pixel_x = 20; + dir = 8 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"Ix" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"OY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"OZ" = ( +/obj/effect/wallframe_spawn/reinforced_borosilicate, +/obj/machinery/door/blast/regular/open{ + dir = 2; + id_tag = "SupermatterPort"; + name = "Reactor Blast Door" + }, +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, -/obj/machinery/door/airlock, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Iy" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/area/ministation/supermatter) +"Pa" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/hall/s1) +"Pb" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ dir = 1 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"Iz" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"IB" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"IC" = ( -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"ID" = ( -/obj/structure/closet/emcloset, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IE" = ( -/obj/machinery/recharge_station, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"IG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/area/ministation/supermatter) +"Pc" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"IH" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden, +"Pe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, /area/ministation/cargo) -"II" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IJ" = ( -/obj/machinery/alarm{ - pixel_y = 28 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IK" = ( -/obj/item/stool, +"Pg" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"IL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/random/maintenance, -/obj/structure/rack, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IN" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ph" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 }, +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"Pi" = ( +/obj/machinery/drone_fabricator/maintenance, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IO" = ( -/obj/effect/floor_decal/industrial/warning{ +/area/ministation/engine) +"Pl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/structure/sign/warning/airlock{ + pixel_x = 32; dir = 8 }, -/obj/machinery/embedded_controller/radio/airlock/docking_port{ - dir = 4; - id_tag = "cargo_bay"; - tag_airpump = "cargo_vent"; - tag_chamber_sensor = "cargo_sensor"; - tag_exterior_door = "cargo_airlock_exterior"; - tag_interior_door = "cargo_airlock_interior"; - pixel_x = -20 - }, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, /area/ministation/cargo) -"IQ" = ( +"Pm" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IS" = ( +/obj/machinery/power/smes/buildable/max_cap_in_out{ + capacity = 5e+009; + charge = 5e+009 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/smcontrol) +"Po" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/holofloor/lino, -/area/ministation/telecomms) -"IV" = ( -/obj/machinery/door/airlock/glass/command, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"IW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/area/ministation/hall/n) +"Pp" = ( +/turf/space, +/area/ministation/supply_dock) +"Pr" = ( +/obj/item/mollusc/barnacle{ + pixel_x = -13; + pixel_y = -14 }, +/turf/space, +/area/space) +"Ps" = ( +/obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"IY" = ( +/area/ministation/smcontrol) +"Py" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/computer/modular/preset/cardslot/command{ - dir = 8 +/obj/effect/floor_decal/corner/yellow{ + dir = 9 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"IZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Pz" = ( +/obj/machinery/atmospherics/unary/heat_exchanger, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"PC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Jc" = ( -/obj/effect/decal/cleanable/blood/oil, -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"PD" = ( +/turf/simulated/wall/r_wall, +/area/ministation/atmospherics) +"PF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/random/trash, /turf/simulated/floor/tiled, /area/ministation/engine) -"Jd" = ( -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - dir = 0; - id_tag = "sat3_airlock"; - pixel_y = 24; - tag_airpump = "sat3_vent"; - tag_chamber_sensor = "sat3_sensor"; - tag_exterior_door = "sat3_airlock_exterior"; - tag_interior_door = "sat3_airlock_interior" - }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "sat3_vent" - }, -/obj/machinery/airlock_sensor{ - id_tag = "sat3_sensor"; - pixel_y = 20 +"PH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Je" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/alarm{ - pixel_y = 23 +/area/ministation/maint/westatmos) +"PI" = ( +/obj/effect/floor_decal/corner/white{ + dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/visible/cyan, /obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; - dir = 4 + dir = 4; + name = "Air to Ports" }, -/turf/simulated/floor/plating, -/area/ministation/cafe) -"Jf" = ( +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"PK" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Jg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"Jh" = ( -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"Ji" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"Jk" = ( -/obj/item/clothing/under/librarian, -/obj/structure/closet, -/obj/item/multitool, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Jm" = ( -/obj/structure/table, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, -/obj/machinery/light/small{ +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"PM" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/black{ dir = 8 }, -/obj/machinery/button/alternate/door/bolts{ - name = "AI core door bolts" - }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"Jn" = ( -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"Jo" = ( -/obj/structure/table, -/obj/item/folder/blue, -/obj/machinery/camera/motion/ministation, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Jp" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/meter{ + id_tag = "wloop_atm_meter" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Jq" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"PN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"PO" = ( +/obj/machinery/camera/autoname{ + dir = 8 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Jr" = ( -/obj/structure/table, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ +/obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/item/aicard, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"Js" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall/r_wall, -/area/ministation/ai_upload) -"Jt" = ( -/turf/simulated/floor/plating, -/area/space) -"Ju" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Jv" = ( -/obj/machinery/light/small, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Jw" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/disposal, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"PQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Jx" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"PW" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Jy" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"PZ" = ( +/obj/machinery/door/airlock/atmos, /obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Jz" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 + icon_state = "4-8" }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"JA" = ( -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"JB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"JC" = ( -/obj/machinery/porta_turret{ +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"JD" = ( -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"JE" = ( -/obj/machinery/porta_turret{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Qa" = ( +/obj/machinery/door/blast/regular/open{ + id_tag = "smsafetydoor" }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"JF" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Qe" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"JG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +"Qg" = ( +/obj/machinery/alarm{ + pixel_y = 23 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"JH" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/smcontrol) +"Qh" = ( +/obj/structure/table/gamblingtable, +/obj/item/flashlight/lamp/green, +/turf/simulated/floor/carpet/blue2, +/area/ministation/hall/s1) +"Qj" = ( +/obj/machinery/atmospherics/binary/circulator{ + anchored = 1; + dir = 8 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"JI" = ( +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Qk" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"JJ" = ( -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"JK" = ( -/obj/machinery/flasher{ - pixel_y = -21 - }, -/obj/machinery/ai_slipper{ - uses = 10 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 }, -/obj/machinery/light, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"JL" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -23 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"JM" = ( -/obj/machinery/hologram/holopad, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"JN" = ( -/turf/simulated/wall/r_wall, -/area/ministation/ai_upload) -"JO" = ( -/obj/structure/cable, -/obj/machinery/power/tracker, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"Ql" = ( +/obj/machinery/atmospherics/binary/pump, /turf/simulated/floor/plating, -/area/space) -"JP" = ( -/obj/structure/transit_tube{ - icon_state = "N-SE" +/area/ministation/engine) +"Qn" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"Qo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/lattice, -/turf/space, -/area/space) -"JQ" = ( -/obj/structure/transit_tube{ - icon_state = "D-SW" +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 }, -/obj/structure/lattice, -/turf/space, -/area/space) -"JR" = ( /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"JS" = ( -/obj/machinery/door/firedoor{ - dir = 8 +/area/ministation/engine) +"Qq" = ( +/obj/structure/closet/crate/bin/ministation, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Qt" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/obj/effect/floor_decal/industrial/warning{ +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"JT" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/area/ministation/hall/n) +"Qv" = ( +/obj/machinery/power/supermatter, +/obj/machinery/mass_driver{ + id_tag = "eject" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"JU" = ( -/turf/simulated/wall, -/area/ministation/ai_core) -"JV" = ( +/turf/simulated/floor/reinforced/airless, +/area/ministation/supermatter) +"Qw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"JW" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 }, -/obj/item/stock_parts/circuitboard/aiupload, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"JX" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"JY" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 4 + icon_state = "4-8" }, -/obj/item/stock_parts/circuitboard/borgupload, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"JZ" = ( -/turf/simulated/wall, -/area/ministation/detective) -"Ka" = ( -/obj/structure/transit_tube{ - icon_state = "D-NE" +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Qz" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 8 }, -/turf/space, -/area/space) -"Kb" = ( -/obj/structure/transit_tube{ - icon_state = "E-NW" +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"QA" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green, +/obj/machinery/meter, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"QC" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/space, -/area/space) -"Kc" = ( -/obj/structure/lattice, -/obj/structure/transit_tube{ - icon_state = "E-W-Pass" +/obj/structure/sign/warning/vent_port{ + dir = 1; + pixel_y = -34 }, -/turf/space, -/area/space) -"Kd" = ( -/obj/structure/transit_tube, -/obj/structure/lattice, -/turf/space, -/area/space) -"Ke" = ( -/obj/structure/transit_tube, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"QE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/obj/structure/window/reinforced{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/space, -/area/ministation/ai_sat) -"Kf" = ( -/obj/structure/transit_tube, +/obj/machinery/hologram/holopad, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Kg" = ( -/obj/structure/transit_tube/station{ - dir = 1 - }, +/area/ministation/smcontrol) +"QG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Kh" = ( -/obj/structure/transit_tube{ - dir = 8; - icon_state = "Block" +/area/ministation/hall/s1) +"QH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/obj/machinery/door/firedoor{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"QM" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 9 }, /obj/effect/floor_decal/industrial/warning{ - dir = 4 + dir = 4; + icon_state = "warning" }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Ki" = ( +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"QN" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; + dir = 1; level = 2 }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"QP" = ( +/obj/machinery/door/airlock/command, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Kj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/area/ministation/eva) +"QR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"Kk" = ( -/obj/machinery/porta_turret{ +/turf/simulated/floor/pool, +/area/ministation/dorms) +"QS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Kl" = ( +/turf/simulated/floor/tiled, +/area/ministation/engine) +"QV" = ( +/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/space, +/area/space) +"QW" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, /obj/structure/cable{ icon_state = "1-2" }, -/turf/simulated/floor/bluegrid, +/turf/space, +/area/space) +"QY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/wall/r_wall, /area/ministation/ai_core) -"Km" = ( -/obj/machinery/ai_slipper{ - uses = 10 +"Ra" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/bluegrid, +/turf/simulated/wall/r_wall, /area/ministation/ai_core) -"Kn" = ( -/obj/item/radio/intercom{ - name = "Common Channel"; - pixel_x = -27; - pixel_y = 5 - }, -/obj/item/radio/intercom{ - listening = 0; - name = "Custom Channel"; - pixel_y = 27 +"Rb" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 }, -/obj/item/radio/intercom{ - frequency = 1447; - name = "Private Channel"; - pixel_x = 27; - pixel_y = 5 +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 }, -/obj/abstract/landmark/start{ - name = "AI" +/turf/simulated/floor/plating, +/area/ministation/janitor) +"Rc" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 5 }, -/obj/machinery/network/requests_console{ - department = "AI"; - pixel_x = 32; - pixel_y = 32 +/turf/simulated/floor/plating, +/area/space) +"Re" = ( +/obj/machinery/light_switch{ + pixel_y = 25 }, -/obj/machinery/newscaster{ - pixel_x = -32; - pixel_y = 32 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Rf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 + icon_state = "4-8" }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"Ko" = ( -/obj/machinery/porta_turret{ - dir = 8 +/obj/structure/sign/department/eva{ + pixel_y = 30 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Kp" = ( -/obj/structure/table, -/obj/item/aiModule/asimov, -/obj/item/aiModule/corp, -/obj/item/aiModule/dais, -/obj/item/aiModule/paladin, -/obj/item/aiModule/protectStation, -/obj/item/aiModule/quarantine, -/obj/item/aiModule/reset, -/obj/item/aiModule/robocop, -/obj/item/aiModule/safeguard, -/obj/item/aiModule/tyrant, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Kq" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Kr" = ( -/obj/machinery/computer/upload/ai{ +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/machinery/flasher{ - pixel_y = -20 +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Rg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Ks" = ( -/obj/structure/cable, -/obj/machinery/power/apc{ - areastring = null; - name = "_South APC"; - pixel_y = -24 +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_upload) -"Kt" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Station Intercom (AI Private)"; - pixel_y = -29 +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"Rh" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "cargo_vent" }, -/obj/machinery/computer/upload/robot{ +/obj/machinery/airlock_sensor{ + id_tag = "cargo2_sensor"; + pixel_y = -20; dir = 1 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Ku" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Kv" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_upload) -"Kw" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" +/turf/simulated/floor/plating, +/area/ministation/cargo) +"Rj" = ( +/obj/effect/floor_decal/industrial/warning, +/obj/effect/decal/cleanable/blood/oil, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 +/obj/structure/rack{ + dir = 8 }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"Kx" = ( -/obj/machinery/door/window/southright, -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/machinery/status_display{ + pixel_y = -32; + dir = 1 }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"Ky" = ( -/obj/structure/window/reinforced{ +/turf/simulated/floor/tiled, +/area/ministation/eva) +"Rm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/mining/brace, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Ro" = ( +/obj/structure/fitness/weightlifter, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Rp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/structure/window/reinforced, -/obj/machinery/turretid{ - name = "AI Chamber turret control"; - pixel_x = 5; - pixel_y = 24 - }, -/obj/machinery/flasher{ - pixel_x = -6; - pixel_y = 24 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Rq" = ( +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/destTagger{ + pixel_x = 4; + pixel_y = 3 }, -/obj/machinery/camera/motion/ministation, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"Kz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/wall/r_wall, -/area/ministation/ai_upload) -"KA" = ( +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Rr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Rs" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Rt" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/computer/modular/preset/engineering{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Ru" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/simulated/floor/tiled/techmaint, +/turf/simulated/wall/r_wall, /area/ministation/ai_core) -"KB" = ( +"Rv" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Rw" = ( +/obj/effect/floor_decal/corner/white{ + dir = 6 }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"KC" = ( -/obj/machinery/light{ +/obj/machinery/atmospherics/valve/open, +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"Rz" = ( +/obj/machinery/atmospherics/valve/digital{ dir = 4; - icon_state = "tube1" + name = "Emergency Cooling Valve 1" }, -/obj/machinery/computer/modular/preset/security{ - dir = 8 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"RB" = ( +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"KD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KE" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/closet/secure_closet{ + req_access = list("ACCESS_MEDICAL_EQUIP"); + closet_appearance = /decl/closet_appearance/secure_closet/medical/alt; + name = "Doctor locker" + }, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"RC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"KG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +"RD" = ( +/obj/structure/curtain/open/bed, +/obj/structure/bed/padded, +/obj/item/bedsheet/ce, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"RE" = ( +/obj/machinery/airlock_sensor{ + id_tag = "l1ne_sensor"; + pixel_y = 4; + pixel_x = -20; dir = 4 }, -/obj/machinery/alarm{ - pixel_y = 28 +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "l1ne_airlock"; + pixel_y = -4; + tag_airpump = "l1ne_vent"; + tag_chamber_sensor = "l1ne_sensor"; + tag_exterior_door = "l1ne_airlock_exterior"; + tag_interior_door = "l1ne_airlock_interior"; + dir = 4; + pixel_x = -20 }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KI" = ( +/area/ministation/maint/l1ne) +"RF" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" }, +/turf/simulated/floor/plating, +/area/space) +"RH" = ( +/obj/machinery/material_processing/stacker, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"KJ" = ( -/obj/structure/cable{ - icon_state = "1-4" +/area/ministation/trash) +"RM" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 8 }, -/obj/machinery/computer/modular/preset/medical{ - dir = 4 +/obj/machinery/portable_atmospherics/canister/air/airlock{ + pixel_x = 1 }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"KK" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"RN" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"RO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"RP" = ( +/obj/random/trash, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"KL" = ( -/obj/machinery/power/terminal, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"KM" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"RR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" }, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"KN" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"KO" = ( -/obj/machinery/light/small{ +/turf/simulated/floor/plating, +/area/ministation/trash) +"RU" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/closet/emcloset, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"RW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"KP" = ( -/obj/structure/cable{ - icon_state = "4-8" +"RX" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"RY" = ( +/mob/living/simple_animal/hostile/retaliate/parrot/Poly, +/obj/structure/table/reinforced, +/obj/item/chems/drinks/glass2/coffeecup/one, +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"Sa" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 1 }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KQ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/maint/l1ne) +"Sb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"Se" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KR" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KS" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/floor_decal/corner/yellow{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Sf" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Sg" = ( +/obj/structure/closet/crate/solar, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KT" = ( +/area/ministation/engine) +"Sj" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"KV" = ( -/obj/machinery/status_display, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"KW" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"KX" = ( /obj/structure/cable{ - icon_state = "0-8" + icon_state = "4-8" }, -/obj/machinery/power/smes/buildable/max_cap_in_out, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"KY" = ( -/obj/machinery/ai_status_display, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"KZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Sk" = ( +/obj/machinery/camera/network/ministation/sat, +/turf/simulated/floor/plating, /area/ministation/ai_sat) -"La" = ( -/obj/structure/cable{ - icon_state = "1-2" +"Sm" = ( +/obj/structure/table, +/obj/item/multitool{ + pixel_x = 5 }, -/turf/simulated/wall, -/area/ministation/ai_sat) -"Lb" = ( -/obj/structure/lattice, -/turf/space, -/area/ministation/ai_sat) -"Lc" = ( +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"So" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Sp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"Ld" = ( +"Sq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_sat) -"Le" = ( +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"Sr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Ss" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Su" = ( +/turf/simulated/floor/beach/water/ocean, +/area/ministation/dorms) +"Sv" = ( +/obj/machinery/light{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Lf" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Sw" = ( +/obj/structure/cable, /obj/machinery/power/apc{ - dir = 8; - name = "MiniSat Maint APC"; - pixel_x = -24 + name = "SM APC"; + pixel_x = -27; + pixel_y = null; + dir = 8 }, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lg" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 3 +/area/ministation/smcontrol) +"SB" = ( +/obj/machinery/door/blast/regular{ + id_tag = "EngineVent" }, -/obj/item/storage/toolbox/mechanical, -/obj/item/multitool, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lh" = ( -/obj/machinery/alarm{ - pixel_y = 23 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"SD" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Li" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 10 }, -/obj/machinery/power/smes/buildable/max_cap_in_out, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lj" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" +/area/ministation/engine) +"SE" = ( +/obj/abstract/landmark/start{ + name = "Assistant" }, -/obj/machinery/camera/network/ministation/sat, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lk" = ( -/obj/structure/rack, -/obj/item/crowbar/red, -/obj/item/wrench, +/obj/machinery/camera/autoname, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"SF" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Ll" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = 28 +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/obj/structure/sign/warning/vent_port{ + dir = 1; + pixel_y = -34 }, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lm" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/area/ministation/engine) +"SI" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 8 }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"Ln" = ( -/obj/structure/cable{ - icon_state = "1-4" +"SJ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled, +/area/ministation/smcontrol) +"SM" = ( +/obj/machinery/light_switch{ + pixel_y = 26; + dir = 4; + pixel_x = -23 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lp" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/obj/structure/bed/chair/office, +/turf/simulated/floor/tiled, +/area/ministation/smcontrol) +"SO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 }, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lq" = ( -/obj/structure/sign/department/cargo{ - dir = 1; - pixel_y = -32 +/area/ministation/cargo) +"SQ" = ( +/obj/machinery/alarm{ + pixel_y = 23 }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"SR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 5 }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Ls" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, +/area/ministation/cargo) +"ST" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"Lt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, /turf/simulated/floor/tiled, -/area/ministation/cargo) -"Lu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/area/ministation/engine) +"SU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"Lv" = ( +"SV" = ( /obj/machinery/alarm{ - dir = 4; - pixel_x = -23 + dir = 8; + pixel_x = 24 }, /obj/machinery/light/small{ - dir = 8 + dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lw" = ( -/obj/abstract/landmark{ - name = "xeno_spawn"; - pixel_x = -1 +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"SW" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 5 }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lx" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 +/obj/machinery/camera/network/engineering, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"SZ" = ( +/obj/machinery/light/small{ + dir = 1 }, -/turf/simulated/floor/tiled, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/obj/machinery/atmospherics/portables_connector, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Tb" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l1central) +"Td" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 1 + }, +/turf/simulated/floor/plating, /area/ministation/ai_sat) -"Ly" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 +"Tg" = ( +/obj/structure/cable{ + icon_state = "2-4" }, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"Lz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/area/ministation/engine) +"Ti" = ( +/obj/structure/filing_cabinet, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Tj" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" }, /turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LA" = ( +/area/ministation/engine) +"Tl" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 32 +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + id_tag = "stern_engineering_airlock_interior"; + locked = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LB" = ( -/obj/machinery/recharge_station, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LC" = ( -/obj/structure/table, -/obj/item/stack/material/pane/mapped/glass/fifty, -/obj/item/stack/cable_coil/yellow, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LD" = ( -/obj/item/stool, -/obj/item/radio, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LE" = ( -/obj/structure/bed, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Tp" = ( /obj/structure/table, -/obj/machinery/recharger, -/obj/item/stack/material/puck/mapped/uranium/ten, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LG" = ( -/obj/machinery/port_gen/pacman, -/obj/structure/cable, -/turf/simulated/floor/tiled, -/area/ministation/ai_sat) -"LI" = ( -/obj/machinery/light{ - dir = 1 +/obj/item/stack/material/cardstock/mapped/cardboard/fifty, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, +/obj/item/stack/material/pane/mapped/glass/ten, +/obj/item/stack/material/sheet/mapped/steel/ten, +/obj/item/stack/material/shiny/mapped/aluminium/ten, +/obj/machinery/camera/network/mining, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"LJ" = ( -/obj/effect/shuttle_landmark/supply/station, -/turf/space, -/area/ministation/supply_dock) -"LL" = ( +/area/ministation/cargo) +"Tt" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LM" = ( -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"LP" = ( -/obj/effect/floor_decal/corner/purple{ +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "starboard_engineering_airlock"; + pixel_y = 24; + tag_airpump = "starboard_engineering_vent"; + tag_chamber_sensor = "starboard_engineering_sensor"; + tag_exterior_door = "starboard_engineering_airlock_exterior"; + tag_interior_door = "starboard_engineering_airlock_interior" + }, +/obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LQ" = ( -/obj/machinery/camera/autoname{ - dir = 4 +/turf/simulated/floor/plating, +/area/ministation/engine) +"Tu" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Tv" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 1; + id_tag = "atmos_vent" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/airlock_sensor{ + id_tag = "atmos_sensor"; + pixel_y = 4; + pixel_x = -20; dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "atmos_airlock"; + tag_airpump = "atmos_vent"; + tag_chamber_sensor = "atmos_sensor"; + tag_exterior_door = "atmos_airlock_exterior"; + tag_interior_door = "atmos_airlock_interior"; + dir = 4; + pixel_x = -20; + pixel_y = -4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Tw" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LT" = ( +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Tx" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 4 }, -/obj/structure/sign/department/forensics{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LU" = ( -/obj/random/trash, /turf/simulated/floor/plating, -/area/ministation/disused) -"LV" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-8" +/area/space) +"Ty" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled/freezer{ - name = "kitchen freezer floor"; - temperature = 263 - }, -/area/ministation/cafe) -"LY" = ( -/obj/effect/floor_decal/corner/purple{ - dir = 6 + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Tz" = ( +/obj/machinery/camera/network/engineering{ + dir = 1; + name = "Tank Storage" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"LZ" = ( +/turf/simulated/floor/plating, +/area/ministation/engine) +"TA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Ma" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Mb" = ( -/obj/effect/floor_decal/corner/purple{ - dir = 6 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"TB" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 }, -/obj/structure/sign/department/science_2{ - pixel_x = 31 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"TC" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Mc" = ( -/obj/machinery/light{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Md" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/light{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Me" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/light{ +/obj/structure/disposalpipe/junction/mirrored{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Mf" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 + icon_state = "4-8" }, -/obj/structure/closet/crate/bin/ministation, /turf/simulated/floor/tiled, /area/ministation/hall/n) -"Mg" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" +"TH" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hall/s1) +"TJ" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 8; + name = "disposals ejection chute" }, -/obj/machinery/portable_atmospherics/canister/hydrogen, -/obj/machinery/light{ +/obj/structure/disposalpipe/trunk{ dir = 1 }, /turf/simulated/floor/plating, -/area/ministation/engine) -"Mh" = ( -/obj/structure/window/reinforced{ +/area/ministation/trash) +"TK" = ( +/obj/structure/rack{ dir = 8 }, -/obj/structure/window/reinforced{ +/obj/item/clothing/suit/storage/hazardvest, +/obj/item/tank/emergency/oxygen/engi, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"TL" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, -/obj/machinery/conveyor{ - id_tag = "CanisterStore" - }, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/light{ - dir = 1 +/obj/machinery/door/blast/regular/open{ + id_tag = "smsafetydoor" }, /turf/simulated/floor/plating, -/area/ministation/engine) -"Mi" = ( -/obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/floor_decal/corner/green/full, -/obj/machinery/light{ - dir = 8 +/area/ministation/supermatter) +"TM" = ( +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"Mj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Mk" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, +/area/space) +"TO" = ( /obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"Ml" = ( /obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200 + target_pressure = 200; + dir = 4 }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Mm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Mn" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/engine) +"TP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/newscaster{ + pixel_x = 32; dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"TR" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/random/trash, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"Mq" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 +/area/ministation/maint/l1central) +"TT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 5 }, /turf/simulated/floor/tiled, -/area/ministation/cargo) -"Ms" = ( -/obj/item/radio/intercom{ - dir = 8; - pixel_x = 20 +/area/ministation/engine) +"TX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut, -/obj/item/folder, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/carpet/red, -/area/ministation/court) -"Mt" = ( -/obj/machinery/atmospherics/pipe/simple/visible{ +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"TY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/structure/cable{ - icon_state = "2-8" - }, -/turf/simulated/floor/airless, -/area/space) -"Mw" = ( -/obj/machinery/cryopod{ - dir = 1 + icon_state = "1-8" }, -/obj/abstract/landmark/latejoin/cryo, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"Mx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"MA" = ( -/obj/structure/closet/secure_closet/courtroom, /turf/simulated/floor/tiled, -/area/ministation/court) -"MB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/light{ - dir = 4 +/area/ministation/engine) +"TZ" = ( +/obj/structure/sign/warning/vent_port{ + pixel_y = 28 }, +/turf/space, +/area/space) +"Ua" = ( +/obj/structure/table/woodentable, +/obj/item/clothing/mask/snorkel, +/obj/item/clothing/mask/snorkel, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"Uc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/portables_connector, +/obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"MC" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 +/area/ministation/engine) +"Ue" = ( +/obj/structure/table/gamblingtable, +/obj/machinery/chemical_dispenser/bar_alc/full, +/turf/simulated/floor/wood/yew, +/area/ministation/engine) +"Ug" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 1 }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"MD" = ( -/obj/item/stool/padded, -/obj/structure/sign/warning/nosmoking_2{ - pixel_y = 32 +/obj/machinery/meter, +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"MF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Uh" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Ui" = ( +/turf/simulated/floor/reinforced/airless, +/area/ministation/supermatter) +"Uj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" }, /turf/simulated/floor/plating, -/area/ministation/maint/nw) -"MG" = ( -/obj/structure/bed/chair, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 +/area/ministation/supermatter) +"Ul" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"MH" = ( -/obj/structure/table, -/obj/item/implantcase/tracking, -/obj/item/implantcase/chem, -/obj/item/implanter, -/obj/machinery/light{ +/area/ministation/engine) +"Um" = ( +/obj/random/trash, +/obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/security) -"MI" = ( -/obj/abstract/landmark/latejoin/cyborg, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"MJ" = ( -/obj/structure/bed, -/obj/item/bedsheet/purple, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"MK" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 4 +/area/ministation/engine) +"Ur" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"MM" = ( -/obj/machinery/door/firedoor{ +/obj/machinery/atmospherics/pipe/manifold/visible/black{ dir = 8 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Uu" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"MN" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/maint/nw) -"MO" = ( -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"MP" = ( -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 32 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"MQ" = ( -/obj/structure/closet, -/obj/item/gun/launcher/crossbow, -/obj/item/arrow, -/obj/item/arrow, -/obj/item/cell/crap, -/obj/item/storage/briefcase, -/obj/machinery/firealarm{ +/area/space) +"Ux" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 + level = 2 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 }, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"MT" = ( -/obj/machinery/door/firedoor{ - dir = 8 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"UA" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"UC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"UG" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 }, -/obj/machinery/door/airlock/double/glass/mining, +/obj/machinery/suit_cycler/ministation, /turf/simulated/floor/tiled, -/area/ministation/cargo) -"MU" = ( -/obj/structure/table/woodentable, -/obj/item/storage/pill_bottle/dice, +/area/ministation/eva) +"UI" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"UJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"MV" = ( +/area/ministation/supermatter) +"UK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/light{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"MY" = ( +/turf/simulated/floor/pool, +/area/ministation/dorms) +"UO" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 + icon_state = "1-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Na" = ( -/obj/effect/floor_decal/corner/blue{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 }, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -23 +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"US" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -21 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/green, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"UT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 1 }, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"Nc" = ( -/obj/machinery/light{ +/area/ministation/engine) +"UU" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4 }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Ne" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ - dir = 6 - }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"Nh" = ( -/obj/structure/sign/directions/engineering{ - pixel_x = -32; - pixel_y = -32 +/area/ministation/engine) +"UV" = ( +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "mining_airlock"; + pixel_y = -4; + tag_airpump = "mining_vent"; + tag_chamber_sensor = "mining_sensor"; + tag_exterior_door = "mining_airlock_exterior"; + tag_interior_door = "mining_airlock_interior"; + dir = 4; + pixel_x = -20 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/machinery/airlock_sensor{ + id_tag = "mining_sensor"; + pixel_y = 10; + pixel_x = -20; + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ni" = ( +/turf/simulated/floor/plating, +/area/ministation/cargo) +"UX" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/portables_connector, -/obj/machinery/portable_atmospherics/canister/air/airlock{ - pixel_x = 1 +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/turf/simulated/floor/plating, +/area/space) +"UY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/turf/simulated/floor/plating, +/area/space) +"Vb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Nj" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Vc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"Ve" = ( +/obj/abstract/landmark/start{ + name = "Station Engineer" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"No" = ( +/area/ministation/engine) +"Vf" = ( +/obj/structure/curtain/open/bed, +/obj/structure/bed/padded, +/obj/item/bedsheet/ce, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Vj" = ( /obj/machinery/light{ - dir = 8 + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/camera/network/security{ - dir = 4 +/turf/simulated/floor/pool, +/area/ministation/dorms) +"Vk" = ( +/obj/structure/lattice, +/obj/structure/transit_tube{ + icon_state = "N-S-Pass" }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Np" = ( -/obj/structure/cable{ - icon_state = "2-4" +/turf/space, +/area/space) +"Vl" = ( +/obj/structure/closet, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Vm" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Ns" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 +/obj/machinery/camera/network/engineering{ + dir = 8; + name = "SM Command" }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Nt" = ( -/obj/structure/flora/pottedplant/smalltree, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Nu" = ( -/obj/machinery/airlock_sensor{ - id_tag = "escape2_sensor"; - pixel_y = -20 +/area/ministation/smcontrol) +"Vq" = ( +/obj/machinery/merchant_pad, +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "escape1_vent" +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, -/turf/simulated/floor/plating, -/area/ministation/hall/w) -"Nv" = ( -/obj/machinery/door/airlock/glass, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled, -/area/ministation/disused) -"Nw" = ( /turf/simulated/floor/tiled, -/area/ministation/court) -"Ny" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = -32 +/area/ministation/cargo) +"Vr" = ( +/obj/machinery/atmospherics/valve/digital{ + dir = 4; + name = "Emergency Cooling Valve 1" }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Nz" = ( -/obj/machinery/suit_cycler, -/turf/simulated/floor, -/area/ministation/atmospherics) -"NA" = ( -/obj/structure/lattice, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Vx" = ( +/obj/machinery/door/airlock/hatch/maintenance, /obj/structure/cable{ icon_state = "1-2" }, -/turf/space, -/area/space) -"NC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/filth, /turf/simulated/floor/plating, -/area/ministation/maint/e) -"ND" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/area/ministation/engine) +"Vy" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"NF" = ( -/obj/machinery/power/sensor{ - id_tag = "station powernet"; - name = "Powernet Sensor - Main Powernet" +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"VA" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sat1_airlock_interior" }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/button/access/interior{ + id_tag = "sat1_airlock"; + name = "interior access button"; + pixel_y = 24 }, -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"NH" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 +/area/ministation/ai_sat) +"VC" = ( +/obj/machinery/atmospherics/binary/pump{ + dir = 8 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"VF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"NI" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden{ +/area/ministation/hall/s1) +"VH" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"NJ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/obj/machinery/door/airlock/double/glass/atmos{ + req_access = list("ACCESS_ENGINEERING"); + autoset_access = 0; dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/turf/simulated/floor/plating, +/area/ministation/engine) +"VJ" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"NK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/effect/decal/cleanable/blood/oil, /turf/simulated/floor/plating, -/area/ministation/maint/sw) -"NL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 +/area/ministation/maint/l1ne) +"VK" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable{ + icon_state = "1-8" }, +/turf/simulated/floor/bluegrid, +/area/ministation/ai_core) +"VL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, -/area/ministation/disused) -"NO" = ( -/obj/abstract/level_data_spawner/main_level{ - name = "Outpost Zebra"; -}, -/turf/space, -/area/space) -"NR" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/area/ministation/trash) +"VM" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 8 }, -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_x = -32; - pixel_y = 32 +/turf/space, +/area/space) +"VO" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"NT" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/airless, +/area/space) +"VP" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/black, /turf/simulated/floor/plating, -/area/ministation/maint/nw) -"NU" = ( -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - dir = 1; - id_tag = "sat2_airlock"; - pixel_y = -24; - tag_airpump = "sat2_vent"; - tag_chamber_sensor = "sat2_sensor"; - tag_exterior_door = "sat2_airlock_exterior"; - tag_interior_door = "sat2_airlock_interior" +/area/ministation/supermatter) +"VR" = ( +/obj/machinery/fabricator, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"VT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"VV" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; - id_tag = "sat2_vent" - }, -/obj/machinery/airlock_sensor{ - id_tag = "sat2_sensor"; - pixel_y = -20; - pixel_x = -10 + level = 2 }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"NW" = ( -/obj/effect/decal/cleanable/dirt{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"NX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 +"VX" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Oc" = ( -/obj/effect/floor_decal/corner/blue{ - dir = 10 +/obj/structure/sign/warning/vent_port{ + dir = 1; + pixel_y = -34 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/black, /turf/simulated/floor/tiled, -/area/ministation/bridge) -"Od" = ( -/obj/structure/bed/chair/wood/walnut{ +/area/ministation/engine) +"VZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Of" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Oh" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 +/obj/effect/floor_decal/corner/yellow{ + dir = 10 }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Oi" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Om" = ( -/obj/item/stool, -/obj/machinery/alarm{ - pixel_y = 22 +/area/ministation/hall/s1) +"Wa" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastexterior" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/ministation/library) -"On" = ( +/area/ministation/supermatter) +"Wb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Wc" = ( +/obj/structure/closet/crate, +/obj/item/stack/material/ore/sand, +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Wd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/sign/warning/high_voltage{ - pixel_y = 32 +/obj/machinery/status_display{ + pixel_y = -32; + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Wj" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/blast_door{ + desc = "A remote control-switch for the engine charging port."; + id_tag = "SupermatterPort"; + name = "Reactor Blast Doors"; + pixel_x = -6; + pixel_y = 7; + dir = 1; + directional_offset = null }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Oo" = ( -/turf/simulated/wall{ - can_open = 1 +/obj/machinery/button/blast_door{ + desc = "A remote control-switch for the engine control room blast doors."; + id_tag = "EngineBlastexterior"; + name = "Engine Bay Blast Doors"; + pixel_y = -3; + pixel_x = 5; + dir = 1; + directional_offset = null }, -/area/ministation/maint/w) -"Oq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock/double/glass/security{ - id_tag = "secdoor"; - name = "security outer airlock" +/obj/machinery/button/blast_door{ + desc = "A remote control-switch for the engine control room blast doors."; + id_tag = "EngineBlastinterior"; + name = "Engine Monitoring Room Blast Doors"; + pixel_y = -3; + pixel_x = -6; + dir = 1; + directional_offset = null }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Or" = ( -/obj/random/trash, -/obj/machinery/atmospherics/portables_connector, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Os" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/machinery/button/toggle{ + desc = "A remote control-switch for the engine emitter."; + id_tag = "EngineEmitter"; + name = "Engine Emitter"; + pixel_x = 6; + pixel_y = 7; + dir = 1; + directional_offset = null }, -/turf/simulated/wall, -/area/ministation/hall/w) -"Ou" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/smcontrol) +"Wk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/sign/department/security/alt{ +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"Wn" = ( +/obj/structure/sign/plaque/atmos{ pixel_y = 32 }, +/obj/structure/closet/emcloset, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Ov" = ( -/obj/structure/table/woodentable/walnut, -/obj/machinery/light, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Ow" = ( -/obj/machinery/camera/network/mining{ - dir = 1 - }, -/turf/simulated/floor/airless, -/area/space) -"Ox" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "_East APC"; - pixel_x = 27; - pixel_y = 2 - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/engine) +"Wr" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green, +/obj/machinery/camera/network/engineering{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"OB" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 +/area/ministation/engine) +"Ws" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/vehicle/train/cargo/engine, +/turf/simulated/floor/tiled, +/area/ministation/cargo) +"Wt" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "bulb1" }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/structure/mirror{ + pixel_y = 29 }, -/obj/machinery/alarm{ +/obj/structure/hygiene/sink{ + pixel_y = 23 + }, +/obj/structure/window/reinforced/tinted{ dir = 8; - pixel_x = 24 + icon_state = "twindow" }, -/turf/simulated/floor/plating, -/area/ministation/disused_office) -"OC" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/window/reinforced/tinted{ + dir = 4; + icon_state = "twindow" }, -/turf/simulated/floor/plating, -/area/ministation/maint/detective) -"OD" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/disused_office) -"OF" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor, -/area/ministation/atmospherics) -"OL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"OM" = ( -/obj/item/stool/padded, -/obj/machinery/light/small{ - dir = 4 +/obj/structure/window/reinforced/tinted{ + dir = 1 }, -/obj/abstract/landmark/start{ - name = "Librarian" +/obj/structure/window/reinforced/tinted{ + dir = 8; + icon_state = "twindow" }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"OO" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "sat3_airlock_exterior" +/obj/machinery/atmospherics/unary/vent_pump/on{ + level = 2 }, -/obj/machinery/button/access/interior{ - id_tag = "sat3_airlock"; - name = "exterior access button"; - pixel_x = -10; - pixel_y = 20; - command = "cycle_exterior" +/obj/item/hemostat, +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"Wv" = ( +/obj/item/toy/ringbell, +/obj/structure/table/steel, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Wx" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"OP" = ( +/area/ministation/supermatter) +"Wy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 6 }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"OQ" = ( -/obj/machinery/door/airlock/glass/command{ - autoset_access = 0; - name = "Telecommunications relay airlock"; - req_access = list("ACCESS_TELECOMS") +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"OR" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "mining_airlock_exterior" +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"Wz" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 1 }, -/obj/machinery/button/access/interior{ - id_tag = "cargo_airlock"; - name = "exterior access button"; - pixel_x = -20; - pixel_y = 10; - command = "cycle_exterior" +/turf/space, +/area/space) +"WB" = ( +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"WE" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction, +/turf/space, +/area/space) +"WF" = ( +/obj/effect/floor_decal/industrial/custodial{ + dir = 1 }, -/turf/simulated/floor/airless, -/area/ministation/cargo) -"OT" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - locked = 1; - id_tag = "escape1_airlock_interior" +/turf/simulated/floor/plating, +/area/ministation/trash) +"WJ" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ministation/engine) +"WK" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"WM" = ( +/obj/machinery/door/airlock/double/glass/civilian, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"WO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/eva) +"WR" = ( +/obj/machinery/conveyor{ + dir = 8; + id_tag = "trash_sort" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" }, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"OU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/area/ministation/trash) +"WS" = ( +/obj/structure/cable/cyan{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"OV" = ( +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"WU" = ( +/turf/simulated/floor, +/area/space) +"WW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/floor_decal/corner/red{ - dir = 4 - }, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ icon_state = "4-8" }, +/turf/simulated/floor/plating, +/area/ministation/maint/eastatmos) +"WY" = ( +/obj/item/mollusc/barnacle{ + pixel_x = 20 + }, +/turf/space, +/area/space) +"Xb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/green{ + dir = 4 + }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"OW" = ( +/area/ministation/engine) +"Xc" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/sign/directions/evac{ - dir = 8; - pixel_x = -32; - pixel_y = 25 +/obj/machinery/atmospherics/pipe/manifold/visible/black{ + dir = 8 }, -/obj/structure/sign/directions/supply{ +/turf/simulated/floor/plating, +/area/space) +"Xf" = ( +/obj/machinery/atmospherics/unary/outlet_injector{ dir = 1; - pixel_x = -32; - pixel_y = 32 + icon_state = "map_injector"; + id_tag = "cooling_in"; + name = "Coolant Injector"; + pixel_y = 1; + power_rating = 30000; + use_power = 1; + volume_rate = 700 + }, +/turf/simulated/floor/reinforced/airless, +/area/ministation/supermatter) +"Xg" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8 }, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"OX" = ( -/obj/machinery/door/airlock/external{ - autoset_access = 0; - id_tag = "atmos_airlock_interior"; - locked = 1 +/area/ministation/hall/n) +"Xh" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 9 }, -/obj/machinery/button/access/interior{ - id_tag = "atmos_airlock"; - name = "interior access button"; - pixel_x = 20; - pixel_y = 10 +/obj/machinery/atmospherics/pipe/manifold/hidden/green, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Xi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"Xj" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor, -/area/ministation/atmospherics) -"OY" = ( -/obj/machinery/camera/network/medbay{ +/area/ministation/maint/eastatmos) +"Xk" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, -/turf/simulated/floor/tiled/dark, -/area/ministation/medical) -"Pa" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Pc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/tiled, +/area/ministation/engine) +"Xm" = ( +/obj/structure/hygiene/toilet{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Pd" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/window/reinforced/tinted{ + dir = 8; + icon_state = "twindow" }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"Pe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 +/obj/structure/window/reinforced/tinted{ + dir = 4; + icon_state = "twindow" }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"Pg" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/window/reinforced/tinted, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Pi" = ( -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/power/apc{ - dir = 8; - name = "_West APC"; - pixel_x = -25 +/turf/simulated/floor/tiled/freezer, +/area/ministation/dorms) +"Xo" = ( +/obj/structure/table/reinforced, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Xt" = ( +/obj/machinery/turretid{ + control_area = "\improper AI Upload Chamber"; + name = "AI Upload turret control"; + pixel_y = -25; + dir = 1 }, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/maint/detective) -"Pj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"Pk" = ( -/obj/structure/table/woodentable/walnut, -/obj/item/folder/blue, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Pl" = ( -/obj/structure/sign/warning/airlock{ - pixel_x = 32 +/area/ministation/ai_sat) +"Xu" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, /area/ministation/cargo) -"Po" = ( -/obj/machinery/photocopier, -/obj/item/radio/intercom{ - dir = 8; - pixel_x = 20 +"Xx" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/n) +"Xz" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/hidden/black, /turf/simulated/floor/tiled, -/area/ministation/court) -"Pp" = ( -/turf/space, -/area/ministation/supply_dock) -"Pr" = ( +/area/ministation/engine) +"XA" = ( /obj/machinery/door/airlock/external/glass{ autoset_access = 0; name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); locked = 1; - id_tag = "pfm_airlock_exterior" + id_tag = "westatmos_airlock_interior" }, /obj/machinery/button/access/interior{ - id_tag = "pfm_airlock"; - name = "exterior access button"; - pixel_x = -10; - pixel_y = 20; - command = "cycle_exterior" + id_tag = "westatmos_airlock"; + name = "interior access button"; + pixel_x = 20; + dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plating, -/area/ministation/maint/nw) -"Pu" = ( -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 +/area/ministation/maint/westatmos) +"XB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/wall/r_wall, +/area/ministation/ai_upload) +"XC" = ( +/obj/machinery/light{ + dir = 4 }, +/obj/machinery/emitter, /turf/simulated/floor/plating, -/area/ministation/disused) -"Px" = ( -/obj/structure/table/woodentable/walnut, -/obj/item/folder/red, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/area/ministation/engine) +"XE" = ( +/obj/structure/cable/cyan{ + icon_state = "4-8" }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Py" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"XF" = ( +/obj/machinery/drone_fabricator/construction, +/turf/simulated/floor/plating, +/area/ministation/engine) +"XI" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 6 + }, +/obj/structure/lattice, +/turf/space, +/area/space) +"XK" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"PA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"PB" = ( -/obj/structure/table/woodentable, -/obj/machinery/fabricator/book, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"PC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/area/space) +"XL" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/pool, +/area/ministation/dorms) +"XO" = ( +/obj/structure/lattice, +/turf/simulated/wall/r_wall, +/area/ministation/engine) +"XQ" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"XR" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"XT" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"PD" = ( -/turf/simulated/wall/r_wall, -/area/ministation/atmospherics) -"PE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"XU" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"PF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 4 }, -/obj/random/trash, -/turf/simulated/floor/tiled, +/turf/simulated/floor/tiled/steel_grid, /area/ministation/engine) -"PH" = ( +"XV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/obj/effect/floor_decal/industrial/warning{ + dir = 4 }, -/obj/random/trash, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"PI" = ( +/area/ministation/cargo) +"XW" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/detective) -"PK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 + icon_state = "1-4" }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 4 }, +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"XZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/item/stool/padded, /turf/simulated/floor/tiled, -/area/ministation/engine) -"PM" = ( +/area/ministation/cargo) +"Yi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/floor_decal/corner/red{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/light/small{ + dir = 1 }, +/turf/simulated/floor/plating, +/area/ministation/maint/westatmos) +"Ym" = ( /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"PN" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - locked = 1; - id_tag = "escape1_airlock_exterior" +/area/ministation/eva) +"Yr" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 10 }, +/obj/structure/lattice, +/turf/space, +/area/space) +"Ys" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/visible/black, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"PP" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/item/flashlight, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"PR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/area/ministation/engine) +"Yt" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "port_engineering_vent" + }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Yu" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "2-8" }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"PT" = ( -/obj/structure/table/woodentable_reinforced/walnut, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/area/ministation/engine) +"Yv" = ( +/obj/structure/railing/mapped{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Yx" = ( +/obj/effect/floor_decal/industrial/custodial{ dir = 4 }, -/turf/simulated/floor/carpet/red, -/area/ministation/court) -"PV" = ( -/obj/structure/table, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/obj/item/modular_computer/tablet/preset/custom_loadout/cheap, -/obj/item/mollusc/clam, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"PX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 2 +/obj/machinery/light/small{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"PY" = ( -/obj/machinery/airlock_sensor{ - id_tag = "escape1_sensor"; - pixel_y = -20 +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "escape1_vent" +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"Qb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ +/area/ministation/trash) +"Yy" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ dir = 4 }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Qh" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/effect/floor_decal/corner/blue/diagonal, +/obj/effect/floor_decal/corner/blue/diagonal{ dir = 4 }, -/obj/machinery/light{ +/turf/simulated/floor/reinforced/oxygen, +/area/ministation/atmospherics) +"Yz" = ( +/obj/machinery/atmospherics/unary/heat_exchanger{ dir = 1 }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Qi" = ( -/obj/effect/decal/cleanable/filth, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, /turf/simulated/floor/plating, -/area/ministation/disused) -"Qk" = ( +/area/ministation/supermatter) +"YA" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 10 }, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Qm" = ( -/obj/machinery/cryopod/robot, -/obj/machinery/computer/cryopod/robot{ - pixel_y = -32 +/area/ministation/engine) +"YC" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"Qp" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/engine) +"YD" = ( +/obj/structure/cable/cyan{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"Qq" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"Qr" = ( -/obj/effect/decal/cleanable/filth, -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, +/area/ministation/supermatter) +"YE" = ( +/obj/machinery/atmospherics/portables_connector, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/portable_atmospherics/canister/empty, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"Qu" = ( +/area/ministation/supermatter) +"YF" = ( /obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"Qw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + icon_state = "1-4" }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Qy" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + icon_state = "1-2" }, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"Qz" = ( -/obj/effect/wallframe_spawn/no_grille, -/obj/structure/sign/department/botany, -/turf/simulated/floor/tiled, -/area/ministation/hydro) -"QA" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 8 +/area/space) +"YG" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sat3_airlock_interior" }, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"QB" = ( -/obj/machinery/light, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"QC" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor, -/area/ministation/atmospherics) -"QD" = ( -/obj/structure/table/woodentable, -/obj/item/book/printable_red, -/obj/item/pen, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"QF" = ( -/obj/machinery/camera/network/medbay{ - dir = 4 +/obj/machinery/button/access/interior{ + id_tag = "sat3_airlock"; + name = "interior access button"; + pixel_y = 24 }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"QG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"QI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/camera/network/ministation/sat{ - dir = 1 - }, /turf/simulated/floor/plating, /area/ministation/ai_sat) -"QJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +"YJ" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"QL" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor, -/obj/machinery/door/blast/shutters/open{ - id_tag = "secshut"; - name = "security shutter" +/area/ministation/engine) +"YK" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 }, -/turf/simulated/floor/plating, -/area/ministation/security) -"QN" = ( -/obj/structure/sign/department/id_office{ - dir = 1; - pixel_y = -32 +/obj/item/pen, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 }, +/obj/item/janicart_key, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"QO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"QP" = ( -/obj/machinery/door/firedoor, -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/server_room, -/turf/simulated/floor/plating, -/area/ministation/science) -"QQ" = ( -/obj/structure/table/woodentable, -/obj/random/cash, -/obj/item/deck/cards, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"QR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/area/ministation/janitor) +"YM" = ( +/obj/effect/floor_decal/corner/blue, +/obj/effect/floor_decal/corner/yellow{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/atmospherics/binary/passive_gate/on{ + dir = 1; + name = "Air to Supply" }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"QS" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/camera/network/engineering{ + dir = 8; + name = "Atmospherics" }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/turf/simulated/floor/tiled/techfloor, +/area/ministation/atmospherics) +"YN" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastexterior" }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"QU" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"QV" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/item/clothing/accessory/toggleable/checkered_jacket, -/obj/item/storage/box/lights, -/obj/random/suit, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"QW" = ( -/obj/machinery/firealarm, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"QX" = ( -/obj/effect/decal/cleanable/blood/oil, /turf/simulated/floor/plating, -/area/ministation/maint/ne) -"QY" = ( +/area/ministation/supermatter) +"YT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"QZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Ra" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/turf/simulated/wall/r_wall, -/area/ministation/ai_core) -"Rb" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -32 - }, -/obj/abstract/landmark/latejoin/cryo, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"Rd" = ( -/obj/machinery/light/small{ +/obj/machinery/camera/network/ministation/sat, +/turf/simulated/floor/plating, +/area/ministation/ai_sat) +"YU" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ministation/maint/se) -"Re" = ( -/obj/machinery/light_switch{ - pixel_y = 25 - }, -/turf/simulated/floor/tiled, /area/ministation/engine) -"Rf" = ( -/obj/machinery/door/airlock/civilian{ - autoset_access = 0; - name = "Librarian's Chamber"; - req_access = list("ACCESS_LIBRARY") - }, -/turf/simulated/floor/plating, -/area/ministation/library) -"Rh" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ +"YV" = ( +/obj/machinery/light{ dir = 4; - id_tag = "cargo_vent" - }, -/obj/machinery/airlock_sensor{ - id_tag = "cargo2_sensor"; - pixel_y = -20 + icon_state = "tube1" }, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"Ri" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/disposalpipe/junction{ + dir = 8; + icon_state = "pipe-j2" }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Rj" = ( -/obj/machinery/light{ - dir = 4 +/obj/abstract/landmark/start{ + name = "Assistant" }, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"YW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Rl" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"Rm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Rn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Rq" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "cargo_vent" - }, -/obj/machinery/airlock_sensor{ - id_tag = "cargo_sensor"; - pixel_y = -20 - }, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"Rr" = ( -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Rs" = ( -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Rt" = ( +/area/ministation/engine) +"YY" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Rv" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/ministation/eva) +"Za" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/black{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/turf/simulated/floor/plating, +/area/ministation/supermatter) +"Zd" = ( +/obj/effect/floor_decal/corner/yellow/diagonal, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Rw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/engine) +"Ze" = ( +/obj/machinery/door/airlock/external{ + locked = 1; + id_tag = "atmos_airlock_exterior"; + autoset_access = 0 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/button/access/interior{ + id_tag = "atmos_airlock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/wood, -/area/ministation/cafe) -"Rx" = ( -/turf/simulated/wall, -/area/ministation/court) -"Ry" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Zf" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"RB" = ( -/obj/effect/decal/cleanable/blood/oil, +/obj/abstract/landmark/start{ + name = "Assistant" + }, +/obj/item/stool/padded, +/turf/simulated/floor/carpet/green, +/area/ministation/dorms) +"Zg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/camera/autoname, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"Zh" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"RC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/yellow, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/smcontrol) +"Zi" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + id_tag = "EngineBlastexterior" }, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"RD" = ( -/turf/simulated/wall/r_wall, -/area/ministation/cryo) -"RF" = ( -/obj/random/trash, +/area/ministation/supermatter) +"Zk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"RG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"RH" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/random/gloves, -/obj/item/clothing/accessory/toggleable/hawaii, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"RI" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled, -/area/ministation/hall/s) -"RJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/external/glass{ - id_tag = "port_engineering_airlock_exterior"; - locked = 1; - autoset_access = 0 - }, -/obj/machinery/button/access/interior{ - id_tag = "port_engineering_airlock"; - name = "exterior access button"; - pixel_x = -10; - pixel_y = 20; - command = "cycle_exterior" +/area/ministation/cargo) +"Zn" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/green{ + dir = 4 }, /turf/simulated/floor/plating, /area/ministation/engine) -"RK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"RM" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/air/airlock{ - pixel_x = 1 +"Zo" = ( +/obj/machinery/atmospherics/pipe/simple/visible/universal{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"RN" = ( -/obj/effect/floor_decal/corner/paleblue{ +/obj/effect/floor_decal/corner/blue{ dir = 10 }, -/obj/structure/sign/department/chemistry{ - pixel_x = 32; - pixel_y = -5 +/turf/simulated/floor/tiled/techfloor/grid, +/area/ministation/atmospherics) +"Zp" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/hall/e) -"RO" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/turf/simulated/floor/plating, +/area/ministation/engine) +"Zv" = ( +/obj/structure/ladder, +/turf/simulated/floor, +/area/ministation/maint/eastatmos) +"Zx" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/effect/decal/cleanable/blood/oil, +/obj/machinery/camera/motion/ministation, +/turf/simulated/floor/tiled/techmaint, +/area/ministation/ai_core) +"Zz" = ( +/obj/structure/closet/boxinggloves, +/turf/simulated/floor/wood/walnut, +/area/ministation/dorms) +"ZA" = ( /obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"RP" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" - }, -/obj/random/trash, /turf/simulated/floor/tiled, -/area/ministation/engine) -"RQ" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/area/ministation/cargo) +"ZG" = ( +/obj/machinery/button/blast_door{ + id_tag = "EngineVent"; + name = "3. Reactor Ventillatory Control"; + pixel_x = -24; + pixel_y = 6; dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"RR" = ( -/obj/item/storage/firstaid/o2, -/obj/structure/closet/secure_closet/atmos_personal, -/obj/item/clothing/mask/breath/emergency, -/obj/item/clothing/suit/space/emergency, -/obj/item/storage/toolbox/emergency, -/obj/item/clothing/head/helmet/space/emergency, -/turf/simulated/floor, -/area/ministation/atmospherics) -"RV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/button/blast_door{ + id_tag = "smsafetydoor"; + name = "1. Vent Safety"; + pixel_x = -24; + pixel_y = -6; dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/button/mass_driver{ + pixel_x = -35; + id_tag = "eject"; + name = "4. SM CORE EJECT"; dir = 4 }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"RW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"RY" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/wall, -/area/ministation/detective) -"RZ" = ( -/obj/structure/sign/department/janitor{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Sa" = ( -/turf/simulated/wall, -/area/ministation/library) -"Sb" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/valve/digital{ + dir = 1; + name = "Emergency Cooling Valve 2" }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Sd" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/airlock, /turf/simulated/floor/plating, -/area/ministation/hall/w) -"Sf" = ( -/obj/structure/table/woodentable/walnut, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Sg" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/ministation/supermatter) +"ZH" = ( +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, -/area/ministation/hall/e) -"Sj" = ( -/obj/machinery/light, +/area/ministation/cargo) +"ZJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 + }, +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Sk" = ( -/obj/machinery/camera/network/ministation/sat, /turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Sm" = ( -/obj/effect/decal/cleanable/blood/oil, +/area/ministation/maint/westatmos) +"ZK" = ( +/obj/structure/closet/crate/bin/ministation, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"Sn" = ( -/obj/effect/decal/cleanable/dirt, +/area/ministation/trash) +"ZL" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 + dir = 9 }, /turf/simulated/floor/tiled, -/area/ministation/hall/w) -"So" = ( +/area/ministation/cargo) +"ZM" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ministation/engine) +"ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Sp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, +/area/ministation/hall/s1) +"ZT" = ( +/obj/machinery/door/airlock/glass/atmos, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"Sq" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Sr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/turf/simulated/floor, +/turf/simulated/floor/tiled/techfloor, /area/ministation/atmospherics) -"Ss" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"Sv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/visible/universal{ - dir = 4 +"ZU" = ( +/obj/machinery/atmospherics/binary/pump/high_power{ + dir = 8 }, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"Sy" = ( +/area/ministation/supermatter) +"ZX" = ( +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"Sz" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 +/area/ministation/ai_sat) +"ZY" = ( +/obj/machinery/atmospherics/omni/filter{ + tag_east = 1; + tag_south = 4; + tag_west = 2; + use_power = 0 }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"SA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"SC" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/detective) -"SE" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"SF" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/turf/simulated/floor/plating, -/area/ministation/library) -"SH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"SI" = ( -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"SN" = ( -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/disused_office) -"SO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"SP" = ( -/obj/item/stool/padded, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"SR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"ST" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"SV" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"SW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/floor_decal/corner/red{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"SX" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - locked = 1; - id_tag = "pfm_airlock_interior" - }, -/obj/machinery/button/access/interior{ - id_tag = "pfm_airlock"; - name = "interior access button"; - pixel_x = 10; - pixel_y = 20 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"SY" = ( -/obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/tiled, -/area/ministation/cafe) -"SZ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/obj/machinery/atmospherics/portables_connector, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Ta" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Tb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/janitor) -"Tc" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"Td" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Te" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Tg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Th" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/wall, -/area/ministation/maint/se) -"Ti" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"Tj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"Tk" = ( -/obj/structure/table/woodentable, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"To" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Tp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/visible, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Tq" = ( -/obj/machinery/camera/network/security{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"Ts" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Tv" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 1; - id_tag = "atmos_vent" - }, -/obj/machinery/airlock_sensor{ - id_tag = "atmos_sensor"; - pixel_y = 10; - pixel_x = -20 - }, -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - id_tag = "atmos_airlock"; - pixel_y = null; - tag_airpump = "atmos_vent"; - tag_chamber_sensor = "atmos_sensor"; - tag_exterior_door = "atmos_airlock_exterior"; - tag_interior_door = "atmos_airlock_interior"; - dir = 4; - pixel_x = -20 - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Ty" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor, -/area/ministation/atmospherics) -"TC" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"TD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"TF" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"TG" = ( -/obj/effect/decal/cleanable/filth, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/ministation/disused) -"TH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"TI" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"TJ" = ( -/obj/structure/closet/secure_closet/brig, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"TK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"TN" = ( -/obj/item/stool, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"TP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"TQ" = ( -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 32 - }, -/obj/machinery/firealarm, -/turf/simulated/floor, -/area/ministation/atmospherics) -"TR" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Atmos APC"; - pixel_y = 25 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/simulated/floor/airless, -/area/ministation/atmospherics) -"TT" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/external/glass{ - locked = 1; - id_tag = "stern_engineering_airlock_exterior"; - autoset_access = 0 - }, -/obj/machinery/button/access/interior{ - id_tag = "stern_engineering_airlock"; - name = "exterior access button"; - pixel_x = -20; - pixel_y = -10; - command = "cycle_exterior" - }, -/turf/simulated/floor/plating, -/area/ministation/engine) -"TV" = ( -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/door/airlock/security, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"TW" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - id_tag = "sqm_vent"; - dir = 8 - }, -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - dir = 0; - id_tag = "sqm_airlock"; - pixel_y = 24; - tag_airpump = "sqm_vent"; - tag_chamber_sensor = "sqm_sensor"; - tag_exterior_door = "sqm_airlock_exterior"; - tag_interior_door = "sqm_airlock_interior" - }, -/obj/machinery/airlock_sensor{ - id_tag = "sqm_sensor"; - pixel_y = 20 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"TX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"TY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ub" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Uc" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/portables_connector, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Ud" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Ue" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Um" = ( -/obj/random/trash, -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Un" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"Up" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Uq" = ( -/obj/structure/table/woodentable, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Ut" = ( -/obj/structure/sign/plaque/golden/security{ - pixel_y = 32 - }, -/obj/machinery/vending/security, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Uv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"Uw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Ux" = ( -/turf/simulated/floor/plating, -/area/ministation/disused) -"Uz" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "Dock Airlock"; - locked = 1 - }, -/turf/simulated/floor/plating, -/area/ministation/hall/w) -"UA" = ( -/obj/machinery/camera/network/ministation/sat{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"UB" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"UC" = ( -/obj/effect/decal/cleanable/flour, -/turf/simulated/floor/tiled/dark, -/area/ministation/cafe) -"UD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"UG" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/bookcase/skill_books/random, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"UI" = ( -/obj/effect/wallframe_spawn/no_grille, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/court) -"UK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/portables_connector{ - pixel_x = -3 - }, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"UL" = ( -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"UO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"UQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"UR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/bridge) -"UT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/binary/pump/on{ - target_pressure = 200; - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"UV" = ( -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - id_tag = "mining_airlock"; - pixel_y = null; - tag_airpump = "mining_vent"; - tag_chamber_sensor = "mining_sensor"; - tag_exterior_door = "mining_airlock_exterior"; - tag_interior_door = "mining_airlock_interior"; - dir = 4; - pixel_x = -20 - }, -/obj/machinery/airlock_sensor{ - id_tag = "mining_sensor"; - pixel_y = 10; - pixel_x = -20 - }, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"Va" = ( -/obj/structure/bed/chair/wheelchair, -/obj/machinery/camera/network/medbay, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"Vb" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Vc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Vd" = ( -/obj/structure/filing_cabinet, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"Ve" = ( -/obj/abstract/landmark/start{ - name = "Station Engineer" +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Vf" = ( -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ministation/maint/w) -"Vi" = ( -/obj/machinery/light_switch{ - pixel_y = 25 - }, -/obj/abstract/landmark/start{ - name = "Librarian" - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Vj" = ( -/obj/structure/closet/secure_closet/lawyer, -/turf/simulated/floor/tiled, -/area/ministation/court) -"Vl" = ( -/obj/machinery/door/airlock, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/disused_office) -"Vn" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/obj/machinery/light/small/emergency{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"Vp" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Vq" = ( -/obj/structure/bookcase/skill_books/random, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Vs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Vt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Vu" = ( -/obj/machinery/door/airlock/civilian, -/turf/simulated/floor/plating, -/area/ministation/library) -"Vv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/bed/chair/comfy/captain{ - dir = 8 - }, -/obj/machinery/camera/network/security{ - dir = 8 - }, -/turf/simulated/floor/carpet/red, -/area/ministation/court) -"Vw" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Vx" = ( -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"Vy" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"Vz" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/airless, -/area/space) -"VA" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "sat1_airlock_interior" - }, -/obj/machinery/button/access/interior{ - id_tag = "sat1_airlock"; - name = "interior access button"; - pixel_x = 10; - pixel_y = 20 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"VD" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, -/area/ministation/disused) -"VF" = ( -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/disused) -"VG" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/airlock, -/turf/simulated/floor/plating, -/area/ministation/engine) -"VJ" = ( -/obj/machinery/door/airlock/hatch/maintenance, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"VK" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/simulated/floor/bluegrid, -/area/ministation/ai_core) -"VN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"VO" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/airless, -/area/space) -"VQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"VR" = ( -/obj/abstract/landmark/start{ - name = "Assistant" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"VS" = ( -/obj/effect/decal/cleanable/filth, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"VU" = ( -/obj/structure/rack, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = -25 - }, -/obj/item/clothing/mask/horsehead, -/obj/item/storage/wallet/random{ - pixel_z = -11 - }, -/obj/item/classic_baton{ - pixel_w = -7 - }, -/turf/simulated/floor/plating, -/area/ministation/security) -"VV" = ( -/obj/structure/lattice, -/turf/simulated/wall, -/area/ministation/maint/ne) -"VW" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"VZ" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Wb" = ( -/turf/simulated/wall, -/area/ministation/cryo) -"Wc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"Wd" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 - }, -/turf/simulated/floor/plating, -/area/ministation/detective) -"Wg" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Wi" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Wk" = ( -/obj/machinery/door/airlock/glass/atmos, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Wn" = ( -/obj/structure/sign/plaque/atmos{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Wo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Wr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/light{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Ws" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1; - level = 2 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"Wt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Wu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Wv" = ( -/turf/simulated/floor/plating, -/area/ministation/maint/detective) -"WB" = ( -/turf/simulated/floor, -/area/ministation/atmospherics) -"WC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/hidden, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"WD" = ( -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 32 - }, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"WF" = ( -/obj/structure/closet/secure_closet/security, -/turf/simulated/floor/tiled, -/area/ministation/security) -"WG" = ( -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"WH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"WL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/floor_decal/corner/red{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"WN" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"WO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/corner/blue{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"WP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"WQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/sign/directions/science{ - dir = 4; - pixel_y = 25 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"WS" = ( -/obj/effect/wallframe_spawn/no_grille, -/turf/simulated/floor/tiled, -/area/ministation/disused) -"WT" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/green, -/obj/random_multi/single_item/captains_spare_id, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"WU" = ( -/turf/simulated/floor, -/area/space) -"WV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"WW" = ( -/obj/abstract/landmark/start{ - name = "Robot" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"WY" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"WZ" = ( -/obj/machinery/light/small, -/obj/machinery/portable_atmospherics/canister/air/airlock, -/obj/machinery/atmospherics/portables_connector{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"Xd" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/obj/item/handcuffs, -/obj/effect/decal/cleanable/blood, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Xe" = ( -/obj/structure/bed/chair/wood/walnut{ - dir = 4 - }, -/obj/machinery/light, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Xi" = ( -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/carpet/red, -/area/ministation/court) -"Xj" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Xk" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Xl" = ( -/obj/structure/lattice, -/turf/simulated/wall/r_wall, -/area/ministation/cryo) -"Xo" = ( -/obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/filth, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Xp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Xr" = ( -/obj/abstract/landmark{ - name = "bluespace_a" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/sign/warning/armory{ - pixel_x = -32 - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Xs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/ministation/security) -"Xt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"Xu" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/sign/warning/airlock, -/turf/simulated/floor/plating, -/area/ministation/cargo) -"Xw" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"Xx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"XA" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/medical) -"XD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"XE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airlock_sensor{ - id_tag = "starboard_engineering_sensor"; - pixel_y = 20 - }, -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - id_tag = "starboard_engineering_airlock"; - pixel_y = 24; - tag_airpump = "starboard_engineering_vent"; - tag_chamber_sensor = "starboard_engineering_sensor"; - tag_exterior_door = "starboard_engineering_airlock_exterior"; - tag_interior_door = "starboard_engineering_airlock_interior" - }, -/turf/simulated/floor/plating, -/area/ministation/engine) -"XF" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"XJ" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/random/suit, -/obj/random/gloves, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"XL" = ( -/obj/machinery/alarm{ - pixel_y = 23 - }, -/turf/simulated/floor/plating, -/area/ministation/bridge) -"XM" = ( -/obj/machinery/door/airlock, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/ministation/court) -"XO" = ( -/obj/structure/lattice, -/turf/simulated/wall, -/area/ministation/atmospherics) -"XQ" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/random/gloves, -/obj/random/suit, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"XR" = ( -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"XS" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"XT" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"XV" = ( -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"XX" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/table/steel, -/obj/item/wrench, -/obj/item/stack/tape_roll/barricade_tape/atmos, -/turf/simulated/floor, -/area/ministation/atmospherics) -"XY" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/shutters/open{ - id_tag = "secshut"; - name = "security shutter" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/simulated/floor/plating, -/area/ministation/security) -"XZ" = ( -/obj/machinery/door/airlock/glass/medical{ - autoset_access = 0; - name = "Cryogenics airlock" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/white, -/area/ministation/cryo) -"Yb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Yc" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "_North APC"; - pixel_y = 24 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/closet/emcloset, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"Yg" = ( -/obj/effect/floor_decal/industrial/warning, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/w) -"Yh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Yi" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Yj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/nw) -"Ym" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/corner/blue{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Yo" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/e) -"Yp" = ( -/obj/random/trash, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Yq" = ( -/turf/simulated/wall{ - can_open = 1 - }, -/area/ministation/maint/ne) -"Yt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "port_engineering_vent" - }, -/turf/simulated/floor/plating, -/area/ministation/engine) -"Yv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_x = 32; - pixel_y = 25 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = 32 - }, -/obj/structure/sign/directions/science{ - dir = 1; - pixel_x = 32; - pixel_y = 40 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Yx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"YA" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"YB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/random/trash, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"YF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/ministation/eva) -"YG" = ( -/obj/machinery/door/airlock/external/glass{ - autoset_access = 0; - name = "External Airlock Hatch"; - req_access = list("ACCESS_EXTERNAL"); - locked = 1; - id_tag = "sat3_airlock_interior" - }, -/obj/machinery/button/access/interior{ - id_tag = "sat3_airlock"; - name = "interior access button"; - pixel_x = 10; - pixel_y = 20 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"YH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/blood/oil, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"YI" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"YK" = ( -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -32 - }, -/turf/simulated/floor/tiled, -/area/ministation/disused_office) -"YM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"YP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/computer/modular/preset/civilian{ - dir = 1 - }, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"YQ" = ( -/obj/structure/closet/lawcloset, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"YS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"YT" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/camera/network/ministation/sat, -/turf/simulated/floor/plating, -/area/ministation/ai_sat) -"YW" = ( -/turf/simulated/wall, -/area/ministation/disused) -"YY" = ( -/obj/structure/closet/wardrobe/lawyer_black, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/court) -"YZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"Za" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Zb" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/space, -/area/ministation/hall/w) -"Ze" = ( -/obj/machinery/door/airlock/external{ - locked = 1; - id_tag = "atmos_airlock_exterior"; - autoset_access = 0 - }, -/obj/machinery/button/access/interior{ - id_tag = "atmos_airlock"; - name = "exterior access button"; - pixel_x = -20; - pixel_y = -10; - command = "cycle_exterior" - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"Zf" = ( -/obj/effect/decal/cleanable/filth, -/turf/simulated/floor/plating, -/area/ministation/maint/w) -"Zh" = ( -/obj/machinery/network/relay, -/turf/simulated/floor/tiled, -/area/ministation/engine) -"Zj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Zk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"Zl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/ministation/disused_office) -"Zm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/hop) -"Zo" = ( -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - dir = 0; - id_tag = "pqm_airlock"; - pixel_y = 24; - tag_airpump = "pqm_vent"; - tag_chamber_sensor = "pqm_sensor"; - tag_exterior_door = "pqm_airlock_exterior"; - tag_interior_door = "pqm_airlock_interior" - }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 4; - id_tag = "pqm_vent" - }, -/obj/machinery/airlock_sensor{ - id_tag = "pqm_sensor"; - pixel_y = 20 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/sw) -"Zr" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/ne) -"Zs" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/simulated/floor/plating, -/area/ministation/disused) -"Zt" = ( -/obj/structure/bed/chair/wood/walnut{ - dir = 4 - }, -/obj/machinery/firealarm{ - pixel_y = 25 - }, -/turf/simulated/floor/wood/yew, -/area/ministation/court) -"Zv" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"Zx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/camera/motion/ministation, -/turf/simulated/floor/tiled/techmaint, -/area/ministation/ai_core) -"Zz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"ZA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"ZB" = ( -/obj/structure/closet, -/obj/random/maintenance, -/obj/item/clothing/suit/storage/toggle/labcoat, -/turf/simulated/floor/plating, -/area/ministation/maint/e) -"ZD" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"ZE" = ( -/obj/abstract/landmark/start{ - name = "Assistant" - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"ZH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/simulated/floor/plating, -/area/ministation/maint/se) -"ZI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"ZK" = ( -/obj/machinery/computer/cryopod{ - pixel_y = 32 - }, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/ministation/cryo) -"ZL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/ministation/cargo) -"ZN" = ( -/obj/effect/floor_decal/corner/red{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled, -/area/ministation/hall/n) -"ZO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, -/turf/simulated/floor, -/area/ministation/atmospherics) -"ZP" = ( -/obj/effect/wallframe_spawn/no_grille, -/turf/simulated/floor/plating, -/area/ministation/court) -"ZQ" = ( -/obj/abstract/landmark/start{ - name = "Assistant" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/ministation/commons) -"ZR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/ministation/hall/s) -"ZT" = ( -/obj/machinery/camera/network/research{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/ministation/science) -"ZV" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/item/paper_bin, -/obj/item/pen, -/turf/simulated/floor/carpet/green, -/area/ministation/disused_office) -"ZW" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/simulated/floor/wood/mahogany, -/area/ministation/library) -"ZZ" = ( -/obj/structure/table/woodentable_reinforced/walnut, -/obj/item/bell, -/turf/simulated/floor/carpet/red, -/area/ministation/court) +/area/ministation/supermatter) (1,1,1) = {" aa @@ -18480,7 +12729,1292 @@ aa aa aa "} -(2,1,1) = {" +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +NO +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" aa aa aa @@ -18737,7 +14271,7 @@ aa aa aa "} -(3,1,1) = {" +(8,1,1) = {" aa aa aa @@ -18994,7 +14528,7 @@ aa aa aa "} -(4,1,1) = {" +(9,1,1) = {" aa aa aa @@ -19251,7 +14785,8 @@ aa aa aa "} -(5,1,1) = {" +(10,1,1) = {" +aa aa aa aa @@ -19502,13 +15037,12 @@ aa aa aa aa -NO aa aa aa aa "} -(6,1,1) = {" +(11,1,1) = {" aa aa aa @@ -19765,7 +15299,7 @@ aa aa aa "} -(7,1,1) = {" +(12,1,1) = {" aa aa aa @@ -20022,7 +15556,7 @@ aa aa aa "} -(8,1,1) = {" +(13,1,1) = {" aa aa aa @@ -20279,7 +15813,7 @@ aa aa aa "} -(9,1,1) = {" +(14,1,1) = {" aa aa aa @@ -20536,7 +16070,7 @@ aa aa aa "} -(10,1,1) = {" +(15,1,1) = {" aa aa aa @@ -20793,7 +16327,7 @@ aa aa aa "} -(11,1,1) = {" +(16,1,1) = {" aa aa aa @@ -21050,7 +16584,7 @@ aa aa aa "} -(12,1,1) = {" +(17,1,1) = {" aa aa aa @@ -21307,7 +16841,7 @@ aa aa aa "} -(13,1,1) = {" +(18,1,1) = {" aa aa aa @@ -21564,8 +17098,7 @@ aa aa aa "} -(14,1,1) = {" -aa +(19,1,1) = {" aa aa aa @@ -21622,6 +17155,7 @@ aa aa aa aa +af aa aa aa @@ -21821,7 +17355,7 @@ aa aa aa "} -(15,1,1) = {" +(20,1,1) = {" aa aa aa @@ -22078,7 +17612,7 @@ aa aa aa "} -(16,1,1) = {" +(21,1,1) = {" aa aa aa @@ -22335,7 +17869,7 @@ aa aa aa "} -(17,1,1) = {" +(22,1,1) = {" aa aa aa @@ -22592,7 +18126,7 @@ aa aa aa "} -(18,1,1) = {" +(23,1,1) = {" aa aa aa @@ -22849,7 +18383,8 @@ aa aa aa "} -(19,1,1) = {" +(24,1,1) = {" +aa aa aa aa @@ -22906,7 +18441,6 @@ aa aa aa aa -af aa aa aa @@ -23106,7 +18640,7 @@ aa aa aa "} -(20,1,1) = {" +(25,1,1) = {" aa aa aa @@ -23363,7 +18897,7 @@ aa aa aa "} -(21,1,1) = {" +(26,1,1) = {" aa aa aa @@ -23620,7 +19154,7 @@ aa aa aa "} -(22,1,1) = {" +(27,1,1) = {" aa aa aa @@ -23877,7 +19411,7 @@ aa aa aa "} -(23,1,1) = {" +(28,1,1) = {" aa aa aa @@ -24134,7 +19668,7 @@ aa aa aa "} -(24,1,1) = {" +(29,1,1) = {" aa aa aa @@ -24391,7 +19925,7 @@ aa aa aa "} -(25,1,1) = {" +(30,1,1) = {" aa aa aa @@ -24648,29 +20182,7 @@ aa aa aa "} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(31,1,1) = {" aa aa aa @@ -24904,8 +20416,6 @@ aa aa aa aa -"} -(27,1,1) = {" aa aa aa @@ -24928,6 +20438,8 @@ aa aa aa aa +"} +(32,1,1) = {" aa aa aa @@ -25161,8 +20673,6 @@ aa aa aa aa -"} -(28,1,1) = {" aa aa aa @@ -25185,6 +20695,8 @@ aa aa aa aa +"} +(33,1,1) = {" aa aa aa @@ -25418,8 +20930,6 @@ aa aa aa aa -"} -(29,1,1) = {" aa aa aa @@ -25442,6 +20952,8 @@ aa aa aa aa +"} +(34,1,1) = {" aa aa aa @@ -25675,8 +21187,6 @@ aa aa aa aa -"} -(30,1,1) = {" aa aa aa @@ -25699,6 +21209,8 @@ aa aa aa aa +"} +(35,1,1) = {" aa aa aa @@ -25761,6 +21273,8 @@ aa aa aa aa +af +af aa aa aa @@ -25932,8 +21446,6 @@ aa aa aa aa -"} -(31,1,1) = {" aa aa aa @@ -25954,6 +21466,8 @@ aa aa aa aa +"} +(36,1,1) = {" aa aa aa @@ -26014,6 +21528,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -26189,8 +21708,6 @@ aa aa aa aa -"} -(32,1,1) = {" aa aa aa @@ -26206,6 +21723,8 @@ aa aa aa aa +"} +(37,1,1) = {" aa aa aa @@ -26265,6 +21784,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -26446,8 +21970,6 @@ aa aa aa aa -"} -(33,1,1) = {" aa aa aa @@ -26458,6 +21980,8 @@ aa aa aa aa +"} +(38,1,1) = {" aa aa aa @@ -26517,6 +22041,12 @@ aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -26703,12 +22233,12 @@ aa aa aa aa -"} -(34,1,1) = {" aa aa aa aa +"} +(39,1,1) = {" aa aa aa @@ -26761,11 +22291,19 @@ aa aa aa aa +af +af aa aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -26956,12 +22494,12 @@ aa aa aa aa +"} +(40,1,1) = {" aa aa aa aa -"} -(35,1,1) = {" aa aa aa @@ -27010,12 +22548,18 @@ aa aa aa aa +af +af aa aa aa aa aa aa +af +af +af +af aa aa aa @@ -27024,8 +22568,6 @@ aa aa aa aa -af -af aa aa aa @@ -27209,6 +22751,8 @@ aa aa aa aa +"} +(41,1,1) = {" aa aa aa @@ -27217,8 +22761,6 @@ aa aa aa aa -"} -(36,1,1) = {" aa aa aa @@ -27274,6 +22816,7 @@ aa aa aa aa +af aa aa aa @@ -27282,8 +22825,6 @@ aa af af af -af -af aa aa aa @@ -27467,6 +23008,11 @@ aa aa aa aa +"} +(42,1,1) = {" +aa +aa +aa aa aa aa @@ -27474,8 +23020,6 @@ aa aa aa aa -"} -(37,1,1) = {" aa aa aa @@ -27535,8 +23079,6 @@ aa aa aa aa -af -af af af af @@ -27723,6 +23265,8 @@ aa aa aa aa +"} +(43,1,1) = {" aa aa aa @@ -27731,8 +23275,6 @@ aa aa aa aa -"} -(38,1,1) = {" aa aa aa @@ -27781,6 +23323,8 @@ aa aa aa aa +af +af aa aa aa @@ -27795,9 +23339,6 @@ aa af af af -af -af -af aa aa aa @@ -27981,6 +23522,10 @@ aa aa aa aa +"} +(44,1,1) = {" +aa +aa aa aa aa @@ -27988,8 +23533,6 @@ aa aa aa aa -"} -(39,1,1) = {" aa aa aa @@ -28037,13 +23580,13 @@ aa aa aa aa +af +af aa aa aa aa aa -af -af aa aa aa @@ -28053,8 +23596,6 @@ af af af af -af -af aa aa aa @@ -28238,6 +23779,9 @@ aa aa aa aa +"} +(45,1,1) = {" +aa aa aa aa @@ -28245,8 +23789,6 @@ aa aa aa aa -"} -(40,1,1) = {" aa aa aa @@ -28290,6 +23832,8 @@ aa aa aa aa +af +af aa aa aa @@ -28299,8 +23843,6 @@ aa aa aa aa -af -af aa aa aa @@ -28494,21 +24036,8 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa "} -(41,1,1) = {" -aa -aa -aa -aa -aa +(46,1,1) = {" aa aa aa @@ -28559,15 +24088,19 @@ aa aa aa aa +af +af +af +af aa aa aa aa aa aa +af aa aa -af aa aa aa @@ -28759,8 +24292,9 @@ aa aa aa aa +aa "} -(42,1,1) = {" +(47,1,1) = {" aa aa aa @@ -28811,12 +24345,17 @@ aa aa aa aa +af +af +af aa aa aa aa aa aa +af +af aa aa aa @@ -28832,11 +24371,6 @@ aa aa af af -af -aa -aa -aa -aa aa aa aa @@ -29017,7 +24551,7 @@ aa aa aa "} -(43,1,1) = {" +(48,1,1) = {" aa aa aa @@ -29069,6 +24603,9 @@ aa aa aa aa +af +af +aa aa aa aa @@ -29076,6 +24613,8 @@ aa aa af af +af +af aa aa aa @@ -29089,12 +24628,6 @@ aa aa af af -af -aa -aa -aa -aa -aa aa aa aa @@ -29201,6 +24734,7 @@ aa aa aa aa +ab aa aa aa @@ -29274,9 +24808,7 @@ aa aa aa "} -(44,1,1) = {" -aa -aa +(49,1,1) = {" aa aa aa @@ -29333,12 +24865,19 @@ aa aa af af +af aa +af +af +af +af +af aa aa aa aa -aa +af +af aa aa aa @@ -29350,6 +24889,7 @@ af aa aa aa +ab aa aa aa @@ -29524,17 +25064,14 @@ aa aa aa aa +"} +(50,1,1) = {" aa aa aa aa aa aa -"} -(45,1,1) = {" -aa -aa -aa aa aa aa @@ -29585,25 +25122,27 @@ aa aa af af +af aa +af +af +af +af +af aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +af +af +af +af +af aa aa af af af af +af aa aa aa @@ -29782,13 +25321,13 @@ aa aa aa aa +"} +(51,1,1) = {" aa aa aa aa aa -"} -(46,1,1) = {" aa aa aa @@ -29838,21 +25377,29 @@ aa aa aa aa +af +af +af aa af af af af +af aa -aa -aa -aa -aa -aa +af +af +af +af +af af aa aa aa +af +af +af +af aa aa aa @@ -30031,6 +25578,8 @@ aa aa aa aa +"} +(52,1,1) = {" aa aa aa @@ -30044,11 +25593,6 @@ aa aa aa aa -"} -(47,1,1) = {" -aa -aa -aa aa aa aa @@ -30094,17 +25638,31 @@ aa aa aa aa +af +af +af +af aa aa af af af +af +af +af aa aa aa +af +af +af +af aa aa -aa +af +af +af +af af af aa @@ -30120,8 +25678,6 @@ aa aa aa aa -af -af aa aa aa @@ -30279,6 +25835,10 @@ aa aa aa aa +"} +(53,1,1) = {" +aa +aa aa aa aa @@ -30301,17 +25861,6 @@ aa aa aa aa -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -30347,18 +25896,23 @@ aa aa aa aa +af +af +af aa aa aa +af +af +af +af aa aa aa aa af af -aa -aa -aa +af aa aa aa @@ -30366,6 +25920,8 @@ af af af af +af +af aa aa aa @@ -30377,9 +25933,6 @@ aa aa aa aa -af -af -aa aa aa aa @@ -30485,7 +26038,6 @@ aa aa aa aa -ab aa aa aa @@ -30540,6 +26092,8 @@ aa aa aa aa +"} +(54,1,1) = {" aa aa aa @@ -30558,8 +26112,6 @@ aa aa aa aa -"} -(49,1,1) = {" aa aa aa @@ -30601,25 +26153,29 @@ aa aa aa aa +af aa aa aa aa aa +af +af +af +af aa aa aa aa aa +af +af aa aa aa af af af -aa -af -af af af af @@ -30627,20 +26183,17 @@ aa aa aa aa -af +aa +aa +aa af aa aa aa aa -af -af -af -af aa aa aa -ab aa aa aa @@ -30796,6 +26349,8 @@ aa aa aa aa +"} +(55,1,1) = {" aa aa aa @@ -30815,8 +26370,6 @@ aa aa aa aa -"} -(50,1,1) = {" aa aa aa @@ -30864,6 +26417,10 @@ aa aa aa aa +af +af +af +aa aa aa aa @@ -30871,15 +26428,7 @@ aa aa aa aa -af -af -af aa -af -af -af -af -af aa aa af @@ -30889,11 +26438,6 @@ af af aa aa -af -af -af -af -af aa aa aa @@ -31062,6 +26606,8 @@ aa aa aa aa +"} +(56,1,1) = {" aa aa aa @@ -31072,8 +26618,6 @@ aa aa aa aa -"} -(51,1,1) = {" aa aa aa @@ -31125,37 +26669,26 @@ aa aa aa aa +af +aa +aa +aa +aa +aa +aa +aa aa aa aa -af -af -af aa -af -af -af -af -af aa -af -af -af -af -af -af aa aa aa -af -af -af -af aa aa aa aa -af af af aa @@ -31329,9 +26862,9 @@ aa aa aa aa -"} -(52,1,1) = {" aa +"} +(57,1,1) = {" aa aa aa @@ -31389,10 +26922,6 @@ aa aa aa aa -af -af -af -af aa aa af @@ -31404,18 +26933,8 @@ af aa aa aa -af -af -af -af aa aa -af -af -af -af -af -af aa aa aa @@ -31586,8 +27105,6 @@ aa aa aa aa -"} -(53,1,1) = {" aa aa aa @@ -31603,6 +27120,9 @@ aa aa aa aa +"} +(58,1,1) = {" +aa aa aa aa @@ -31647,12 +27167,22 @@ aa aa aa aa -af -af -af aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af af af af @@ -31661,15 +27191,11 @@ aa aa aa aa -af -af -af aa aa aa -af -af -af +aa +aa af af af @@ -31843,8 +27369,6 @@ aa aa aa aa -"} -(54,1,1) = {" aa aa aa @@ -31853,6 +27377,11 @@ aa aa aa aa +"} +(59,1,1) = {" +aa +aa +aa aa aa aa @@ -31904,7 +27433,6 @@ aa aa aa aa -af aa aa aa @@ -31914,15 +27442,13 @@ af af af af +af +af aa aa aa aa aa -af -af -aa -aa aa af af @@ -31937,8 +27463,6 @@ aa aa aa aa -af -aa aa aa aa @@ -31948,6 +27472,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -32100,8 +27627,6 @@ aa aa aa aa -"} -(55,1,1) = {" aa aa aa @@ -32109,6 +27634,8 @@ aa aa aa aa +"} +(60,1,1) = {" aa aa aa @@ -32171,6 +27698,7 @@ aa af af af +af aa aa aa @@ -32178,10 +27706,9 @@ aa aa aa aa -aa -aa -aa -aa +af +af +af af af af @@ -32202,6 +27729,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -32357,12 +27887,12 @@ aa aa aa aa -"} -(56,1,1) = {" aa aa aa aa +"} +(61,1,1) = {" aa aa aa @@ -32420,20 +27950,36 @@ aa aa aa aa -af aa aa aa +af +af +af +aa +aa aa aa aa aa aa +af +af +af +af +af +af +af +af +af aa aa aa aa aa +af +af +af aa aa aa @@ -32442,6 +27988,7 @@ aa aa af af +af aa aa aa @@ -32601,6 +28148,8 @@ aa aa aa aa +"} +(62,1,1) = {" aa aa aa @@ -32614,10 +28163,6 @@ aa aa aa aa -"} -(57,1,1) = {" -aa -aa aa aa aa @@ -32681,15 +28226,26 @@ af af af af +af +af +af aa aa aa +af aa +af +af +af +af aa aa aa aa aa +af +af +af aa aa aa @@ -32849,6 +28405,8 @@ aa aa aa aa +"} +(63,1,1) = {" aa aa aa @@ -32871,19 +28429,6 @@ aa aa aa aa -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -32938,18 +28483,18 @@ af af af af -aa -aa -aa -aa -aa -aa +af +af +af aa aa aa af af af +af +af +af aa aa aa @@ -33117,6 +28662,11 @@ aa aa aa aa +"} +(64,1,1) = {" +aa +aa +aa aa aa aa @@ -33128,10 +28678,6 @@ aa aa aa aa -"} -(59,1,1) = {" -aa -aa aa aa aa @@ -33195,13 +28741,11 @@ af af af af +af aa aa aa aa -aa -aa -af af af af @@ -33223,9 +28767,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -33378,6 +28919,8 @@ aa aa aa aa +"} +(65,1,1) = {" aa aa aa @@ -33385,8 +28928,6 @@ aa aa aa aa -"} -(60,1,1) = {" aa aa aa @@ -33446,18 +28987,11 @@ aa aa aa aa -af -af -af -af -aa aa aa aa aa aa -aa -af af af af @@ -33468,6 +29002,12 @@ af aa aa aa +af +af +af +af +af +af aa aa aa @@ -33480,12 +29020,6 @@ aa aa aa aa -af -af -af -aa -aa -aa aa aa aa @@ -33643,9 +29177,7 @@ aa aa aa "} -(61,1,1) = {" -aa -aa +(66,1,1) = {" aa aa aa @@ -33706,7 +29238,6 @@ aa aa af af -af aa aa aa @@ -33714,15 +29245,8 @@ aa aa aa aa -af -af -af -af -af -af -af -af -af +aa +aa aa aa aa @@ -33735,8 +29259,9 @@ aa aa aa aa -aa -aa +af +af +af af af af @@ -33755,6 +29280,7 @@ aa aa aa aa +af aa aa aa @@ -33767,6 +29293,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -33899,21 +29428,13 @@ aa aa aa aa -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa aa aa +"} +(67,1,1) = {" aa aa aa @@ -33975,15 +29496,7 @@ af af af af -af -af -af -af -af -aa -aa aa -af aa af af @@ -33994,9 +29507,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -34007,10 +29517,16 @@ aa aa aa aa +af +af +af +af aa aa aa aa +af +af aa aa aa @@ -34034,6 +29550,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -34156,8 +29675,6 @@ aa aa aa aa -"} -(63,1,1) = {" aa aa aa @@ -34173,6 +29690,10 @@ aa aa aa aa +"} +(68,1,1) = {" +aa +aa aa aa aa @@ -34228,20 +29749,12 @@ aa aa aa aa -af -af -af -af -af af af af af aa aa -aa -af -af af af af @@ -34263,10 +29776,14 @@ aa aa aa aa +af aa aa aa aa +af +af +af aa aa aa @@ -34290,6 +29807,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -34413,8 +29933,6 @@ aa aa aa aa -"} -(64,1,1) = {" aa aa aa @@ -34429,6 +29947,8 @@ aa aa aa aa +"} +(69,1,1) = {" aa aa aa @@ -34490,11 +30010,6 @@ af af af af -af -af -af -aa -aa aa aa af @@ -34510,6 +30025,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -34518,6 +30036,12 @@ aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -34670,15 +30194,6 @@ aa aa aa aa -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -34689,6 +30204,8 @@ aa aa aa aa +"} +(70,1,1) = {" aa aa aa @@ -34745,24 +30262,29 @@ aa aa af af +aa af af af af -af -aa aa aa af af af af -af -af aa aa aa aa +ab +aa +aa +aa +af +af +af +af aa aa aa @@ -34771,6 +30293,12 @@ aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -34927,14 +30455,14 @@ aa aa aa aa -"} -(66,1,1) = {" aa aa aa aa aa aa +"} +(71,1,1) = {" aa aa aa @@ -34989,6 +30517,14 @@ aa aa af af +af +af +af +af +af +af +aa +aa aa aa aa @@ -35010,6 +30546,10 @@ aa aa aa aa +aa +aa +aa +aa af af af @@ -35018,6 +30558,7 @@ af af aa aa +ab aa aa aa @@ -35031,10 +30572,6 @@ aa aa aa aa -af -aa -aa -aa aa aa aa @@ -35044,9 +30581,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -35185,12 +30719,7 @@ aa aa aa "} -(67,1,1) = {" -aa -aa -aa -aa -aa +(72,1,1) = {" aa aa aa @@ -35247,8 +30776,6 @@ af af af af -aa -aa af af af @@ -35263,6 +30790,7 @@ aa aa aa aa +af aa aa aa @@ -35271,17 +30799,17 @@ aa af af af -af aa aa aa aa -af -af aa aa aa aa +af +af +af aa aa aa @@ -35301,9 +30829,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -35330,6 +30855,7 @@ aa aa aa aa +ab aa aa aa @@ -35441,8 +30967,6 @@ aa aa aa aa -"} -(68,1,1) = {" aa aa aa @@ -35451,6 +30975,10 @@ aa aa aa aa +"} +(73,1,1) = {" +aa +aa aa aa aa @@ -35504,8 +31032,6 @@ af af af af -aa -aa af af af @@ -35520,21 +31046,22 @@ aa aa aa aa +af +af +af aa aa aa aa aa +af +aa aa aa -af aa aa aa aa -af -af -af aa aa aa @@ -35558,9 +31085,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -35698,8 +31222,6 @@ aa aa aa aa -"} -(69,1,1) = {" aa aa aa @@ -35710,6 +31232,8 @@ aa aa aa aa +"} +(74,1,1) = {" aa aa aa @@ -35749,6 +31273,10 @@ aa aa aa aa +af +aa +aa +aa aa aa aa @@ -35761,9 +31289,6 @@ af af af af -aa -aa -af af af af @@ -35776,6 +31301,9 @@ aa aa aa aa +aa +af +af af af af @@ -35789,16 +31317,6 @@ aa aa af af -af -af -af -af -aa -aa -aa -aa -aa -aa aa aa aa @@ -35817,6 +31335,22 @@ aa aa aa aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -35956,11 +31490,7 @@ aa aa aa "} -(70,1,1) = {" -aa -aa -aa -aa +(75,1,1) = {" aa aa aa @@ -36000,6 +31530,7 @@ aa aa aa aa +af aa aa aa @@ -36013,14 +31544,9 @@ aa aa af af -aa -af af af af -aa -aa -af af af af @@ -36028,7 +31554,8 @@ aa aa aa aa -ab +aa +aa aa aa aa @@ -36036,6 +31563,7 @@ af af af af +af aa aa aa @@ -36043,24 +31571,30 @@ aa aa aa aa -aa -af -af af af af -af -aa -aa -aa aa aa aa aa +af +af +af +af +af +af +af aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -36213,7 +31747,7 @@ aa aa aa "} -(71,1,1) = {" +(76,1,1) = {" aa aa aa @@ -36271,9 +31805,6 @@ af af af af -af -af -af aa aa aa @@ -36285,6 +31816,12 @@ aa aa aa aa +af +af +af +af +af +aa aa aa aa @@ -36293,10 +31830,18 @@ aa af af af +af +af aa aa aa -aa +af +af +af +af +af +af +af aa aa aa @@ -36307,9 +31852,9 @@ af af af af +af aa aa -ab aa aa aa @@ -36458,6 +32003,8 @@ aa aa aa aa +"} +(77,1,1) = {" aa aa aa @@ -36469,8 +32016,6 @@ aa aa aa aa -"} -(72,1,1) = {" aa aa aa @@ -36514,6 +32059,12 @@ aa aa aa aa +af +af +aa +aa +aa +aa aa aa aa @@ -36526,11 +32077,6 @@ aa af af af -af -af -af -af -af aa aa aa @@ -36538,10 +32084,19 @@ aa aa aa aa +af +af +af +af +aa aa aa aa af +af +af +af +af aa aa aa @@ -36550,6 +32105,11 @@ aa af af af +af +af +af +af +af aa aa aa @@ -36558,9 +32118,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -36606,7 +32163,6 @@ aa aa aa aa -ab aa aa aa @@ -36704,6 +32260,8 @@ aa aa aa aa +"} +(78,1,1) = {" aa aa aa @@ -36726,8 +32284,6 @@ aa aa aa aa -"} -(73,1,1) = {" aa aa aa @@ -36781,31 +32337,37 @@ aa aa af af +aa +aa +aa +aa af af af af af -af -aa -aa -aa -aa -aa -aa -aa aa aa aa af af af +af +af aa aa aa aa aa af +af +af +af +af +af +af +af +af aa aa aa @@ -36955,6 +32517,8 @@ aa aa aa aa +"} +(79,1,1) = {" aa aa aa @@ -36983,8 +32547,6 @@ aa aa aa aa -"} -(74,1,1) = {" aa aa aa @@ -37024,14 +32586,14 @@ aa aa aa aa -af -aa aa aa aa aa aa aa +af +af aa aa aa @@ -37041,10 +32603,11 @@ af af af af +aa +aa +aa af af -af -aa aa aa aa @@ -37058,6 +32621,11 @@ af af af af +af +af +af +af +aa aa aa aa @@ -37066,8 +32634,6 @@ aa aa aa aa -af -af aa aa aa @@ -37086,9 +32652,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -37117,6 +32680,8 @@ aa aa aa aa +ab +aa aa aa aa @@ -37209,6 +32774,8 @@ aa aa aa aa +"} +(80,1,1) = {" aa aa aa @@ -37240,8 +32807,6 @@ aa aa aa aa -"} -(75,1,1) = {" aa aa aa @@ -37268,6 +32833,14 @@ aa aa aa aa +af +af +af +af +af +af +aa +aa aa aa aa @@ -37276,12 +32849,20 @@ aa aa aa aa +af +af +af aa aa aa aa aa af +af +af +aa +aa +aa aa aa aa @@ -37293,7 +32874,6 @@ aa aa aa aa -af af af af @@ -37310,11 +32890,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -37322,30 +32897,14 @@ aa aa aa aa -af -af -af aa aa aa aa -af -af -af -af -af -af -af aa aa aa aa -af -af -af -af -af -af aa aa aa @@ -37472,6 +33031,38 @@ aa aa aa aa +"} +(81,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -37497,8 +33088,30 @@ aa aa aa aa -"} -(76,1,1) = {" +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa aa aa aa @@ -37518,6 +33131,14 @@ aa aa aa aa +af +af +af +af +af +af +af +aa aa aa aa @@ -37551,11 +33172,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -37567,43 +33183,19 @@ aa aa aa aa -af -af -af -af -af aa aa aa aa aa aa -af -af -af -af -af aa aa aa -af -af -af -af -af -af -af aa aa aa aa -af -af -af -af -af -af -af aa aa aa @@ -37696,6 +33288,8 @@ aa aa aa aa +"} +(82,1,1) = {" aa aa aa @@ -37754,8 +33348,12 @@ aa aa aa aa -"} -(77,1,1) = {" +af +af +af +af +af +af aa aa aa @@ -37765,6 +33363,7 @@ aa aa aa aa +af aa aa aa @@ -37779,6 +33378,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -37810,8 +33412,6 @@ aa aa aa aa -af -af aa aa aa @@ -37825,9 +33425,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -37835,32 +33432,15 @@ aa aa aa aa -af -af -af -af aa aa aa aa -af -af -af -af -af aa aa aa aa aa -af -af -af -af -af -af -af -af aa aa aa @@ -37965,6 +33545,8 @@ aa aa aa aa +"} +(83,1,1) = {" aa aa aa @@ -38009,10 +33591,10 @@ aa aa aa aa +af +af aa aa -"} -(78,1,1) = {" aa aa aa @@ -38023,6 +33605,12 @@ aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -38032,6 +33620,7 @@ aa aa aa aa +af aa aa aa @@ -38046,6 +33635,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -38086,39 +33679,18 @@ aa aa aa aa -af -af aa aa aa aa -af -af -af -af -af aa aa aa -af -af -af -af -af aa aa aa aa aa -af -af -af -af -af -af -af -af -af aa aa aa @@ -38230,6 +33802,8 @@ aa aa aa aa +"} +(84,1,1) = {" aa aa aa @@ -38268,14 +33842,14 @@ aa aa aa aa -"} -(79,1,1) = {" aa aa aa aa aa aa +af +af aa aa aa @@ -38289,7 +33863,11 @@ aa aa aa aa +af +af +af aa +af aa aa aa @@ -38314,6 +33892,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -38329,6 +33912,8 @@ aa aa aa aa +af +af aa aa aa @@ -38343,22 +33928,13 @@ aa aa aa aa -af -af aa aa aa aa -af -af -af -af -af aa aa aa -af -af aa aa aa @@ -38367,16 +33943,6 @@ aa aa aa aa -af -af -af -af -af -af -af -af -af -aa aa aa aa @@ -38430,8 +33996,6 @@ aa aa aa aa -ab -aa aa aa aa @@ -38495,6 +34059,8 @@ aa aa aa aa +"} +(85,1,1) = {" aa aa aa @@ -38525,8 +34091,6 @@ aa aa aa aa -"} -(80,1,1) = {" aa aa aa @@ -38600,17 +34164,11 @@ aa aa aa aa -af -af -af aa aa aa aa aa -af -af -af aa aa aa @@ -38626,13 +34184,6 @@ aa aa aa aa -af -af -af -af -af -af -af aa aa aa @@ -38765,6 +34316,15 @@ aa aa aa aa +"} +(86,1,1) = {" +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -38782,8 +34342,6 @@ aa aa aa aa -"} -(81,1,1) = {" aa aa aa @@ -38838,10 +34396,16 @@ aa aa aa aa +af +af +aa +aa aa aa aa aa +aa +af af af af @@ -38857,9 +34421,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -38883,13 +34444,6 @@ aa aa aa aa -af -af -af -af -af -af -af aa aa aa @@ -39019,6 +34573,8 @@ aa aa aa aa +"} +(87,1,1) = {" aa aa aa @@ -39039,8 +34595,6 @@ aa aa aa aa -"} -(82,1,1) = {" aa aa aa @@ -39101,6 +34655,15 @@ aa aa af af +aa +aa +aa +aa +aa +aa +aa +aa +af af af af @@ -39114,7 +34677,6 @@ aa aa aa aa -af aa aa aa @@ -39130,9 +34692,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -39141,11 +34700,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -39276,6 +34830,9 @@ aa aa aa aa +"} +(88,1,1) = {" +aa aa aa aa @@ -39296,8 +34853,6 @@ aa aa aa aa -"} -(83,1,1) = {" aa aa aa @@ -39344,10 +34899,9 @@ aa aa af af -aa -aa -aa -aa +af +af +af aa aa aa @@ -39360,6 +34914,12 @@ af af af af +aa +aa +aa +aa +aa +aa af af aa @@ -39371,7 +34931,6 @@ aa aa aa aa -af aa aa aa @@ -39387,10 +34946,25 @@ aa aa aa aa -af -af -af -af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +yS +aa +aa aa aa aa @@ -39513,6 +35087,14 @@ aa aa aa aa +"} +(89,1,1) = {" +aa +aa +aa +aa +aa +aa aa aa aa @@ -39553,26 +35135,6 @@ aa aa aa aa -"} -(84,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -39592,6 +35154,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -39601,6 +35168,9 @@ aa aa af af +af +af +af aa aa aa @@ -39614,11 +35184,7 @@ aa aa aa aa -af -af -af aa -af aa aa aa @@ -39644,12 +35210,6 @@ aa aa aa aa -af -af -af -af -af -aa aa aa aa @@ -39784,6 +35344,8 @@ aa aa aa aa +"} +(90,1,1) = {" aa aa aa @@ -39810,8 +35372,6 @@ aa aa aa aa -"} -(85,1,1) = {" aa aa aa @@ -39847,6 +35407,15 @@ aa aa aa aa +af +af +af +af +af +af +af +af +af aa aa aa @@ -39854,6 +35423,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -39870,6 +35444,7 @@ aa aa aa aa +af aa aa aa @@ -39900,12 +35475,6 @@ aa aa aa aa -af -af -af -af -af -af aa aa aa @@ -39921,16 +35490,13 @@ aa aa aa aa -af -af -aa -aa aa aa aa aa aa aa +ab aa aa aa @@ -40035,6 +35601,8 @@ aa aa aa aa +"} +(91,1,1) = {" aa aa aa @@ -40067,8 +35635,6 @@ aa aa aa aa -"} -(86,1,1) = {" aa aa aa @@ -40098,6 +35664,14 @@ aa aa aa aa +af +af +af +af +af +af +af +af aa aa aa @@ -40106,6 +35680,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -40123,6 +35701,8 @@ aa aa aa aa +af +af aa aa aa @@ -40147,8 +35727,6 @@ aa aa aa aa -af -af aa aa aa @@ -40157,12 +35735,6 @@ aa aa aa aa -af -af -af -af -af -af aa aa aa @@ -40220,6 +35792,7 @@ aa aa aa aa +GQ aa aa aa @@ -40285,6 +35858,8 @@ aa aa aa aa +"} +(92,1,1) = {" aa aa aa @@ -40324,8 +35899,6 @@ aa aa aa aa -"} -(87,1,1) = {" aa aa aa @@ -40348,8 +35921,14 @@ aa aa aa aa +af +af aa aa +af +af +af +af aa aa aa @@ -40371,10 +35950,17 @@ aa aa aa aa +af +af +af +af aa aa aa aa +af +af +af aa aa aa @@ -40404,8 +35990,6 @@ aa aa aa aa -af -af aa aa aa @@ -40415,11 +35999,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -40470,6 +36049,7 @@ aa aa aa aa +GJ aa aa aa @@ -40535,6 +36115,8 @@ aa aa aa aa +"} +(93,1,1) = {" aa aa aa @@ -40581,8 +36163,6 @@ aa aa aa aa -"} -(88,1,1) = {" aa aa aa @@ -40593,6 +36173,7 @@ aa aa aa aa +ab aa aa aa @@ -40621,12 +36202,21 @@ aa aa aa aa +af +af aa aa aa +af +af +af +af aa aa aa +af +af +af aa aa aa @@ -40648,11 +36238,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -40661,10 +36246,6 @@ aa aa aa aa -af -af -af -af aa aa aa @@ -40672,8 +36253,6 @@ aa aa aa aa -af -af aa aa aa @@ -40720,6 +36299,29 @@ aa aa aa aa +XI +GB +GB +GB +GB +GB +GB +UX +GB +GB +GB +GB +GB +GB +ds +sx +sx +sx +sx +sx +sx +sx +sx aa aa aa @@ -40770,6 +36372,8 @@ aa aa aa aa +"} +(94,1,1) = {" aa aa aa @@ -40838,8 +36442,6 @@ aa aa aa aa -"} -(89,1,1) = {" aa aa aa @@ -40857,11 +36459,21 @@ aa aa aa aa +af +af aa aa +af +af +af +af +af aa aa aa +af +af +af aa aa aa @@ -40905,11 +36517,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -40917,11 +36524,6 @@ aa aa aa aa -af -af -af -af -af aa aa aa @@ -40954,9 +36556,29 @@ aa aa aa aa +GF +FE +FE +FE +Gh +Gh aa +GH aa +Gh +Gh +FE +FE +FE +VM +tl +xZ +tl +xZ +tl +xZ aa +sx aa aa aa @@ -40971,7 +36593,6 @@ aa aa aa aa -yS aa aa aa @@ -41008,6 +36629,8 @@ aa aa aa aa +"} +(95,1,1) = {" aa aa aa @@ -41080,6 +36703,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -41090,14 +36716,19 @@ aa aa aa aa +af +af aa aa aa +af +af +af +af aa aa -"} -(90,1,1) = {" aa +af aa aa aa @@ -41118,6 +36749,18 @@ aa aa aa aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac aa aa aa @@ -41158,15 +36801,6 @@ aa aa aa aa -af -af -af -af -af -af -af -af -af aa aa aa @@ -41174,17 +36808,34 @@ aa aa aa aa -af -af -af -af -af aa aa aa aa aa +GF +FF +Ga +Ga +Ga +Ga +Gw +Jt +GM +GN +GN +GN +GN +GO +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -41235,6 +36886,8 @@ aa aa aa aa +"} +(96,1,1) = {" aa aa aa @@ -41306,16 +36959,28 @@ aa aa aa aa +af +af +af +af aa aa aa aa +af +af +af aa aa aa +af +af aa aa aa +af +af +af aa aa aa @@ -41328,6 +36993,8 @@ aa aa aa aa +af +af aa aa aa @@ -41339,6 +37006,18 @@ aa aa aa aa +ad +ad +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +ac aa aa aa @@ -41352,8 +37031,6 @@ aa aa aa aa -"} -(91,1,1) = {" aa aa aa @@ -41393,11 +37070,32 @@ aa aa aa aa +GF +FG +FG +FG +FG +FG aa +Jt aa +FG +FG +FG +FG +FG +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa +ab aa aa aa @@ -41415,14 +37113,6 @@ aa aa aa aa -af -af -af -af -af -af -af -af aa aa aa @@ -41431,10 +37121,6 @@ aa aa aa aa -af -af -af -af aa aa aa @@ -41453,11 +37139,12 @@ aa aa aa aa -af aa aa aa aa +"} +(97,1,1) = {" aa aa aa @@ -41492,7 +37179,6 @@ aa aa aa aa -jc aa aa aa @@ -41522,16 +37208,25 @@ aa aa aa aa +af +af aa aa aa aa aa aa +af +af +af +af aa aa aa aa +af +af +af aa aa aa @@ -41540,6 +37235,7 @@ aa aa aa aa +af aa aa aa @@ -41554,6 +37250,8 @@ aa aa aa aa +af +af aa aa aa @@ -41564,6 +37262,19 @@ aa aa aa aa +ad +ad +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +ac aa aa aa @@ -41609,8 +37320,6 @@ aa aa aa aa -"} -(92,1,1) = {" aa aa aa @@ -41618,17 +37327,29 @@ aa aa aa aa +GF aa aa +ad aa aa aa +Jt aa aa aa +ad aa aa +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -41672,19 +37393,15 @@ aa aa aa aa -af -af aa aa -af -af -af -af aa aa aa aa aa +"} +(98,1,1) = {" aa aa aa @@ -41702,16 +37419,10 @@ aa aa aa aa -af -af -af -af aa aa aa aa -af -af aa aa aa @@ -41762,6 +37473,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -41804,6 +37519,19 @@ aa aa aa aa +ad +ad +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +ac aa aa aa @@ -41856,9 +37584,29 @@ aa aa aa aa +GF +FE +FE +FE +FE +FE aa +Jt aa +FE +FE +FE +FE +FE +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -41866,8 +37614,6 @@ aa aa aa aa -"} -(93,1,1) = {" aa aa aa @@ -41911,6 +37657,8 @@ aa aa aa aa +"} +(99,1,1) = {" aa aa aa @@ -41924,7 +37672,6 @@ aa aa aa aa -ab aa aa aa @@ -41953,23 +37700,12 @@ aa aa aa aa -af -af -af aa aa aa -af -af -af -af aa aa aa -af -af -af -af aa aa aa @@ -41994,6 +37730,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -42036,6 +37776,19 @@ aa aa aa aa +ad +ad +Pp +Pp +Pp +Pp +LJ +Pp +Pp +Pp +Pp +Pp +ac aa aa aa @@ -42088,7 +37841,29 @@ aa aa aa aa +GF +FF +Ga +Ga +Ga +Ga +Gw +Jt +GM +GN +GN +GN +GN +GO +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -42123,8 +37898,6 @@ aa aa aa aa -"} -(94,1,1) = {" aa aa aa @@ -42141,6 +37914,8 @@ aa aa aa aa +"} +(100,1,1) = {" aa aa aa @@ -42210,20 +37985,16 @@ aa aa aa aa -af -af -af aa aa af af af af -af aa aa aa -af +aa af af aa @@ -42261,6 +38032,20 @@ aa aa aa aa +ad +ad +ad +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +ac aa aa aa @@ -42313,9 +38098,29 @@ aa aa aa aa +GF +FG +FG +FG +FG +FG aa +Jt aa +FG +FG +FG +FG +FG +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -42366,6 +38171,8 @@ aa aa aa aa +"} +(101,1,1) = {" aa aa aa @@ -42380,9 +38187,6 @@ aa aa aa aa -"} -(95,1,1) = {" -aa aa aa aa @@ -42431,6 +38235,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -42444,6 +38252,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -42454,9 +38265,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -42467,22 +38275,12 @@ aa aa aa aa -af -af -af aa aa aa -af -af -af -af aa aa aa -af -af -af aa aa aa @@ -42491,6 +38289,20 @@ aa aa aa aa +ad +ad +ad +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +ac aa aa aa @@ -42543,17 +38355,29 @@ aa aa aa aa +GF aa aa +ad aa aa aa +Jt aa aa aa +ad aa aa +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -42604,6 +38428,8 @@ aa aa aa aa +"} +(102,1,1) = {" aa aa aa @@ -42637,8 +38463,6 @@ aa aa aa aa -"} -(96,1,1) = {" aa aa aa @@ -42668,6 +38492,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -42679,6 +38508,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -42695,6 +38528,7 @@ aa aa aa aa +af aa aa aa @@ -42710,29 +38544,32 @@ aa aa aa aa -af -af -af -af aa +ad +ad +ad +ad +ad +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +Pp +ac aa aa aa -af -af -af aa aa aa aa -af -af aa aa aa -af -af -af aa aa aa @@ -42758,31 +38595,6 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -la -PN -kZ -ad -ad -ad -la -PN -kZ -PN -la -aa aa aa aa @@ -42800,9 +38612,29 @@ aa aa aa aa +GF +dl +dl +dl +dl +dl aa +Jt aa +dl +dl +dl +dl +dl +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -42821,7 +38653,6 @@ aa aa aa aa -GQ aa aa aa @@ -42854,6 +38685,8 @@ aa aa aa aa +"} +(103,1,1) = {" aa aa aa @@ -42894,8 +38727,6 @@ aa aa aa aa -"} -(97,1,1) = {" aa aa aa @@ -42917,6 +38748,12 @@ aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -42928,6 +38765,9 @@ aa aa aa aa +af +af +af aa aa aa @@ -42940,9 +38780,11 @@ aa aa aa aa +af aa aa aa +af aa aa aa @@ -42959,25 +38801,31 @@ aa aa aa aa -af -af aa +ad +ad +ad +ad +ad +ad +ad +au +cy +ie +ie +cy +au +AC +ac aa aa aa aa aa -af -af -af -af aa aa aa aa -af -af -af aa aa aa @@ -42987,7 +38835,6 @@ aa aa aa aa -af aa aa aa @@ -43002,8 +38849,6 @@ aa aa aa aa -af -af aa aa aa @@ -43015,38 +38860,38 @@ aa aa aa aa -ad -ad -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -ac -ad -la -PY -kZ -ad -ad -ad -la -Nu -kZ -Bj -la -aa +WU +CZ +WU aa aa aa aa aa aa +GF +RF +tj +tj +tj +tj +Gw +Jt +GM +YF +YF +YF +YF +NM +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -43078,7 +38923,6 @@ aa aa aa aa -GJ aa aa aa @@ -43096,9 +38940,10 @@ aa aa aa aa -ab aa aa +"} +(104,1,1) = {" aa aa aa @@ -43151,8 +38996,7 @@ aa aa aa aa -"} -(98,1,1) = {" +ab aa aa aa @@ -43161,6 +39005,12 @@ aa aa aa aa +af +af +af +af +af +af aa aa aa @@ -43187,6 +39037,7 @@ aa aa aa aa +af aa aa aa @@ -43206,7 +39057,22 @@ aa aa aa aa +WY aa +ad +ad +ad +ad +ad +ad +ad +au +cy +iV +Rh +cy +au +ac aa aa aa @@ -43218,16 +39084,13 @@ aa aa aa aa +ab aa aa aa aa aa aa -af -af -af -af aa aa aa @@ -43239,6 +39102,7 @@ aa aa aa aa +ab aa aa aa @@ -43251,16 +39115,41 @@ aa aa aa aa +PD +PD +fG +jC +kx +PD +PD aa aa aa aa +GF +ua +ua +ua +ua +ua aa +Jt aa +ua +ua +ua +ua +ua +VM +oC +mT +mT +mT +mT +mT aa +sx aa -af -af aa aa aa @@ -43271,31 +39160,6 @@ aa aa aa aa -ad -ad -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -ac -ad -la -Qp -kZ -ad -ad -ad -la -Qp -kZ -Qp -la aa aa aa @@ -43335,7 +39199,8 @@ aa aa aa aa -GJ +"} +(105,1,1) = {" aa aa aa @@ -43398,6 +39263,11 @@ aa aa aa aa +af +af +af +af +af aa aa aa @@ -43408,8 +39278,6 @@ aa aa aa aa -"} -(99,1,1) = {" aa aa aa @@ -43443,6 +39311,25 @@ aa aa aa aa +ad +au +au +au +au +au +au +au +au +au +au +au +au +cy +hP +jU +cy +au +au aa aa aa @@ -43481,24 +39368,44 @@ aa aa aa aa -af -af -af -af aa aa +PD +PD +PD +Ki +kC +QA +ma +ze +PD +PD +PD +PD aa +GF aa aa +ad aa aa aa +Jt aa aa aa +ad aa aa +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -43528,40 +39435,6 @@ aa aa aa aa -ad -ad -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -ac -ad -Zb -Qp -kZ -ad -ad -ad -Zb -Qp -kZ -Qp -Zb -ad -ad -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -43583,22 +39456,13 @@ aa aa aa aa +"} +(106,1,1) = {" aa aa aa -FE -FE -FE -Gh -Gh aa -GH aa -Gh -Gh -FE -FE -FE aa aa aa @@ -43656,6 +39520,10 @@ aa aa aa aa +af +af +af +af aa aa aa @@ -43665,8 +39533,6 @@ aa aa aa aa -"} -(100,1,1) = {" aa aa aa @@ -43694,11 +39560,33 @@ aa aa aa aa +af +af aa aa aa aa aa +ad +cb +ck +cy +cM +de +dB +cc +fi +fL +fi +gj +gL +ho +eE +fB +Vy +hQ +fq +au aa aa aa @@ -43738,17 +39626,43 @@ aa aa aa aa -af -af -af -af aa +PD +hv +un +fg +ru +Rw +ru +le +bp +sX +bc +PD aa +GF +FE +FE +FE +FE +FE aa +Jt aa -af -af +FE +FE +FE +FE +FE +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -43785,39 +39699,6 @@ aa aa aa aa -ad -ad -Pp -Pp -Pp -Pp -LJ -Pp -Pp -Pp -Pp -Pp -kZ -kZ -la -OT -Sd -kZ -la -kZ -la -OT -Sd -OT -la -ad -kZ -la -la -kZ -kZ -kZ -kZ aa aa aa @@ -43832,6 +39713,8 @@ aa aa aa aa +"} +(107,1,1) = {" aa aa aa @@ -43843,19 +39726,6 @@ aa aa aa aa -FF -Ga -Ga -Ga -Ga -Gw -Jt -GM -GN -GN -GN -GN -GO aa aa aa @@ -43910,6 +39780,7 @@ aa aa aa aa +af aa aa aa @@ -43922,8 +39793,6 @@ aa aa aa aa -"} -(101,1,1) = {" aa aa aa @@ -43948,6 +39817,33 @@ aa aa aa aa +af +af +ad +ad +ad +ad +ad +ad +cn +cn +au +cz +dC +tu +cl +dI +fj +fM +yO +Rm +ZA +SO +dI +Xu +Pe +IH +au aa aa aa @@ -43986,14 +39882,44 @@ aa aa aa aa -af -af -af -af aa aa +PD +Du +Ab +bN +jM +eR +kq +nw +um +oS +kv +PD aa +GF +FF +Ga +Ga +Ga +Ga +Gw +Jt +GM +GN +GN +GN +GN +GO +VM +oC +mT +mT +mT +mT +mT aa +sx aa aa aa @@ -44003,9 +39929,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -44041,46 +39964,14 @@ aa aa aa aa -ad -ad -ad -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -kZ -lI -mh -Ry -mh -oh -oH -rc -mh -Ry -mh -rW -kZ -ad -kZ -uB -mS -vO -mP -mO -Uz aa aa aa aa aa aa +"} +(108,1,1) = {" aa aa aa @@ -44100,19 +39991,8 @@ aa aa aa aa -FG -FG -FG -FG -FG aa -Jt aa -FG -FG -FG -FG -FG aa aa aa @@ -44148,39 +40028,7 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(102,1,1) = {" +af aa aa aa @@ -44233,21 +40081,26 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -af -af -af -af -af +ad +cd +cn +cy +cO +dq +dI +dI +eF +fk +fN +gk +fN +Mq +hR +SR +iU +dI +jV +au aa aa aa @@ -44259,10 +40112,6 @@ aa aa aa aa -af -af -af -af aa aa aa @@ -44292,46 +40141,44 @@ aa aa aa aa +PD +Zo +Yy +bO +pi +kN +gE +cG +lt +oS +Sm +PD aa +GF +FG +FG +FG +FG +FG aa +GI aa +FG +FG +FG +FG +FG +zX +nD +tk +nD +tk +nD +mT aa +sx aa aa -ad -ad -ad -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -la -lJ -mi -mR -nB -mS -mS -mS -mS -mR -rm -rX -kZ -kZ -kZ -uC -mS -vP -kZ -kZ -kZ aa aa aa @@ -44359,16 +40206,12 @@ aa aa aa aa -ad aa aa aa -Jt aa aa aa -ad -aa aa aa aa @@ -44384,6 +40227,8 @@ aa aa aa aa +"} +(109,1,1) = {" aa aa aa @@ -44436,8 +40281,6 @@ aa aa aa aa -"} -(103,1,1) = {" aa aa aa @@ -44496,15 +40339,28 @@ aa aa aa aa +cd +Ow +au +cP +dE +eY +dI +ej +fl +fO +gl +fO +fF +hS +fJ +hS +dI +jW +au aa aa aa -af -af -af -af -af -af aa aa aa @@ -44516,9 +40372,6 @@ aa aa aa aa -af -af -af aa aa aa @@ -44532,12 +40385,9 @@ aa aa aa aa -af aa aa aa -af -af aa aa aa @@ -44548,47 +40398,46 @@ aa aa aa aa +PD +gU +CJ +md +MI +zH +PI +cX +eS +Nc +nR +PD aa +Yr +GB +GB +GB +GB +GB +IR +Xc +WE +GB +GB +GB +GB +GB +GC +GC +GC +GC +GC +Wz +nD aa +sx aa aa aa aa -ad -ad -ad -ad -ad -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -Pp -la -MG -Rn -Da -Db -PX -PX -PX -PX -rE -rn -Vs -mS -te -mS -mS -nB -nB -mS -xf -la aa aa aa @@ -44614,19 +40463,8 @@ aa aa aa aa -FE -FE -FE -FE -FE aa -Jt aa -FE -FE -FE -FE -FE aa aa aa @@ -44646,6 +40484,8 @@ aa aa aa aa +"} +(110,1,1) = {" aa aa aa @@ -44693,8 +40533,6 @@ aa aa aa aa -"} -(104,1,1) = {" aa aa aa @@ -44740,6 +40578,8 @@ aa aa aa aa +af +af aa aa aa @@ -44747,7 +40587,6 @@ aa aa aa aa -ab aa aa aa @@ -44756,12 +40595,26 @@ aa aa aa aa -af -af -af -af -af -af +ad +ce +cm +cy +cN +dq +dI +dI +dI +fm +Rq +cf +gM +Zk +hT +NI +iW +ZA +jX +au aa aa aa @@ -44789,13 +40642,6 @@ aa aa aa aa -af -aa -aa -aa -aa -aa -aa aa aa aa @@ -44805,6 +40651,22 @@ aa aa aa aa +DD +DD +DD +DD +PD +NW +pQ +gi +vq +YM +Ls +vk +tD +bb +if +PD aa aa aa @@ -44812,48 +40674,23 @@ aa aa aa ad +XO +AB +XO ad -ad -ad -ad -ad -ad -au -ie -cy -cy -ie -au -ad -kZ -lK -mj -mS -Sn -oi -oI -oI -pY -oI -ro -MY -oI -tf -tW -mS -mS -mS -mS -xf -la aa aa +ad aa aa aa aa aa aa +ad +ad +sx +sx aa aa aa @@ -44871,19 +40708,6 @@ aa aa aa aa -FF -Ga -Ga -Ga -Ga -Gw -Jt -GM -GN -GN -GN -GN -GO aa aa aa @@ -44917,6 +40741,8 @@ aa aa aa aa +"} +(111,1,1) = {" aa aa aa @@ -44950,8 +40776,6 @@ aa aa aa aa -"} -(105,1,1) = {" aa aa aa @@ -45011,14 +40835,11 @@ aa aa aa aa +af +af aa aa aa -af -af -af -af -af aa aa aa @@ -45032,6 +40853,25 @@ aa aa aa aa +ce +cn +au +cQ +dq +mW +SO +eF +IO +Bp +Ss +dI +Zk +hp +dI +hp +dI +Wc +au aa aa aa @@ -45068,41 +40908,43 @@ aa aa aa aa +DD +aE +zr +zr +PD +PD +ZT +av +av +av +av +av +av +av +XO +av +av +av +av +av +av ad ad +av +GW +Ma ad ad ad ad +aa +aa +aa +aa +aa +aa ad -au -Rq -cy -cy -Rh -au -ad -kZ -lL -mk -Wo -QZ -oj -nC -nC -nC -nC -rp -TD -ss -tg -tX -kX -vb -mS -mS -kE -la aa aa aa @@ -45123,24 +40965,12 @@ aa aa aa aa -ad aa aa aa aa -FG -FG -FG -FG -FG aa -Jt aa -FG -FG -FG -FG -FG aa aa aa @@ -45168,6 +40998,8 @@ aa aa aa aa +"} +(112,1,1) = {" aa aa aa @@ -45207,8 +41039,6 @@ aa aa aa aa -"} -(106,1,1) = {" aa aa aa @@ -45238,6 +41068,8 @@ aa aa aa aa +af +af aa aa aa @@ -45271,10 +41103,6 @@ aa aa aa aa -af -af -af -af aa aa aa @@ -45282,6 +41110,25 @@ aa aa aa aa +cn +wZ +au +cR +cx +dG +ek +ZA +fn +XZ +ZL +dI +hq +dI +dI +dI +dI +pS +au aa aa aa @@ -45314,6 +41161,40 @@ aa aa aa aa +WU +DD +DD +DD +DD +zr +zr +zr +zr +Dv +DE +DT +qA +EJ +Fa +EP +Fs +Dt +wp +Rg +cu +Ei +Dt +rU +av +XO +aa +Eo +Yt +gm +aa +ad +aa +aa aa aa aa @@ -45321,45 +41202,6 @@ aa aa aa ad -au -au -au -au -au -au -au -au -au -au -au -au -hP -cy -Xu -jU -au -au -kZ -lM -mS -Vs -Vs -ok -oJ -ph -ea -ea -rq -gA -st -th -tY -uD -vc -mS -mS -xh -la aa aa aa @@ -45378,24 +41220,19 @@ aa aa aa aa -ad aa -ad aa aa aa aa aa aa -ad aa aa aa -Jt aa aa aa -ad aa aa aa @@ -45418,6 +41255,22 @@ aa aa aa aa +"} +(113,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -45437,35 +41290,7 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(107,1,1) = {" +ab aa aa aa @@ -45500,6 +41325,8 @@ aa aa aa aa +af +af aa aa aa @@ -45531,8 +41358,6 @@ aa aa aa aa -af -aa aa aa aa @@ -45541,7 +41366,34 @@ aa aa aa aa +ad +cn +au +au +au +au +dH +cf +eF +fo +fP +dI +dI +Zk +zz +lq +Ws +dI +pS +au aa +jh +jh +jh +jh +jh +jh +jh aa aa aa @@ -45566,59 +41418,47 @@ aa aa aa aa +WU +lM +nY +bl +XA +re +Qz +oi +xw +DD +av +av +XR +EK +oX +PQ +FH +Dt +Ue +sb +RY +Nu +Dt +Ic +wK +Dt +Eo +Eo +GV +gm +Eo +av aa aa aa -af -af aa aa aa aa aa ad -cb -ck -cy -cM -de -dB -cc -eE -fi -fL -gj -gL -ho -fB -IO -Vy -hQ -fq -au -kZ -Os -kZ -Os -Os -ol -Os -Os -kZ -qE -rr -rt -rn -ti -tZ -mS -mS -vQ -kZ -kZ -kZ -aa -aa aa aa aa @@ -45634,28 +41474,10 @@ aa aa aa aa -ad -cn -ad -ad aa aa aa aa -FE -FE -FE -FE -FE -aa -Jt -aa -FE -FE -FE -FE -FE -aa aa aa aa @@ -45690,6 +41512,8 @@ aa aa aa aa +"} +(114,1,1) = {" aa aa aa @@ -45721,8 +41545,6 @@ aa aa aa aa -"} -(108,1,1) = {" aa aa aa @@ -45779,7 +41601,6 @@ aa aa aa aa -af aa aa aa @@ -45803,6 +41624,33 @@ aa aa aa aa +cn +OR +UV +cS +cA +Pl +TP +eG +fp +fQ +go +XV +nj +au +au +au +el +au +au +jh +jh +CN +NX +NX +NX +CN +jh aa aa aa @@ -45826,55 +41674,39 @@ aa aa aa aa -af -af -ad -ad -ad -ad -ad -ad -cn -cn -au -cN -cy -dC -cl -dI -fj -fM -yO -mI -mI -SO -gN -cf -Pe -IH -au -lb -Ta -qj -XV -nE -om -oK -pi -kZ -qF -rs -rt -rn -tj -ua -mS -nB -vP -mP -mO -Uz aa +WU +DD +DD +DD +DD +nA +RO +zr +GZ +Am +av +DV +PW +EL +Fb +EB +FI +Dt +Ak +uS +vL +Ph +uL +MC +bj +Dt +Gn +Gx +GX +XU +Hf +av aa aa aa @@ -45891,27 +41723,8 @@ aa aa aa aa -uK -Du -uK -ad -aa -aa aa aa -FF -Ga -Ga -Ga -Ga -Gw -Jt -GM -GN -GN -GN -GN -GO aa aa aa @@ -45956,6 +41769,8 @@ aa aa aa aa +"} +(115,1,1) = {" aa aa aa @@ -45978,8 +41793,6 @@ aa aa aa aa -"} -(109,1,1) = {" aa aa aa @@ -46038,6 +41851,8 @@ aa aa aa aa +af +af aa aa aa @@ -46066,6 +41881,33 @@ aa aa aa aa +ad +au +au +au +au +au +au +au +au +fu +au +gO +MT +au +NX +NX +NX +NX +CN +NX +NX +NX +jh +jh +jh +NX +jh aa aa aa @@ -46090,85 +41932,52 @@ aa aa aa aa -ad -cd -cn -cy -cO -au -dD -dI -eF -fk -fN -gk -fN -Mq -hR -Mq -iU -SR -jV -au -lc -Ts -mo -SA -Is -it -Sv -pj -kZ -qG -rt -rt -rn -tk -ub -nC -Yb -Yg -kZ -kZ -kZ aa aa +DD +ps +Dv +AM +AW +iz +uK +RO +av +DW +Er +EM +Fc +Fm +FJ +Dt +Dt +rq +oF +oF +Dt +Dt +Dt +Dt +Uc +Um +UT +mV +Ft +av +av +av +av aa aa aa aa aa ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -uK -Zo -uK -ad -ad aa aa aa -FG -FG -FG -FG -FG aa -GI aa -FG -FG -FG -FG -FG aa aa aa @@ -46217,6 +42026,8 @@ aa aa aa aa +"} +(116,1,1) = {" aa aa aa @@ -46235,8 +42046,6 @@ aa aa aa aa -"} -(110,1,1) = {" aa aa aa @@ -46299,6 +42108,8 @@ aa aa aa aa +af +af aa aa aa @@ -46328,10 +42139,46 @@ aa aa aa aa +au +VR +ky +qu +gt +iq +NH +fr +fR +gq +gP +wB +au +NX +jh +MX +MX +jd +MX +MX +MX +jh +Bu +jh +NX +jh +jh +jh +jh +jh +jh +jh +jh +jh +jh +jh +jh +jh aa aa -af -af aa aa aa @@ -46344,48 +42191,43 @@ aa aa aa aa +DD +DD +DD +DD +DD +DD +DD +PH +av +DX +Es +EN +Fd +Fu +FK +bB +zN +Zd +OH +EZ +EZ +EZ +EZ +Gi +Gp +Gy +EZ +Bo +ln +Hs +zg +HI +av aa aa aa aa -cd -Ow -au -cP -cy -dE -dI -ej -fl -fO -gl -fO -Lt -hS -fJ -iV -fF -jW -au -ld -Qr -eq -Wt -lP -dO -oM -pk -kZ -qH -ru -rY -SV -tl -uc -nD -nD -VQ -kZ aa ad aa @@ -46395,20 +42237,11 @@ aa aa aa aa -ad aa aa aa -ad aa -ad aa -uK -uK -uK -gU -uK -ad aa aa aa @@ -46418,12 +42251,6 @@ aa aa aa aa -ad -GJ -ad -aa -aa -aa aa aa aa @@ -46456,6 +42283,8 @@ aa aa aa aa +"} +(117,1,1) = {" aa aa aa @@ -46492,8 +42321,6 @@ aa aa aa aa -"} -(111,1,1) = {" aa aa aa @@ -46569,6 +42396,44 @@ aa aa aa aa +au +Tp +uX +et +au +au +fu +au +au +au +gP +hs +au +NX +jh +Yx +pZ +hf +ZK +uM +do +jh +cw +qd +dw +NX +NX +CN +NX +NX +NX +CN +NX +NX +NX +NX +Tb +jh aa aa aa @@ -46585,16 +42450,43 @@ aa aa aa aa +ad aa aa -af -af aa +DD +TX +av +DY +Et +EO +Fe +Fv +jq +Gb +Gf +Gb +Gb +Ae +CS +Gb +Gb +Gj +Gq +Gz +NY +Ha +YA +Ht +HB +HJ +av aa aa aa aa aa +ad aa aa aa @@ -46604,84 +42496,17 @@ aa aa aa aa -ad -ce -cm -cy -cN -au -dF -dI -dI -fm -dI -cf -gM -Zk -hT -NI -iW -Ba -jX -au -YM -QA -Ne -Wg -WH -QJ -oN -oN -oN -oN -oN -oN -su -tm -ud -oI -vd -vR -kZ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad aa aa -ad aa -ad aa -uK -UK -XJ -NW -DD -ad -ad -ad -ad aa aa aa aa aa -ad -Gm -RJ -Gm -ad aa aa -ad aa aa aa @@ -46715,6 +42540,8 @@ aa aa aa aa +"} +(118,1,1) = {" aa aa aa @@ -46749,8 +42576,6 @@ aa aa aa aa -"} -(112,1,1) = {" aa aa aa @@ -46819,8 +42644,6 @@ aa aa aa aa -af -af aa aa aa @@ -46830,6 +42653,47 @@ aa aa aa aa +au +rD +dI +wm +au +IK +nb +ft +Vq +au +gP +ht +au +pz +jh +AN +nG +hf +hf +WR +TJ +jh +jh +jh +dF +di +di +ON +di +kZ +kZ +kZ +kZ +kZ +kZ +sV +NX +jh +jh +jh +jh aa aa aa @@ -46843,14 +42707,43 @@ aa aa aa aa +ad aa aa aa +DD +TX +av +DZ +wt +Ez +Ff +Fw +Ad +av +av +av +av +av +av +av +av +av +Zi +Zi +YN +av +Hg +DC +ex +HK +av aa aa aa aa aa +ad aa aa aa @@ -46862,83 +42755,6 @@ aa aa aa aa -ce -cn -au -cQ -cy -mW -SO -eF -fm -ej -Ss -dI -hp -au -au -au -jy -au -au -dj -lQ -mp -mY -nF -PA -oN -pl -pZ -qI -rv -oN -rn -mj -mS -uE -uI -vS -uI -uI -xI -uI -uI -uI -uK -uK -uK -uK -uK -uK -uK -BA -uK -uK -uK -uK -uK -PP -To -NF -av -Dt -Eo -Eo -Eo -Dt -Dt -Dt -ad -ad -ad -Dt -GW -Eo -ad -ad -ad -ad aa aa aa @@ -46981,6 +42797,8 @@ aa aa aa aa +"} +(119,1,1) = {" aa aa aa @@ -47006,13 +42824,12 @@ aa aa aa aa -"} -(113,1,1) = {" aa aa aa aa aa +ab aa aa aa @@ -47041,7 +42858,6 @@ aa aa aa aa -ab aa aa aa @@ -47076,8 +42892,6 @@ aa aa aa aa -af -af aa aa aa @@ -47096,6 +42910,47 @@ aa aa aa aa +au +me +dI +jI +au +Nq +vC +gs +fS +gq +gP +JV +qa +rn +jh +xX +CL +ez +mz +vf +RR +VL +VL +GL +dU +di +di +gQ +Qq +kZ +sy +MN +tr +us +kZ +Rb +TR +wD +CN +xq +jh aa aa aa @@ -47109,91 +42964,56 @@ aa aa aa aa +ad aa aa aa +DD +Yi +av +va +XQ +BY +EY +XQ +Aq +av +eK +eK +ur +eK +Tw +Uh +mn +PM +Yz +Pz +VP +eK +av +SQ +QS +av +av aa aa aa aa +HY +GS +If aa +HY +GS +If aa +HY +GS +If aa -cn -cn -cz -cR -cx -dG -ek -ZA -fn -ZA -ZL -dI -hq -au -iq -iq -jz -jY -Mx -le -lR -mq -mq -mq -Ub -oN -pm -qa -qJ -rw -oN -sv -mj -mS -mQ -uI -vT -wD -xi -xJ -yl -yU -uI -zr -lZ -AD -uK -Bc -vm -Zj -zT -zT -zT -zT -RO -CN -zT -eP -Dv -DE -DT -DC -EJ -Fa -EP -Fs -Dt aa -ad aa -Eo -Yt -Eo aa -ad aa aa aa @@ -47234,6 +43054,8 @@ aa aa aa aa +"} +(120,1,1) = {" aa aa aa @@ -47263,8 +43085,6 @@ aa aa aa aa -"} -(114,1,1) = {" aa aa aa @@ -47347,9 +43167,106 @@ aa aa aa aa +au +wN +ZH +au +au +fv +fv +aq +fv +au +gO +hu +au +NX +jh +eB +rT +WF +hf +gg +lB +MX +MX +jh +On +di +dM +qQ +Xx +kZ +eh +mS +tq +wS +kZ +NX +yp +jh +jh +jh +jh +ad +ad +ad +ad +ad +ad +ms +ms +ms +ms +ms +ad +ad +ad +ad +ad +ad +DD +TX +av +Eb +vY +FS +XQ +XQ +FO +Zi +eK +Gk +hk +zm +zB +eK +eK +Za +Yz +Pz +VP +eK +av +Hu +ST +av +ad +ad +ad +ad aa +HY +GT +If aa +HY +GT +If aa +HY +GT +If aa aa aa @@ -47375,82 +43292,7 @@ aa aa aa aa -ad -cn -au -au -au -au -dH -cf -eF -fo -fP -dI -gN -Zk -au -iq -iX -iX -iX -iX -iX -iX -iX -mZ -fG -lP -oN -pn -qb -qK -Tb -rZ -PH -tn -mS -mQ -ve -vU -wE -UB -xK -yV -yV -zq -SH -zt -AE -uK -cB -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -Am -av -DU -Eq -EK -EZ -Ft -FH -Dt aa -Dt -Eo -VG -GV -Eo -Eo -Dt aa aa aa @@ -47469,6 +43311,8 @@ aa aa aa aa +"} +(121,1,1) = {" aa aa aa @@ -47520,8 +43364,6 @@ aa aa aa aa -"} -(115,1,1) = {" aa aa aa @@ -47531,6 +43373,8 @@ aa aa aa aa +af +af aa aa aa @@ -47577,8 +43421,47 @@ aa aa aa aa +WY aa aa +au +Df +dI +au +Mx +fw +fw +gu +gQ +Xg +Ia +Lq +di +zJ +jh +RH +bt +qG +BZ +rz +xQ +MX +tB +zY +yD +di +gQ +qQ +gQ +kZ +sz +oI +ts +mS +za +NX +yp +jh aa aa aa @@ -47588,22 +43471,62 @@ aa aa aa aa +ms +cg +Qh +cg +ms aa aa aa aa aa aa +DD +ZJ +av +vI +Ev +EQ +nx +nx +eX +av +AJ +Lr +ZY +Wx +sl +vp +eK +fE +eK +eK +VC +eK +MZ +Da +SF +av aa aa aa aa aa +HY +GT +If +ad +HY +GT +If +ad +HY +GT +If aa aa aa -af -af aa aa aa @@ -47631,83 +43554,7 @@ aa aa aa aa -ad -ad -cn -OR -UV -cS -cA -Pl -TP -eG -fp -fQ -go -dI -Zk -au -Vf -iX -jB -ka -iX -lg -lT -iX -Oo -mq -UQ -oN -po -qc -qL -rx -oN -RZ -nB -mS -mQ -vf -vV -Zm -kB -xJ -yn -yW -uI -zU -za -AF -uK -KI -bl -aG -of -Aa -Ax -sr -AM -AV -Bq -bl -Am -av -DV -DC -EL -Fb -EB -FI -Dt aa -Dt -Gn -Gx -GX -Gb -Hf -Dt aa aa aa @@ -47721,6 +43568,8 @@ aa aa aa aa +"} +(122,1,1) = {" aa aa aa @@ -47777,12 +43626,12 @@ aa aa aa aa -"} -(116,1,1) = {" aa aa aa aa +af +af aa aa aa @@ -47827,19 +43676,111 @@ aa aa aa aa +cr +cr +cr +cr +cr +cr +dI +AV +au +gV +fx +fx +gv +gQ +gQ +gQ +Sj +di +di +di +yL +hf +wJ +hf +Gd +Kz +MX +kM +nk +jY +di +gQ +gQ +wx +kZ +sA +YK +uE +kA +kZ +SV +yp +ms +ms +ms +ms aa aa aa aa aa +ms +ms +cg +Bt +cg +ms +ms aa aa aa aa aa +DD +Dw +fe +AR +av +ER +yz +Fx +Se +av +As +ME +LO +yj +df +vp +YE +jA +qL +eI +QM +dD +av +Hv +MM +av +av +ad +ad +ad aa +HY +GT +If aa +HY +GT +If aa +HY +GT +If aa aa aa @@ -47859,8 +43800,6 @@ aa aa aa aa -af -af aa aa aa @@ -47880,96 +43819,14 @@ aa aa aa aa -ah -ah -ah -ah -ah aa aa aa aa -ad -ad -au -au -au -au -au -el -au -au -au -au -gO -MT -au -iq -iX -jC -kb -iX -lh -lU -iX -na -nI -lP -BW -oN -oN -qM -oN -oN -sw -mS -mS -uF -vg -vW -wG -xk -uI -uI -uI -uI -uK -TI -TX -uK -Bd -bl -sr -sr -sr -sr -sr -AM -AW -Br -bl -Ec -av -DW -Er -EM -Fc -Fm -FJ -Dt -Dt -Dt -Uc -Um -UT -mV -Ft -Dt -Dt -Dt -Dt aa aa +"} +(123,1,1) = {" aa aa aa @@ -48034,8 +43891,6 @@ aa aa aa aa -"} -(117,1,1) = {" aa aa aa @@ -48078,12 +43933,111 @@ aa aa aa aa +cr +aG +th +BC +bV +cr +dI +Ti +au +eM +uj +fy +gw +uY +uY +uY +TC +di +iu +di +di +di +di +di +di +kf +di +di +di +Ci +di +di +pr +di +kZ +kZ +kZ +FN +kZ +kZ +ms +vg +ms +wM +wM +ms +ms +ms +Pa +Pa +Pa +ms +Aj +Bn +tO +Bn +Ec +ms +ms +ms +ms +ms +ms +uK +qP +DF +Ed +Ew +ES +Fh +Fy +FP +av +av +NB +UJ +eK +Nx +il +il +il +il +il +Qa +Qa +av +ae +HE +HL +Eo aa aa aa aa +HY +GT +If aa +HY +GT +If aa +HY +GT +If aa aa aa @@ -48128,6 +44082,8 @@ aa aa aa aa +"} +(124,1,1) = {" aa aa aa @@ -48137,11 +44093,6 @@ aa aa aa aa -ah -aR -br -bG -ah aa aa aa @@ -48150,81 +44101,6 @@ aa aa aa aa -ad -co -cC -cC -au -fr -fR -gq -ej -Zk -au -iq -iX -iX -kc -iX -kc -iX -iX -nb -nJ -kC -BX -pq -mq -iq -lN -mq -LI -mS -QN -uI -uI -vX -wH -wF -xL -uI -yX -AR -AR -RK -YB -yN -Jf -bl -nA -ys -Ab -AL -sr -AM -Bp -AM -bl -Am -av -DX -Es -EN -Fd -Fu -FK -EZ -EZ -Gi -Gp -Gy -EZ -EZ -ln -Hs -zg -HI -Dt aa aa aa @@ -48291,8 +44167,6 @@ aa aa aa aa -"} -(118,1,1) = {" aa aa aa @@ -48316,17 +44190,110 @@ aa aa aa aa +cr +sO +LS +bW +Oy +cr +tW +cr +cr +xr +fz +fz +fz +gR +So +gR +OU +Md +fz +fz +fz +NR +fz +fz +fz +mr +OK +Rs +Rs +sh +Rs +Rs +rQ +Rv +rA +OW +EE +tt +mq +Nh +vV +ug +we +uh +uh +uh +uh +uh +uh +uh +uh +uh +uh +uh +uh +uh +uh +uh +ZR +uh +uh +uh +Dk +Fg +Dx +DG +Ee +VF +ET +Fi +Fz +FQ +ul +Wa +WS +RU +eK +Pb +NS +Xf +Ui +Ui +zR +eK +eK +Zi +bk +ST +HM +Eo aa aa aa aa aa +GH aa aa aa +GH aa aa aa +GH aa aa aa @@ -48372,6 +44339,8 @@ aa aa aa aa +"} +(125,1,1) = {" aa aa aa @@ -48394,94 +44363,13 @@ aa aa aa aa -aE -aT -bs -bH -ah aa aa -cn -ad aa aa aa aa aa -co -cC -em -au -fs -dI -dI -dI -hs -au -iq -iX -jD -VR -kI -Fl -lV -iX -nc -nK -BV -BY -pq -mq -ng -DJ -sa -oI -tp -mS -uI -vi -kD -wH -wF -xM -uI -yY -zs -Tp -Ao -zW -AH -AS -bl -Bs -Bs -Bs -Bs -sr -tc -tU -sr -bl -GL -av -DY -Et -EO -Fe -Fv -FL -Gb -Gf -Gj -Gq -Gz -Gz -Ha -YA -Ht -HB -HJ -Dt aa aa aa @@ -48548,8 +44436,6 @@ aa aa aa aa -"} -(119,1,1) = {" aa aa aa @@ -48561,13 +44447,110 @@ aa aa aa aa +cr +UG +Ym +pe +CA +ut +AU +kI +Ax +kh +gQ +gQ +Xx +kh +gQ +kh +ij +gQ +gQ +gQ +Xx +gQ +Xx +gQ +Xx +iN +ll +gQ +gQ +Jk +gQ +gQ +iN +po +aV +GU +cD +cD +sc +iE +TH +aV +sC +aV +aV +Rr +aV +aV +aV +Rr +aV +aV +aV +Rr +aV +aV +aV +aV +aV +aV +aV +aV +aV +Sq +sC +aV +sC +aV +VZ +Fi +iB +tg +XQ +Zi +YD +UJ +eK +dV +zR +Ui +Ui +Ui +zR +eK +eK +Zi +bk +ST +QC +Eo +Eo +Eo +av +TZ aa +Jt aa aa aa +Jt aa aa aa +Jt aa aa aa @@ -48580,7 +44563,6 @@ aa aa aa aa -ab aa aa aa @@ -48614,6 +44596,24 @@ aa aa aa aa +"} +(126,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -48651,94 +44651,9 @@ aa aa aa aa -ah -aW -bt -bI -ah -ad -co -Pr -co -ad aa aa aa -co -co -cC -en -au -ft -dI -ej -Ti -ht -au -Sm -iX -jE -kd -CP -kd -lW -iX -nd -nL -on -oR -mq -mq -is -lN -mq -mS -tq -mS -uI -vj -vZ -wJ -xl -uI -uI -yZ -zu -uK -uK -uK -uK -AT -bl -Bv -BD -BP -og -sr -td -tV -uA -bl -Am -av -DZ -En -EL -Ff -Fw -Ad -Dt -Dt -Dt -Eo -Eo -Eo -Dt -Hg -DC -ex -HK -Dt aa aa aa @@ -48789,6 +44704,139 @@ aa aa aa aa +cr +aW +Ym +Ym +Sb +bC +YY +Qk +oE +px +qI +qI +fA +hY +gx +gS +eO +iM +iM +iM +iM +iM +iM +iM +iM +na +ni +OY +uY +LY +uY +OY +eo +po +aV +GU +cD +tv +cD +rf +TH +Rr +jT +Rt +Pg +Rt +Pg +Pg +Pg +Pg +Pg +Pg +Pg +Rt +Pg +Rt +Pg +Rt +Pg +Pg +Pg +Pg +Rt +fX +Dy +Pg +Ef +Pg +EU +Fj +FA +FR +Wb +MW +XE +Jc +OS +dV +zS +Ui +Qv +Ui +SB +eK +Tw +HW +TT +YC +Be +Tl +gW +AK +sf +Oj +UY +Rc +Jt +Jt +Jt +Jt +Jt +Jt +Jt +Jt +GM +GR +yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -48806,7 +44854,7 @@ aa aa aa "} -(120,1,1) = {" +(127,1,1) = {" aa aa aa @@ -48897,6 +44945,7 @@ aa aa aa aa +ab aa aa aa @@ -48907,112 +44956,119 @@ aa aa aa aa -ah -ah -aX -ah -ah -ah -ad -co -AN -co -ad aa aa aa -co -dg -dJ -eo -au -fu -fS -gs -gP -JV -au -Rs -iX -jF -kd -kJ -kd -lX -iX -ne -nK -oo -Zf -pr -qd -qN -cH -mq -sy -tr -mS -uI -vk -wa -wK -xm -uI -Al -za -zV -An -Ar -AG -uK -AT -bl -Bu -BE -BQ -Bs -Bs -oF -Bs -Bs -bl -Yi +aa +aa +cr +RB +Ym +jL +vP +eW +yu +lC +bP +ow +gQ +Xx +gQ +MJ +lp +gQ +lp +gQ +gQ +Xx +gQ +gQ +gQ +Xx +gQ +iN +gQ +gQ +gQ +lp +gQ +gQ +gQ +po +aV +lW +cD +cD +cD +rf +TH +aV +aV +Rr +aV +aV +aV +aV +aV +aV +aV +aV +aV +aV +aV +aV +aV +aV +Rr +aV +aV +aV +aV +Mn +aV +aV +aV +aV +fZ +Fi +SW +PW +XQ +Zi +YD +UJ +eK +dV +zR +Ui +Ui +Ui +zR +eK +fE +Zi +SD +Xz +VX +Ys +Ys +ZM av -va -DC -DC -EY -DC -Aq -Dt -ad -ad -aa -aa +TZ aa -Dt -Dt -DC -QS -Dt -Dt +sT aa aa aa +Jt aa -HY -GS -If aa -HY -GS -If aa -HY -GS -If +Jt aa aa +OV +JO aa aa aa @@ -49054,6 +45110,8 @@ aa aa aa aa +"} +(128,1,1) = {" aa aa aa @@ -49062,8 +45120,6 @@ aa aa aa aa -"} -(121,1,1) = {" aa aa aa @@ -49115,6 +45171,7 @@ aa aa aa aa +ab aa aa aa @@ -49124,8 +45181,6 @@ aa aa aa aa -af -af aa aa aa @@ -49163,115 +45218,110 @@ aa aa aa aa -ah -ah -aF -NH -bv -bK -ah -aD -co -SX -co -aa -aa -co -co -co -dh -dK -co -au -er -fv -gt -fv -hu -au -iq -iX -jG -kd -CP -kd -lY -iX -nf -nM -iq -oS -iq -iq -Sy -ry -mq -mS -tq +cr +jz +UI +WO +Rj +cr +cr +QP +cr +Rf +gT +gT +gT +Po +gy +gT +gy +hV +gT +gT +Bq +vK +as +gT +gT +Ao +gT +gT +gT +Qt +gT +Mc +qO +ke +ui +xE +ge +ge +ge +LP +RN +ui +CE +ui +ui +ui +QG +ui +zy +ui +ui +gb ue -uI -uI -uI -uI -uI -uI -yp -zb -zv -uK -uK -uK -uK -AT -bl -xg -Bt -IS -Bs -Cj -CA -By -De -bl -Am -av -Eb -vY -FS -DC -DC -FO +ui +ui +QG +ui +Ib +ui +ui +eZ +ui +ui +AH +ui +ui +Eg +ui +EV +Fi +FB +PK +TK +mb +xj +TB +eK +dV +Di +NV +Ui +Ui +zR +eK +fE +Zi +bk +HC +PW Eo -ad aa aa aa aa -ad -Dt -Hu -ST -Dt -ad -ad -ad -ad aa -HY -GT -If +TM aa -HY -GT -If aa -HY -GT -If aa +GI aa aa aa +GI aa aa aa @@ -49317,10 +45367,10 @@ aa aa aa aa +"} +(129,1,1) = {" aa aa -"} -(122,1,1) = {" aa aa aa @@ -49381,8 +45431,6 @@ aa aa aa aa -af -af aa aa aa @@ -49420,110 +45468,117 @@ aa aa aa aa -ai -am -aI -ba -bw -TH -bU -aD -dW -NT -co -co -co -co -dJ -cD -Yj -Qu -di -fw -fw -fw -gu -gQ -Lq -di -iq -ir -ZE -kd -ZQ -kd -kF -iX -Cb -iq -ng -oL -ps -oL -op -rz -mq -sz -ts -CZ -uJ -vm -wc -YH -wL -wL -wL -zc -zw -zX -Ap -AR -AR -AU -bl -Bw -BE -BR -BZ -Ck -CB -BP -Df -bl -Am -av -vI -Ev -EQ -DC -DC -EB -Dt aa aa aa aa aa -ad +aa +aa +cr +kg +OC +dR +ml +cr +MK +OG +eu +nS +eu +fU +fU +es +fU +fU +zW +zW +zW +zW +zW +zW +di +di +gJ +Ov +gJ +di +di +di +di +di +di +di +ms +ms +Pa +Pa +Pa +ms +ms +ms +ms +Pa +Pa +Pa +ms +ms +ms +ms +ms +ms +ms +ms +Pa +Pa +Pa +ms +ms +ms +ms +ms +ms +hn Dt -DC -QS Dt -aa +Eh +Ex +EW +Fk +FC +FT +oy +il +ly +AQ +oy +wd +il +OZ +zR +zR +il +Qa +TL +av +Hx +Gt +HO +Eo aa aa aa aa HY -GT +Uu If -ad +aa HY -GT +He If -ad +aa HY -GT +He If aa aa @@ -49569,6 +45624,8 @@ aa aa aa aa +"} +(130,1,1) = {" aa aa aa @@ -49576,8 +45633,6 @@ aa aa aa aa -"} -(123,1,1) = {" aa aa aa @@ -49677,111 +45732,35 @@ aa aa aa aa -aj -ao -aJ -aY -aJ -MV -aJ -aD -XL -MF -DI -Wc -XD -MN -Qu -di -di -di -di -eL -fx -fx -gv -gQ -Sj -di -di -iX -iX -ke -ZQ -kd -ma -iX -Cc -nN -op -iq -pt +cr +cr +cr +cr +cr +cr +pa +AF +qr +qM +eu +SE +gX +xm +gX +tH +hc +zW Vf -iq -XQ -mq -sA -mS -uf -uK -vn -ms -ms -ms -ms -yq -GZ -zx -zY -zx -zx -zx -NK -bl -Bx -BG -oG -Bs -Cl -CC -CT -Dg -bl -Am -av -av -av -ER -yz -Fx -EB -Dt -aa -aa -aa -aa +jj +Vf +zW aa aa -Dt -Hv -MM -Dt -Dt -ad -ad -ad aa -HY -GT -If +DU +Pr aa -HY -GT -If aa -HY -GT -If aa aa aa @@ -49813,9 +45792,51 @@ aa aa aa aa +Cn +Wy +hU +ak +Je +av +av +av +av +mg +XQ +Py +oy +Oi +SM +Wj +pB +dV +eK +BB +qf +yk +ZG +Ur +nn +av +Hv +HD +av +av +ad +ad +ad aa +HY +Uu +If aa +HY +He +If aa +HY +He +If aa aa aa @@ -49833,8 +45854,6 @@ aa aa aa aa -"} -(124,1,1) = {" aa aa aa @@ -49862,6 +45881,8 @@ aa aa aa aa +"} +(131,1,1) = {" aa aa aa @@ -49934,111 +45955,16 @@ aa aa aa aa -aj -as -aK -aY -aJ -MV -bV -aD -ah -ah -ah -di -di -dN -di -di -me -me -di -eM -fy -fy -gw -gQ -TC -di -iu -iZ -iX -kf -kK -iY -kf -iX -nh -di -di -ms -ms -ms -ms -ms -ms -sB -tt -ug -ms -ms -ms -wM -wM -ms -ms -ms -ms -ms -ms -ms -ms -Bf -bl -bl -bl -bl -bl -bl -bl -CU -bl -bl -Dw -DF -Ed -Ew -ES -Fh -Fy -FP -Dt -Dt -ad aa aa aa aa -Eo -bk -HE -HL -Eo aa aa aa aa -HY -GT -If aa -HY -GT -If aa -HY -GT -If aa aa aa @@ -50065,6 +45991,26 @@ aa aa aa aa +eu +eu +eu +eu +vv +AF +AF +IM +eu +MB +jO +tU +Zf +bi +Ux +zW +RD +qe +Vf +jy aa aa aa @@ -50090,8 +46036,6 @@ aa aa aa aa -"} -(125,1,1) = {" aa aa aa @@ -50105,11 +46049,51 @@ aa aa aa aa +Cn +Nw +av +av +av +nz +nz +Ey +EX +vz +DC +FV +Ps +SJ +QE +gZ +pB +HU +eK +eK +eK +jf +cj +Qj +Rz +av +Tj +OF +av aa aa aa aa aa +HY +Uu +If +ad +HY +He +If +ad +HY +He +If aa aa aa @@ -50154,6 +46138,8 @@ aa aa aa aa +"} +(132,1,1) = {" aa aa aa @@ -50191,110 +46177,18 @@ aa aa aa aa -aj -at -aL -bb -bx -UR -Oc -IV -Na -Oc -IV -bW -cg -cr -So -Zv -fz -fz -cg -fz -fz -fz -So -gR -OU -Md -fz -fz -fz -NR -OU -fz -kL -mr -ll -gQ -oq -aV -aV -aV -Rr -Mc -aV -OW -tu -Nh -aV -Mc -we -aV -aV -aV -aV -Rr -aV -aV -Pa -aV -aV -RQ -Bn -uh -RI -uh -ZR -uh -CD -CV -Dh -Dk -Dx -DG -Ee -Rr -ET -Fi -Fz -FQ -Gc -Eo -ad aa aa aa aa -Eo -bk -ST -HM -VG -Eo -Dt -Dt aa aa -GH aa aa aa -GH aa aa aa -GH aa aa aa @@ -50347,8 +46241,6 @@ aa aa aa aa -"} -(126,1,1) = {" aa aa aa @@ -50356,6 +46248,26 @@ aa aa aa aa +NL +RE +gI +mP +xt +Sa +qN +ws +Az +gX +FM +Bx +MF +uy +nE +CW +je +du +ob +jy aa aa aa @@ -50394,9 +46306,51 @@ aa aa aa aa +Cn +rd +av +bd +uB +XQ +DC +DC +DC +PF +Eu +FW +oy +HN +DB +Pm +AP +Ug +yT +yT +yT +BM +Uj +BW +dc +av +DC +Gt +av +ad +ad +ad +ad aa +HY +Uu +If aa +HY +He +If aa +HY +He +If aa aa aa @@ -50441,6 +46395,8 @@ aa aa aa aa +"} +(133,1,1) = {" aa aa aa @@ -50448,114 +46404,9 @@ aa aa aa aa -ak -ax -aM -bc -bz -bN -bX -ch -cs -cE -cU -Ym -LL -Sb -LL -Qk -LL -LL -es -LL -fA -LL -gx -gS -eO -LL -LL -LL -LL -eu -eO -LL -LL -LL -ni -Xx -or -aV -aV -Rr -aV -aV -aV -sC -tv -aV -aV -Rr -aV -aV -aV -aV -aV -aV -aV -Rr -aV -aV -Np -Rv -Pg -Pg -YZ -Pg -Pg -Pg -Pg -CW -Rt -Pg -Dy -Pg -Ef -Pg -EU -Fj -FA -FR -DC -Eo -ad -ad aa aa aa -Dt -Hw -hi -HN -HU -eK -HW -TT -GR -Gw -Jt -Jt -Jt -Jt -Jt -Jt -Jt -Jt -Jt -GM -GR -GR -JO aa aa aa @@ -50604,8 +46455,6 @@ aa aa aa aa -"} -(127,1,1) = {" aa aa aa @@ -50656,6 +46505,26 @@ aa aa aa aa +eu +eu +eu +eu +Ba +BD +ax +aL +zW +gX +Cb +YV +xg +yH +Wd +zW +Vf +AX +Vf +zW aa aa aa @@ -50694,121 +46563,68 @@ aa aa aa aa +Cn +ga +av +Wn +DC +DC +DC +DC +DC +cp +Gb +FX +oy +Qg +Vm +Zh +oO +XW +UA +eK +eK +eK +eK +ZU +UA +av +DC +Gt +av +av aa aa aa -ab aa +HY +XK +If aa +HY +HT +If aa +HY +HT +If aa aa aa aa -aj -ay -aN -be -bA -bO -bY -ci -ct -cF -ci -WO -Rj -gT -gT -VZ -gT -gT -Wr -gT -fU -gT -gy -Wr -gy -hV -gT -gT -gT -kg -gy -jI -kM -gQ -ll -gQ -oq -oT -aV -qe -qO -rA -aV -Yv -tw -ui -ui -MB -ui -ui -ui -ui -QG -ui -zy -ui -ui -ui -ap -SE -ui -QG -XS -ui -ui -ui -CE -Co -ui -QG -XS -ui -Eg -aV -EV -Fi -FB -PK -Gd -Eo aa aa aa aa aa -Eo -bk -HC -Gt -Eo -Eo -Eo -Dt aa aa -GI aa aa aa -GI aa aa aa -GI aa aa aa @@ -50836,6 +46652,8 @@ aa aa aa aa +"} +(134,1,1) = {" aa aa aa @@ -50861,8 +46679,6 @@ aa aa aa aa -"} -(128,1,1) = {" aa aa aa @@ -50922,7 +46738,6 @@ aa aa aa aa -ab aa aa aa @@ -50948,6 +46763,25 @@ aa aa aa aa +zW +zW +eu +eu +eu +VJ +eu +zW +zW +rH +ev +zW +qt +ne +zW +zW +zW +zW +zW aa aa aa @@ -50962,111 +46796,17 @@ aa aa aa aa -aj -az -aO -aJ -aY -bM -bZ -aD -ah -ah -ah -dR -UI -UI -UI -CY -UI -ZP -Rx -di -eQ -di -cY -cY -cY -cY -iv -ja -di -WQ -gQ -lp -di -di -nk -di -di -ms -ms -ms -ms -ms -ms -sD -tx -uj -bj -bj -wh -wh -wh -wh -bj -bj -bj -bj -bj -bj -Vw -ms -ep -ep -dp -ms -ms -ms -ms -ms -ms -ms -nQ -Dt -Eh -Ex -EW -Fk -FC -FT -Dt -Dt aa aa aa aa aa -Eo -Hx -Gt -HO -Eo aa aa aa aa -HY -He -If aa -HY -He -If aa -HY -He -If aa aa aa @@ -51080,6 +46820,42 @@ aa aa aa aa +Cn +vx +av +bm +DC +DC +Ej +DC +Tg +TY +FD +FY +oy +uG +oy +oy +oy +PZ +il +Zi +av +Zi +Zi +Oz +av +Hh +En +HC +HP +av +aa +tl +xZ +tl +xZ +VM aa aa aa @@ -51118,8 +46894,6 @@ aa aa aa aa -"} -(129,1,1) = {" aa aa aa @@ -51135,6 +46909,8 @@ aa aa aa aa +"} +(135,1,1) = {" aa aa aa @@ -51219,111 +46995,13 @@ aa aa aa aa -aj -aB -aJ -aJ -aY -bM -aJ -aD -cu -Mk -cV -dS -Rx -Qh -Od -ND -Od -Xe -Rx -eR -fD -fV -cY -hv -WF -cY -cY -cY -cY -QY -gQ -lo -di -mb -nm -nW -nW -nW -nW -nW -tP -nS -qk -Xw -ty -ty -bj -vq -vv -vv -vv -xN -yr -bj -pg -qC -rT -bj -aq -Sa -QW -SP -YS -Vq -gV -Vq -Sa -ZH -Rd -VN -Xt -av -av -av -av -mg -DC -Py -Dt -ad aa aa aa aa -ad -Dt -Hv -HD -Dt -Dt -ad -ad -ad aa -HY -He -If aa -HY -He -If aa -HY -He -If aa aa aa @@ -51342,6 +47020,25 @@ aa aa aa aa +zW +sq +sq +Qn +Xi +Al +UK +zW +Wt +QH +Xm +zW +Ai +ne +zW +IP +dN +Hn +zW aa aa aa @@ -51353,6 +47050,7 @@ aa aa aa aa +ab aa aa aa @@ -51375,13 +47073,46 @@ aa aa aa aa -"} -(130,1,1) = {" aa aa aa aa +Cn +sG +av +Dl +Dl +DK +Ek +En +Iq +FL +kw +FU +Gb +RP +Sw +Gb +vl +OJ +oK +Mv +US +Gr +Gr +Xh +en +DC +Eu +HF +HQ +av aa +oC +oC +oC +oC +VM aa aa aa @@ -51435,6 +47166,8 @@ aa aa aa aa +"} +(136,1,1) = {" aa aa aa @@ -51476,111 +47209,11 @@ aa aa aa aa -al -aC -aP -bf -bB -bP -ca -aD -cv -cJ -UL -dT -Rx -Zt -Od -ND -Od -Od -Rx -eS -dm -dU -cZ -do -dr -hW -iw -jb -cY -LS -gQ -lp -di -nZ -nl -nl -nl -nl -nl -nl -vx -nS -qk -sF -ty -ty -bj -vr -wi -wj -wk -xO -pV -bj -pX -LX -rU -bj -tQ -Sa -SP -Tk -Up -Uw -Uw -Ws -Sa -Wu -av -av -av -av -Ei -Ey -EX -EB -DC -FV -Eo -ad -ad -ad -ad -ad -ad -Dt -DC -Gt -Dt aa aa aa aa aa -HY -He -If -ad -HY -He -If -ad -HY -He -If aa aa aa @@ -51632,8 +47265,6 @@ aa aa aa aa -"} -(131,1,1) = {" aa aa aa @@ -51646,6 +47277,25 @@ aa aa aa aa +zW +Vj +Su +Su +Su +Su +xN +zW +kL +jF +ng +zW +Bg +TA +CW +je +du +QN +jy aa aa aa @@ -51684,7 +47334,42 @@ aa aa aa aa +Cn +Jj +av +Mg +Dm +DL +El +DC +lr +Xk +Ve +FZ +Ge +Gg +IZ +IZ +YW +Bk +IZ +IZ +Gl +Gs +Qo +Jb +GA +Hi +Hy +HG +HR +av aa +oC +oC +oC +oC +VM aa aa aa @@ -51733,111 +47418,15 @@ aa aa aa aa -ah -ah -aQ -bh -bC -bQ -ah -aD -cw -Qq -cW -Zr -eC -Ir -Ir -UD -Ir -Ny -Rx -cY -cY -cY -cY -Ut -dr -Wi -iz -ix -QL -SW -gQ -lq -di -NC -nl -nO -os -oU -pu -nl -qR -RH -qk -sG -ty -Vx -bj -vs -wj -wN -xn -xP -yt -bj -pW -qD -rV -bj -et -Sa -VW -LM -Ri -LM -Vq -Vq -Sa -Wu -av -bd -DC -nz -DC -DC -DC -PF -Eu -FW -Dt aa aa -ad -ad aa aa -Dt -DC -Gt -Dt -ad -ad -ad -ad aa -HY -He -If +"} +(137,1,1) = {" aa -HY -He -If aa -HY -He -If aa aa aa @@ -51889,8 +47478,6 @@ aa aa aa aa -"} -(132,1,1) = {" aa aa aa @@ -51947,6 +47534,25 @@ aa aa aa aa +zW +sq +Su +Su +Su +Su +xN +zW +Lt +BS +Ju +zW +cL +ne +zW +Vl +nu +dN +zW aa aa aa @@ -51985,116 +47591,57 @@ aa aa aa aa +Cn +Wk +av +Dn +Dn +DM +Ek +DC +lr +Fn +Dt +Eo +Eo +Eo +Dt +Dt +UU +VH +Dt +Dt +Gm +sK +TO +Xb +Hb +Hj +AR +av +av +av aa +oC +oC +oC +oC +VM aa aa aa aa aa -aD -bg -bg -bD -bg -bg -ad -cw -cJ -cX -pp -Rx -Sf -Pk -TF -Px -Ov -Rx -eT -fX -VU -cY -hw -EE -hX -iy -jd -XY -WL -gQ -lr -di -nZ -nl -nP -ot -oV -pv -nl -nl -nl -nl -sH -tz -QB -bj -vt -wk -wO -xo -xQ -yu -bj -zC -bj -bj -bj -AX -Sa -PB -QD -Uq -RG -RG -Jz -Sa -Ue -av -Wn -DC -DC -DC -DC -DC -cp -Gb -FX -Dt aa aa -ad aa aa -Dt -Dt -DC -Gt -Dt -Dt aa aa aa aa -HY -HT -If aa -HY -HT -If aa -HY -HT -If aa aa aa @@ -52133,6 +47680,8 @@ aa aa aa aa +"} +(138,1,1) = {" aa aa aa @@ -52146,8 +47695,6 @@ aa aa aa aa -"} -(133,1,1) = {" aa aa aa @@ -52244,99 +47791,99 @@ aa aa aa aa +zW +IA +Su +Su +Su +Su +xN +zW +zW +zW +ev +zW +Zg +ne +zW +zW +zW +zW +zW +zW aa aa aa aa aa -bg -bi -bE -bT -bg aa -cw -cw -cw -Tc -Rx -Ir -Ir -ND -Ir -Ir -Rx -eU -fH -QU -cY -hx -MH -hY -QR -je -cY -On -gQ -lp -di -nZ -nl -mM -ou -oW -pw -qg -qS -rC -sb -sI -tA -tF -uL -vu -vu -wP -xp -vu -yv -bj -zD -tS -At -bj -hU -Sa -LM -OM -LM -MP -UG -Vq -Sa -WN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Cn +sG av -bm -DC +Do +Do +DN +Ek DC -Ej -Ez -Tg -TY -FD -FY -Dt -Dt -Dt -Eo -Eo -Eo +lr +Fo Dt -Hh -En -HC -HP +yo +Ql +YU +Oe +YJ +Zp +MR +NQ +Jl Dt +Ni +fW +UC +Hc +Hk +am +ad +ad +tl +xZ +oC +oC +oC +oC +VM aa aa aa @@ -52390,6 +47937,19 @@ aa aa aa aa +"} +(139,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -52403,8 +47963,6 @@ aa aa aa aa -"} -(134,1,1) = {" aa aa aa @@ -52490,6 +48048,44 @@ aa aa aa aa +zW +sq +Su +Su +Su +Su +xN +WM +IE +wT +KH +zW +Vb +ne +Bb +Bb +Bb +Bb +qe +zW +zW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -52506,94 +48102,45 @@ aa aa aa aa -bg -bn -bF -bq -bg aa aa aa -cw -Tc -Rx -IB -ZZ -PT -dn -Ir -Rx -cY -cY -gB -cY -da -da -hZ -TV -da -cY -OV -gQ -lp -di -nZ -nl -nx -ou -ou -YF -qh -qT -NJ -sc -sJ -Sg -PE -uM -vv -vv -vv -xq -vv -yw -zf -zE -Ae -Au -bj -Zz -Sa -Rf -Sa -Sa -Sa -Sa -Sa -Sa -Wu +Cn +Wk av -Dl -Dl -DK +Mh +Dp +DO Ek En -Gt -EB -En -FU -DC -RP -Gk -Gr -Gr -Gr -DC -DC -Eu -HF -HQ +lr +Fp Dt +NQ +NQ +Vr +NQ +NQ +UU +NQ +NQ +Jl +Dt +Gu +Rp +rp +Hd +Hl +am +ad +ad +oC +oC +oC +oC +oC +oC +VM aa aa aa @@ -52647,6 +48194,8 @@ aa aa aa aa +"} +(140,1,1) = {" aa aa aa @@ -52660,9 +48209,6 @@ aa aa aa aa -"} -(135,1,1) = {" -aa aa aa aa @@ -52759,98 +48305,33 @@ aa aa aa aa +zW +qb +Su +Su +Su +Su +xN +qe +qe +qe +VT +rb +cL +nH +Xo +Xo +Xo +Xo +Yv +od +zW aa aa aa aa -bg -bp -bR -nj -bg -ad aa aa -cw -Tc -Rx -Nc -Ms -Vv -Xi -YI -XM -eV -fI -fY -Xr -ha -No -Vt -gX -jg -Oq -ZN -gT -ls -di -nZ -nl -ny -ou -oX -px -qi -qU -rD -sd -sK -Xw -uq -uN -vw -wl -vw -wl -xR -yx -bj -zF -Af -Av -bj -hU -Sa -LM -oQ -Sa -Om -TN -Xd -AC -TK -av -Mg -Dm -DL -El -DC -Gt -Xk -Ve -FZ -Ge -Gg -Gl -Gs -IZ -GA -GA -Hi -Hy -HG -HR -Dt aa aa aa @@ -52881,8 +48362,42 @@ aa aa aa aa +Cn +Wk +av +Dq +Dq +DP +Ek +DC +lr +Fp +Dt +yo +Ql +Zn +Ot +Wr +gY +NQ +NQ +Jl +Dt +Gv +MS +GY +Hd +Hm +am aa aa +oC +oC +oC +oC +oC +oC +VM aa aa aa @@ -52917,8 +48432,6 @@ aa aa aa aa -"} -(136,1,1) = {" aa aa aa @@ -52938,6 +48451,8 @@ aa aa aa aa +"} +(141,1,1) = {" aa aa aa @@ -53020,98 +48535,6 @@ aa aa aa aa -bg -bq -bq -bq -bg -ad -ad -aa -cw -Tc -Rx -Rx -Rx -Rx -Rx -Rx -Rx -eW -Fq -fZ -gC -hb -hz -ia -iA -jh -Xs -PM -gQ -lp -di -nZ -nl -nT -ov -oY -py -nl -nl -nl -nl -sL -Xw -ul -bj -vv -vv -vv -xr -xS -wi -bj -zG -Ag -Aw -bj -Mn -Sa -LM -Jk -Sa -SF -MU -TN -Bb -Pc -av -Dn -Dn -DM -Ek -DC -Gt -Fn -Dt -Eo -Eo -Eo -Gm -Gt -Jc -En -Hb -Hj -Dt -Dt -Dt -Dt -aa -aa -aa -aa aa aa aa @@ -53139,6 +48562,27 @@ aa aa aa aa +zW +yc +Su +Su +Su +Su +xN +jy +qe +Oo +Ne +BQ +lA +nH +Xo +Xo +Xo +Xo +Yv +uH +jy aa aa aa @@ -53174,11 +48618,43 @@ aa aa aa aa -"} -(137,1,1) = {" aa +Cn +sG +av +Dr +Dr +DQ +Em +En +lr +pJ +Dt +Dt +Gm +Dt +Dt +Dt +Dt +Dt +Dt +av +XO +Dt +CQ +gm +Eo +zk +AR aa aa +oC +oC +oC +oC +oC +oC +VM aa aa aa @@ -53197,6 +48673,7 @@ aa aa aa aa +ab aa aa aa @@ -53231,6 +48708,8 @@ aa aa aa aa +"} +(142,1,1) = {" aa aa aa @@ -53277,97 +48756,6 @@ aa aa aa aa -bg -by -bS -ym -bg -ad -aa -aa -VV -pp -cw -QX -Rx -MA -YQ -dX -eB -eX -Fq -ga -gD -hc -da -ew -iB -WY -cY -Ou -gQ -lp -di -nZ -nl -nU -ow -oZ -pz -nl -qV -rF -se -sM -Xw -um -bj -SY -wm -wm -wm -xT -yy -bj -zH -Rw -mL -bj -hU -Sa -Vi -LM -Vu -IK -QQ -TN -AC -Wu -av -Do -Do -DN -Ek -DC -Ea -Fo -Dt -ad -ad -ad -Dt -Ni -As -DC -Hc -Hk -Eo -ad -ad -aa -aa -aa -aa aa aa aa @@ -53431,37 +48819,27 @@ aa aa aa aa -"} -(138,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +zW +dx +sq +XL +PN +PN +QR +jy +wC +qe +AD +qe +qe +nH +Xo +Xo +Xo +Xo +Yv +uH +jy aa aa aa @@ -53485,6 +48863,7 @@ aa aa aa aa +ab aa aa aa @@ -53497,9 +48876,42 @@ aa aa aa aa +Cn +OA +Vx +Gb +Gb +Gb +Gb +Ul +Eq +Fr +Dt +gD +wP +Sg +Ii +WJ +Pi +NQ +XF +NQ +wg +av +Ig +gm aa +Ho +QV aa aa +oC +oC +oC +oC +oC +oC +VM aa aa aa @@ -53534,93 +48946,10 @@ aa aa aa aa -bg -bg -bg -bg -bg aa aa aa -cw -Tc -Yq -QX -Rx -Nw -dq -dY -dY -eY -Fq -dZ -dr -eZ -da -gb -iC -eZ -cY -ki -Xx -lp -di -nZ -nl -nl -nl -nl -nl -nl -qW -rG -qk -sN -Xw -un -bj -bj -wn -wQ -xs -xU -xW -bj -zI -Rw -Ay -bj -hU -Sa -ZW -MJ -Sa -dk -TN -CO -AC -Pc -av -Mh -Dp -DO -Ek -En -Gt -Fp -Dt aa -ad -ad -Dt -Gu -Za -DC -Hd -Hl -Eo -ad -ad aa aa aa @@ -53636,6 +48965,8 @@ aa aa aa aa +"} +(143,1,1) = {" aa aa aa @@ -53688,8 +49019,6 @@ aa aa aa aa -"} -(139,1,1) = {" aa aa aa @@ -53747,6 +49076,27 @@ aa aa aa aa +zW +Ua +Ua +sq +lb +zw +oc +tc +zl +Ro +Tu +aZ +qe +nH +Xo +Xo +Xo +Xo +Yv +uH +jy aa aa aa @@ -53783,9 +49133,42 @@ aa aa aa aa +Cn +wb +av +Ds +DC +DR +En +En +Yu +rc +ym +yh +wA +wA +mC +cv +ph +NQ +NQ +NQ +wg +av +Tt +ZM aa +Hp +QV aa aa +VM +oC +oC +oC +oC +oC +VM aa aa aa @@ -53799,83 +49182,8 @@ aa aa aa aa -cw -Tc -cw -cw -Rx -Nw -OP -Nw -Nw -Tq -Fq -TJ -gE -hd -da -gc -iD -hd -cY -LR -LL -LW -cG -ox -nn -nX -oA -pC -pA -qk -ag -rH -qk -sO -tC -um -bj -vy -wo -wR -wR -xV -yA -bj -zJ -Ai -QO -AO -AY -Sa -Sa -Sa -Sa -Th -Ci -AC -AC -Pc -av -Dq -Dq -DP -Ek -DC -dQ -Fp -Dt aa -ad aa -Dt -Gv -GB -GY -Hd -Hm -Eo aa aa aa @@ -53914,6 +49222,8 @@ aa aa aa aa +"} +(144,1,1) = {" aa aa aa @@ -53945,8 +49255,6 @@ aa aa aa aa -"} -(140,1,1) = {" aa aa aa @@ -54025,6 +49333,27 @@ aa aa aa aa +zW +zW +zW +zW +zW +zW +zW +zW +wu +qe +CV +CB +CB +Sv +tz +tz +tz +tz +Sf +PO +zW aa aa aa @@ -54056,89 +49385,47 @@ aa aa aa aa -YW -wf -cJ -cJ -Rx -Vj -YY -Po -Vd -Nw -Fq -cY -cY -cY -cY -cY -cY -cY -cY -LS -gQ -lq -di -mv -nq -qP -pa -qP -pB -qk -qk -qk -qk -sO -Xw -uo -bj -vz -wp -UC -wp -wp -wp -zh -zK -Ah -Az -bj -Qy -WV -Ox -ZD -WV -nR -Bb -CO -Bb -Wu -av -Dr -Dr -DQ -Em -CI -CJ -CK -Dt aa -ad aa -Gm -Dt -GC -Eo -Eo -Hn -Dt aa aa aa +Cn +bE +av +av +OQ +av +Re +En +En +XQ +xk +NQ +Bj +vA +Cv +NQ +pV +cv +Oa +Tz +wg +av +Og +av aa +Ho +QV aa aa +VM +oC +oC +oC +oC +oC +VM aa aa aa @@ -54192,6 +49479,8 @@ aa aa aa aa +"} +(145,1,1) = {" aa aa aa @@ -54202,8 +49491,6 @@ aa aa aa aa -"} -(141,1,1) = {" aa aa aa @@ -54310,86 +49597,22 @@ aa aa aa aa -YW -YW -YW -YW -YW -YW -VJ -YW -Ib -Ib -Ib -Ib -fa -Ib -Wv -SC +zW +zW +jy +jy +jy +jy +zW +Zz +Bw +rI +Bw Wv -Pi -PI -PI -PI -OC -PR -gQ -lp -di -mw -WG -nZ -nS -nZ -nS -MO -nS -nS -zz -sO -Xw -um -bj -vA -jS -wS -xt -wq -yB -bj -zL -Aj -AA -bj -AZ -kY -AC -AC -BM -BM -AC -AC -CL -RB -aH -bk -DC -DC -DC -kA -XR -Fr -Dt -ad -ad -ad +zW +zW aa -Eo -GD -Eo aa -Ho -ad aa aa aa @@ -54424,11 +49647,42 @@ aa aa aa aa +Cn +WW +XO +RX +DC +av +Eo +Eo +Eo +av +av +av +XO +av +pf +xo +xo +ta +pf +NQ +wg aa +Tx aa aa +Ho +QV aa aa +VM +oC +oC +oC +oC +oC +VM aa aa aa @@ -54459,8 +49713,6 @@ aa aa aa aa -"} -(142,1,1) = {" aa aa aa @@ -54484,6 +49736,10 @@ aa aa aa aa +"} +(146,1,1) = {" +aa +aa aa aa aa @@ -54567,95 +49823,19 @@ aa aa aa aa -VD -Ux -Ux -Pu -Te -Ux -Ux -Ux -Ib -Dc -ZV -PV -SN -Ib -Wv -Wd -JZ -JZ -JZ -JZ -JZ -JZ -LS -gQ -lp -di -mx -nS -nZ -nS -pc -qQ -nS -pb -ze -qk -sP -Xw -um -bj -bj -bj -bj -bj -bj -wr -bj -bj -bj -bj -bj -Je -Bl -AC -ad -ad aa aa -AC -QV -HZ -av -Ds -DC -DR -En -BO -Gt -Fs -Dt aa -ad aa aa -Dt -XE -Eo aa -Hp -ad aa aa -ad aa aa aa aa aa -ad aa aa aa @@ -54680,6 +49860,14 @@ aa aa aa aa +zW +jy +jy +zW +jy +jy +zW +aa aa aa aa @@ -54714,16 +49902,44 @@ aa aa aa aa +Cn +Cn +Cn +WW +av +av +av +av +WU +WU +WU aa aa -"} -(143,1,1) = {" aa +ad +av +Mo +xo +XC +ta +pf +fs +wg aa +mu aa aa +Ho +QV aa aa +VM +oC +oC +oC +oC +oC +VM aa aa aa @@ -54777,6 +49993,8 @@ aa aa aa aa +"} +(147,1,1) = {" aa aa aa @@ -54824,95 +50042,19 @@ aa aa aa aa -VD -LU -Ux -VF -Ux -Ux -Ux -Ux -Ib -IC -Io -YP -YK -Ib -jl -fC -JZ -hA -ib -iE -ji -JZ -LT -gQ -lr -di -di -nS -nZ -oz -oz -oz -ql -oz -oz -sf -sQ -tD -up -uO -vB -tR -wT -xu -xX -wT -zi -wT -Ak -AB -AP -WP -NX -AC aa -ad aa aa -AC -CM -WW -av -Dt -OQ -Dt -Re -ED -Fw -Dt -Dt aa -ad -ad aa -Dt -GF -Dt aa -Ho -ad aa aa -ad aa aa aa aa aa -ad aa aa aa @@ -54973,8 +50115,6 @@ aa aa aa aa -"} -(144,1,1) = {" aa aa aa @@ -55019,16 +50159,44 @@ aa aa aa aa +Cn +WB +Xj +PC +OX +Tv +Ze +WB +WU aa aa aa aa aa +ad +av +av +av +XO +av +av +av +wg aa +mu aa aa +Ho +QV aa aa +VM +oC +oC +oC +oC +oC +VM aa aa aa @@ -55079,97 +50247,25 @@ aa aa aa aa -YW -YW -YW -Ux -Ux -Ux -Ux -VF -Ux -LU -Ia -IC -FN -Yx -Fg -OD -Wv -jO -RY -hB -ic -hB -jj -jL -Nj -gT -Vp -mc -di -no -ox -oz -pd -QF -pD -qX -oz -sg -sO -Xw -um -uP -Qz -dP -wU -xv -wU -xv -xy -zM -zQ -AC -AC -Or -WC -AC aa -ad aa aa -AC -Cn -Wk -XO -Zh -DC -Dt -Eo -BS -Eo -Dt +"} +(148,1,1) = {" aa aa -ad aa aa aa -GJ aa aa -Ho -ad aa aa -ad aa aa aa aa aa -ad aa aa aa @@ -55230,8 +50326,6 @@ aa aa aa aa -"} -(145,1,1) = {" aa aa aa @@ -55322,111 +50416,119 @@ aa aa aa aa +Cn +WB +WB +Qw +Je +Je +Je +Cn +Cn +Cn aa aa aa aa +ad aa aa aa +ad aa aa aa aa aa +mu aa aa -VD -Ux -Ux -Ux -Ux -Ux -VF -VF -Ux -Ux -Ia -WT -WD -MQ -Zl -Ib -OB -kj -JZ -hC -id -iG -jk -JZ -LS -gQ -lp -md -di -np -nZ -oz -MD -pE -qm -qY -oz -sh -sO -tE -um -uS -vD -wt -wV -xw -wV -yD -ws -zN -zQ -ad -AC -AC -Bm -AC +Hq +Hz aa ad +VM +zX +nD +tk +nD +zX +lf ad -PD -PD -PD -PC -PD -PD -PD -PD aa -BT aa -ad aa aa -ad aa aa aa -GJ aa aa -Ho -ad aa aa -ad aa aa aa aa aa -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(149,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -55487,8 +50589,6 @@ aa aa aa aa -"} -(146,1,1) = {" aa aa aa @@ -55572,19 +50672,57 @@ aa aa aa aa +Cn +Cn +SZ +kH +Ty +kH +km +Oh +WK +Zv +Cn aa aa aa aa +ad aa aa aa +ad aa aa aa aa aa +mu +ad aa +Hr +HA +HH +HS +HV +HS +HH +HH +HH +HS +Vk +HS +HH +HH +HH +HH +HH +HS +HS +HH +HH +JP +Ka aa aa aa @@ -55593,97 +50731,24 @@ aa aa aa aa -VD -VF -Ux -LU -Ux -VF -Ux -Ux -Ux -Ux -Ib -Ib -Ib -Ib -Vl -Ib -Ib -kl -JZ -JZ -JZ -JZ -JZ -JZ -LS -kN -lp -me -di -nS -nZ -oz -pf -pF -qn -qZ -oz -oz -sO -Xw -um -uS -vE -wu -wW -xx -wW -yE -ws -zO -zQ -ad aa -AC -TW -AC aa aa aa -PD -RR -Xj -PC -ZO -OX -Tv -Ze -WU -Mt -Vz -NA -yQ aa aa aa aa aa -GJ aa aa -Ho -ad aa aa -ad aa aa aa aa aa -ad aa aa aa @@ -55699,6 +50764,8 @@ aa aa aa aa +"} +(150,1,1) = {" aa aa aa @@ -55744,8 +50811,6 @@ aa aa aa aa -"} -(147,1,1) = {" aa aa aa @@ -55850,95 +50915,37 @@ aa aa aa aa -VD -Ux -Ux -Ux -Ux -Ux -Ux -Ux -VF -Ux -Ux -Ux -Nv -Sz -Ic -gQ -Xx -lt -LL -LL -Mf -kk -Ie -LQ -LV -kL -lp -di -di -nV -nZ -oz -pe -pF -qo -qY -rI -oz -Yo -tG -um -uS -vC -wv -ws -xy -xY -yF -zj -zP -zQ aa aa -AC -Ca -AC aa aa aa -PD -kS -QC -Qw -Qb -PD -PD -PD -PD -BU -PD -PD -VO aa aa aa aa aa -GJ aa aa -Hq -Hz aa +aa +Cn +cH +OT +OT +UO +Sr +Ml +DH +Cn +Cn +Cn +ad +ad +ad ad ad ad -aa -aa -aa ad ad ad @@ -55947,19 +50954,32 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Lb +GC +Wz +GC +gn +QW +QW +qY +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +lg +JQ +Kb aa aa aa @@ -56002,7 +51022,7 @@ aa aa aa "} -(148,1,1) = {" +(151,1,1) = {" aa aa aa @@ -56107,109 +51127,14 @@ aa aa aa aa -VD -Ux -Ux -VF -Ux -MC -Yp -Ux -Ux -Ux -Ux -Ux -WS -gQ -Ic -gQ -gQ -gQ -Xx -gQ -gQ -gQ -gQ -gQ -kh -kO -ls -ae -my -nS -NC -oz -oz -pG -qp -qY -pe -oz -sR -tH -us -uT -oz -oz -oz -xz -oz -oz -zk -zQ -zQ aa aa -ad -cn -ad -ad -ad -ad -PD -SZ -kH -Ty -MK -km -Oh -PD -Ep -EH -Ep -PD -VO aa aa aa aa aa -GJ -ad aa -Hr -HA -HH -HS -HV -HS -HH -HH -HH -HS -Ig -HS -HH -HH -HH -HH -HH -HS -HS -HH -HH -JP -Ka aa aa aa @@ -56258,11 +51183,18 @@ aa aa aa aa -"} -(149,1,1) = {" aa aa aa +Cn +Cn +Cn +Cn +Cn +Cn +Cn +Cn +Cn aa aa aa @@ -56273,15 +51205,18 @@ aa aa aa aa +ad aa aa aa aa aa +GJ aa aa aa aa +ad aa aa aa @@ -56296,8 +51231,12 @@ aa aa aa aa +ad +ad aa aa +QV +Ho aa aa aa @@ -56339,6 +51278,8 @@ aa aa aa aa +"} +(152,1,1) = {" aa aa aa @@ -56364,109 +51305,19 @@ aa aa aa aa -VD -Ux -Ux -Rm -Yh -Zs -NL -Qi -TG -Yh -TG -Yh -he -Nt -Sq -Oi -Mm -Mm -Me -LP -LP -LP -LZ -Ma -Mb -Id -LY -ae -mz -nW -oy -ZB -oz -pH -qq -ra -rJ -si -sS -tI -ut -uU -vF -ww -wX -pD -xZ -oz aa aa -ad -ad aa aa -ad aa aa aa aa -PD -WB -OF -UO -Sr -Ml -DH -DS -Ep -EI -Ep -PD -TR aa aa aa aa aa -GJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -JQ -Kb aa aa aa @@ -56515,8 +51366,6 @@ aa aa aa aa -"} -(150,1,1) = {" aa aa aa @@ -56599,6 +51448,7 @@ aa aa aa aa +Pr aa aa aa @@ -56612,6 +51462,18 @@ aa aa aa aa +ad +aa +aa +aa +aa +aa +GJ +aa +aa +aa +aa +ad aa aa aa @@ -56621,89 +51483,27 @@ aa aa aa aa -YW -YW -YW -XF -YW -YW -YW -XF -YW -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -if -ae -ae -ae -ae -kP -ae -ae -ae -ae -oa -ae -oz -pI -qr -rb -rK -sj -sT -Pd -tJ -RN -vG -wx -pD -pD -ya -pU aa aa aa -ad aa aa ad aa aa aa +QV +Kc aa -PD -TQ -Vb -XX -ez -Vb -Nz -PD -Ep -Ep -Ep -PD -cn aa aa aa aa aa -GJ aa aa aa aa -ad aa aa aa @@ -56718,12 +51518,8 @@ aa aa aa aa -ad -ad aa aa -ad -Ho aa aa aa @@ -56739,6 +51535,22 @@ aa aa aa aa +"} +(153,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -56772,8 +51584,6 @@ aa aa aa aa -"} -(151,1,1) = {" aa aa aa @@ -56878,89 +51688,23 @@ aa aa aa aa -YW -Ux -Ud -Xp -Dj -YW -Ju -RF -DA -ae -ar -dt -dd -ae -ar -dt -dd -ae -hf -hF -gg -iI -jm -ae -kn -kQ -lv -ae -mA -nr -ob -Mi -oz -pJ -hr -qs -oz -oz -sU -tK -uu -oz -oz -wy -pD -pD -yb -pU -ad aa aa -ad aa aa -ad aa aa aa aa -PD -PD -PD -PD -PD -PD -PD -PD -PD -PD -PD -PD -ad aa aa aa aa aa -GJ aa aa aa aa -ad aa aa aa @@ -56979,8 +51723,14 @@ ad aa aa aa +aa +aa +VO +aa +aa +aa +aa ad -Kc aa aa aa @@ -56995,6 +51745,19 @@ aa aa aa aa +ad +aa +aa +aa +QV +Ho +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -57030,7 +51793,8 @@ aa aa aa "} -(152,1,1) = {" +(154,1,1) = {" +aa aa aa aa @@ -57135,61 +51899,6 @@ aa aa aa aa -YW -VF -kG -VS -DA -YW -Ux -Xo -Ux -ae -aw -du -dd -ae -aw -du -dd -ae -hg -db -ig -iJ -iJ -ae -ko -RV -lw -ae -mB -ns -ob -oB -oz -pK -qt -rd -rL -sk -sV -tL -uv -oz -vH -wz -qw -xA -yc -pU -ad -ad -ad -ad -ad -ad -ad aa aa aa @@ -57198,26 +51907,14 @@ aa aa aa aa -ad aa aa aa aa -cn -cn -ad -cn -cn -cn -cn -cn -cn -VO aa aa aa aa -ad aa aa aa @@ -57232,12 +51929,9 @@ aa aa aa aa -ad aa aa aa -ad -Ho aa aa aa @@ -57281,15 +51975,21 @@ aa aa aa aa +ad +ad +ad aa aa aa aa +GJ aa -"} -(153,1,1) = {" aa aa +ad +ad +ad +ad aa aa aa @@ -57306,6 +52006,8 @@ aa aa aa aa +QV +Ho aa aa aa @@ -57347,6 +52049,8 @@ aa aa aa aa +"} +(155,1,1) = {" aa aa aa @@ -57392,61 +52096,12 @@ aa aa aa aa -YW -YW -YW -Ux -Ux -YW -kG -VF -Ux -ae -aw -dd -dd -ae -aw -dd -dd -ae -hh -db -ih -iK -jn -ae -kp -kR -lx -ae -mC -db -ob -oB -oz -pL -qu -re -rL -sk -sW -tM -uw -oz -jT -pe -wY -xB -yd -oz aa aa aa aa aa aa -ad aa aa aa @@ -57463,18 +52118,13 @@ aa aa aa aa -ad -ad aa aa aa aa -GJ aa aa aa -ad -ad aa aa aa @@ -57493,8 +52143,6 @@ aa aa aa aa -ad -Ho aa aa aa @@ -57543,8 +52191,6 @@ aa aa aa aa -"} -(154,1,1) = {" aa aa aa @@ -57586,8 +52232,21 @@ aa aa aa aa +ad +FE +FE +FE +Gh +Gh aa +GH aa +Gh +Gh +FE +FE +FE +ad aa aa aa @@ -57604,6 +52263,8 @@ aa aa aa aa +QV +Ho aa aa aa @@ -57645,65 +52306,16 @@ aa aa aa aa +"} +(156,1,1) = {" aa aa aa aa aa aa -YW -VD -VD -YW -YW -VD -VD -ae -aA -dv -eb -ae -fb -fK -gd -ae -db -db -ih -iL -jo -ae -ae -kP -ae -ae -mD -db -ob -oB -oz -pM -qu -pD -rM -oz -pU -tN -pU -oz -oz -wA -sk -xC -rQ -Wb -RD -RD -RD -RD aa aa -ad aa aa aa @@ -57720,19 +52332,8 @@ aa aa aa aa -FE -FE -FE -Gh -Gh aa -GH aa -Gh -Gh -FE -FE -FE aa aa aa @@ -57750,8 +52351,6 @@ aa aa aa aa -ad -Ho aa aa aa @@ -57800,8 +52399,6 @@ aa aa aa aa -"} -(155,1,1) = {" aa aa aa @@ -57892,6 +52489,21 @@ aa aa aa aa +ad +FF +Ga +Ga +Ga +Ga +Gw +Jt +GM +GN +GN +GN +GN +GO +ad aa aa aa @@ -57908,6 +52520,8 @@ aa aa aa aa +QV +Ho aa aa aa @@ -57915,52 +52529,8 @@ aa aa aa aa -ae -fc -dw -ec -ae -fc -dw -ge -ae -ae -db -ii -iM -jp -ae -kr -kT -lz -ae -mG -db -ob -oB -oz -pN -qv -rf -rN -rf -rf -Tj -rN -uV -rf -sp -pD -xD -ye -Wb -Yc -Vn -iH -RD aa aa -ad aa aa aa @@ -57977,19 +52547,6 @@ aa aa aa aa -FF -Ga -Ga -Ga -Ga -Gw -Jt -GM -GN -GN -GN -GN -GO aa aa aa @@ -58006,9 +52563,9 @@ aa aa aa aa +"} +(157,1,1) = {" aa -ad -Ho aa aa aa @@ -58057,8 +52614,6 @@ aa aa aa aa -"} -(156,1,1) = {" aa aa aa @@ -58106,6 +52661,7 @@ aa aa aa aa +ab aa aa aa @@ -58172,52 +52728,8 @@ aa aa aa aa -cL -db -db -ob -db -db -db -ob -gF -ae -hG -ij -iN -jq -ae -ks -kU -lA -ae -mF -db -ob -oB -oz -pO -qw -rg -rO -qw -rg -Pj -Sp -XA -Uv -wB -Uv -xE -Ls -XZ -Un -ZI -Rb -RD aa aa -ad aa aa aa @@ -58234,6 +52746,7 @@ aa aa aa aa +ad FG FG FG @@ -58247,6 +52760,7 @@ FG FG FG FG +ad aa aa aa @@ -58263,8 +52777,7 @@ aa aa aa aa -aa -ad +QV Ho aa aa @@ -58307,19 +52820,8 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa "} -(157,1,1) = {" -aa -aa -aa -aa +(158,1,1) = {" aa aa aa @@ -58413,7 +52915,6 @@ aa aa aa aa -ab aa aa aa @@ -58429,52 +52930,8 @@ aa aa aa aa -cL -bo -dx -ee -eD -dx -dx -Rl -gG -hj -hH -ik -iO -jr -jP -kt -kV -lB -mf -mE -nt -oc -db -oz -sX -qx -rh -rP -sm -qA -tO -ux -uW -vJ -wC -wZ -xF -yf -Wb -ZK -EG -Mw -RD aa aa -ad aa aa aa @@ -58493,15 +52950,12 @@ aa aa aa aa -ad aa aa aa -Jt aa aa aa -ad aa aa aa @@ -58510,7 +52964,6 @@ aa aa aa aa -ab aa aa aa @@ -58521,8 +52974,6 @@ aa aa aa aa -ad -Kd aa aa aa @@ -58552,33 +53003,39 @@ aa aa aa aa +ad aa aa +ad aa aa aa +Jt aa aa aa +ad aa aa +ad aa aa aa aa aa +ab aa aa aa aa -"} -(158,1,1) = {" aa aa aa aa aa aa +QV +Kd aa aa aa @@ -58620,6 +53077,8 @@ aa aa aa aa +"} +(159,1,1) = {" aa aa aa @@ -58686,52 +53145,8 @@ aa aa aa aa -ae -aU -dy -ef -ae -fd -gf -iP -gH -ae -hI -db -db -js -ae -ku -db -lC -ae -mH -nu -od -oC -oz -oz -oz -pJ -rQ -sn -oz -oz -oz -pJ -vK -oz -xa -xG -oz -Wb -RD -RD -Xl -RD aa aa -ad aa aa aa @@ -58748,19 +53163,8 @@ aa aa aa aa -FE -FE -FE -FE -FE aa -Jt aa -FE -FE -FE -FE -FE aa aa aa @@ -58778,10 +53182,6 @@ aa aa aa aa -ad -Kc -ad -ad aa aa aa @@ -58828,8 +53228,6 @@ aa aa aa aa -"} -(159,1,1) = {" aa aa aa @@ -58862,8 +53260,21 @@ aa aa aa aa +ad +FE +FE +FE +FE +FE aa +Jt aa +FE +FE +FE +FE +FE +ad aa aa aa @@ -58880,6 +53291,10 @@ aa aa aa aa +QV +Kc +ad +ad aa aa aa @@ -58919,6 +53334,8 @@ aa aa aa aa +"} +(160,1,1) = {" aa aa aa @@ -58943,52 +53360,10 @@ aa aa aa aa -ae -dc -dz -eg -ae -fe -db -db -gI -ae -hJ -db -db -jt -ae -kv -kW -lD -ae -oD -nv -oD -oD -oz -pP -qy -ri -qu -so -yG -oz -uy -uX -vL -oz -xb -qA -yg -an -oz -ad aa aa aa aa -ad aa aa aa @@ -59005,19 +53380,6 @@ aa aa aa aa -FF -Ga -Ga -Ga -Ga -Gw -Jt -GM -GN -GN -GN -GN -GO aa aa aa @@ -59035,8 +53397,6 @@ aa aa aa aa -ad -Ho aa aa aa @@ -59085,8 +53445,6 @@ aa aa aa aa -"} -(160,1,1) = {" aa aa aa @@ -59159,6 +53517,21 @@ aa aa aa aa +ad +FF +Ga +Ga +Ga +Ga +Gw +Jt +GM +GN +GN +GN +GN +GO +ad aa aa aa @@ -59175,6 +53548,8 @@ aa aa aa aa +QV +Ho aa aa aa @@ -59200,46 +53575,6 @@ aa aa aa aa -ae -dd -dd -aw -ae -ff -db -gg -gJ -ae -hK -db -db -ju -ae -kw -db -lE -ae -mJ -nw -oe -mJ -oz -pQ -qz -rj -qv -sp -sY -oz -uy -uZ -OY -oz -Va -pD -pD -yH -pU aa aa aa @@ -59256,25 +53591,16 @@ aa aa aa aa +"} +(161,1,1) = {" aa aa aa aa aa aa -FG -FG -FG -FG -FG aa -Jt aa -FG -FG -FG -FG -FG aa aa aa @@ -59292,8 +53618,6 @@ aa aa aa aa -ad -Ho aa aa aa @@ -59342,8 +53666,6 @@ aa aa aa aa -"} -(161,1,1) = {" aa aa aa @@ -59452,51 +53774,24 @@ aa aa aa aa +ad +FG +FG +FG +FG +FG aa +Jt aa +FG +FG +FG +FG +FG +ad aa aa aa -ae -dd -dd -aw -ae -fg -gh -OL -gK -ae -hL -in -iQ -jv -ae -kx -db -lF -ae -mJ -mJ -mJ -oE -oz -pR -qA -rk -rR -sq -sZ -oz -uy -uZ -vM -oz -xc -pD -pD -yI -pU aa aa aa @@ -59510,6 +53805,8 @@ aa aa aa aa +QV +Ho aa aa aa @@ -59521,15 +53818,12 @@ aa aa aa aa -ad aa aa aa -Jt aa aa aa -ad aa aa aa @@ -59549,13 +53843,13 @@ aa aa aa aa -ad -Ho aa aa aa aa aa +"} +(162,1,1) = {" aa aa aa @@ -59599,8 +53893,6 @@ aa aa aa aa -"} -(162,1,1) = {" aa aa aa @@ -59714,46 +54006,6 @@ aa aa aa aa -ae -dd -dA -eh -ae -fh -db -gi -ae -ae -ae -ae -ae -ae -ae -ky -db -lG -ae -mK -mK -mK -mK -oz -pS -pD -rl -pD -pD -ta -oz -uy -uZ -vN -oz -xd -pD -pD -yJ -pU aa aa aa @@ -59776,38 +54028,29 @@ aa aa aa aa -FE -FE -FE -FE -FE aa -Jt aa -FE -FE -FE -FE -FE aa +ad aa aa +ad aa aa aa +Jt aa aa aa ad aa aa +ad aa aa aa aa aa -ad -Ho aa aa aa @@ -59819,6 +54062,12 @@ aa aa aa aa +QV +Ho +aa +aa +aa +aa aa aa aa @@ -59971,46 +54220,6 @@ aa aa aa aa -ae -ae -ae -ae -ae -cL -cL -cL -ae -hm -hN -io -iR -ZT -db -kz -db -lH -ae -ae -ae -ae -ae -oz -pT -qB -pD -rS -pD -tb -oz -oz -pU -oz -oz -xe -xH -yh -yK -oz aa aa aa @@ -60033,19 +54242,6 @@ aa aa aa aa -FF -Ga -Ga -Ga -Ga -Gw -Jt -GM -GN -GN -GN -GN -GO aa aa aa @@ -60055,22 +54251,58 @@ aa aa aa aa -ad aa aa aa aa aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +dl +dl +dl +dl +dl +aa Jt aa +dl +dl +dl +dl +dl ad -Kc -aa -aa -aa -aa -aa -aa aa aa aa @@ -60079,6 +54311,23 @@ aa aa aa aa +ad +aa +aa +aa +aa +aa +aa +aa +QV +Ho +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -60234,40 +54483,13 @@ aa aa aa aa -ad -ad -ae -hn -hO -iS -iT -db -jw -db -db -zd -ae aa aa aa aa -oz -pU -pU -oz -oz -pU -pU -oz aa aa aa -oz -oz -pU -pU -oz -oz aa aa aa @@ -60290,19 +54512,7 @@ aa aa aa aa -FG -FG -FG -FG -FG aa -GI -aa -FG -FG -FG -FG -FG aa aa aa @@ -60312,17 +54522,10 @@ aa aa aa aa -ad aa aa aa aa -ac -Jt -aS -aS -Ke -aS aa aa aa @@ -60342,6 +54545,21 @@ aa aa aa aa +ad +RF +BP +BP +BP +BP +Gw +Jt +GM +GG +GG +GG +GG +NM +ad aa aa aa @@ -60350,12 +54568,16 @@ aa aa aa aa +ad aa aa aa aa aa +Jt aa +QV +Kc aa aa aa @@ -60370,8 +54592,6 @@ aa aa aa aa -"} -(165,1,1) = {" aa aa aa @@ -60399,6 +54619,8 @@ aa aa aa aa +"} +(165,1,1) = {" aa aa aa @@ -60492,19 +54714,6 @@ aa aa aa aa -ad -ae -hM -ip -QP -BC -jx -db -db -db -Qm -ae -ad aa aa aa @@ -60553,7 +54762,6 @@ aa aa aa aa -GJ aa aa aa @@ -60568,24 +54776,6 @@ aa aa aa aa -ad -ad -aa -aa -ad -ad -Ih -Bz -aS -JR -Kf -Ih -aa -aa -aa -aa -aa -aa aa aa aa @@ -60612,8 +54802,21 @@ aa aa aa aa +ad +ua +ua +ua +ua +ua aa +Jt aa +ua +ua +ua +ua +ua +ad aa aa aa @@ -60622,13 +54825,18 @@ aa aa aa aa +ad aa aa aa aa +aS +Jt +aS +lX +Ke +aS aa -"} -(166,1,1) = {" aa aa aa @@ -60668,6 +54876,8 @@ aa aa aa aa +"} +(166,1,1) = {" aa aa aa @@ -60750,17 +54960,6 @@ aa aa aa aa -ae -ae -ae -ae -tT -ae -jR -db -db -MI -ac aa aa aa @@ -60810,7 +55009,6 @@ aa aa aa aa -GJ aa aa aa @@ -60825,18 +55023,6 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -Ih -NU -aS -JR -Kg -Ih aa aa aa @@ -60873,27 +55059,40 @@ aa aa aa aa +ad aa aa +ad aa aa aa +Jt aa aa aa +ad aa aa +ad aa -"} -(167,1,1) = {" aa aa aa aa aa aa +ad +ad aa aa +ad +ad +Ih +Bz +aS +qD +Kf +Ih aa aa aa @@ -60934,6 +55133,8 @@ aa aa aa aa +"} +(167,1,1) = {" aa aa aa @@ -61009,15 +55210,6 @@ aa aa aa aa -ad -ae -ae -ae -ae -cL -cL -cL -ac aa aa aa @@ -61067,7 +55259,6 @@ aa aa aa aa -GP aa aa aa @@ -61081,19 +55272,6 @@ aa aa aa aa -ad -ad -cn -ad -ad -ad -ad -Ih -Ik -aS -JS -Kh -Ih aa aa aa @@ -61138,17 +55316,40 @@ aa aa aa aa +ad +FE +FE +FE +FE +FE aa +Jt aa +FE +FE +FE +FE +FE +ad aa -"} -(168,1,1) = {" aa aa aa aa aa aa +ad +ad +ad +ad +ad +ad +Ih +NU +aS +sJ +Kg +Ih aa aa aa @@ -61189,6 +55390,8 @@ aa aa aa aa +"} +(168,1,1) = {" aa aa aa @@ -61338,26 +55541,8 @@ aa aa aa aa -ad -cn -cn -aS -aS -aS -Ih -aS -XT -Il -Il -Jv -aS -Ih -Ih -aS aa aa -ad -ad aa aa aa @@ -61388,18 +55573,44 @@ aa aa aa aa +ad +FF +Ga +Ga +Ga +Ga +Gw +Jt +GM +GN +GN +GN +GN +GO +ad aa aa aa aa aa aa +ad +ad +cn +ad +ad +ad +ad +Ih +Ik +aS +JS +Kh +Ih aa aa aa aa -"} -(169,1,1) = {" aa aa aa @@ -61436,6 +55647,8 @@ aa aa aa aa +"} +(169,1,1) = {" aa aa aa @@ -61595,26 +55808,7 @@ aa aa aa aa -ad -aS -lO -aS -cK -Vc -Ns -Il -RC -Il -Il -Il -Il -Il -Il -aS aa -ad -ad -ad aa aa aa @@ -61636,16 +55830,47 @@ aa aa aa aa +ad +FG +FG +FG +FG +FG aa +GI aa +FG +FG +FG +FG +FG +ad aa aa aa aa aa aa +ad +cn +cn +aS +aS +aS +Ih +aS +XT +Il +IQ +Jv +aS +Ih +Ih +aS aa aa +ad +ad aa aa aa @@ -61655,8 +55880,6 @@ aa aa aa aa -"} -(170,1,1) = {" aa aa aa @@ -61681,6 +55904,18 @@ aa aa aa aa +"} +(170,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -61852,26 +56087,6 @@ aa aa aa aa -ad -aS -dL -aS -ID -Il -RC -Il -Td -hE -yP -Il -Il -Il -Il -aS -Lb -Lb -cn -ad ad aa aa @@ -61879,14 +56094,40 @@ aa aa aa aa +GJ +aa +aa +aa aa aa aa +ad +aa aa aa aa aa aa +ad +aS +lO +aS +cK +Vc +Ns +Il +RC +Il +mH +yx +yx +yx +tm +aS +aa +ad +ad +ad aa aa aa @@ -61912,8 +56153,6 @@ aa aa aa aa -"} -(171,1,1) = {" aa aa aa @@ -61922,6 +56161,8 @@ aa aa aa aa +"} +(171,1,1) = {" aa aa aa @@ -62103,6 +56344,21 @@ aa aa aa aa +ad +ad +ad +ad +ad +ad +ad +GJ +ad +ad +ad +ad +ad +ad +ad aa aa aa @@ -62111,25 +56367,25 @@ aa aa ad aS -VA +dL aS ID -Of -Cm Il RC -JF -UA -Ki Il +Td +hE +yP Il Il +Il +IQ aS -aS -aS -cn +ad +ad cn ad +ad aa aa aa @@ -62162,6 +56418,8 @@ aa aa aa aa +"} +(172,1,1) = {" aa aa aa @@ -62169,9 +56427,6 @@ aa aa aa aa -"} -(172,1,1) = {" -aa aa aa aa @@ -62353,6 +56608,7 @@ aa aa aa aa +GP aa aa aa @@ -62368,24 +56624,24 @@ aa aa ad aS -gr -Iu -Vc -RW -SI -IE -WZ -JG -Kj -Ra -JB -Ji -Im +VA +aS +ID +Of +Cm +Il +RC +Om +mN +VV Il Il +IQ aS -OO aS +aS +cn +cn ad aa aa @@ -62419,6 +56675,9 @@ aa aa aa aa +"} +(173,1,1) = {" +aa aa aa aa @@ -62426,8 +56685,6 @@ aa aa aa aa -"} -(173,1,1) = {" aa aa aa @@ -62595,7 +56852,6 @@ aa aa aa aa -ab aa aa aa @@ -62625,23 +56881,23 @@ aa aa ad aS -Il -Iv -IF -IF -eJ -Jg -Jg -JH -JT -Kk -JA +gr +Iu +Vc +RW +SI +eC +yi +JG Kj +Ra JB -JB -Lc +Ji +Or +yx +tm aS -Jd +OO aS ad aa @@ -62676,6 +56932,8 @@ aa aa aa aa +"} +(174,1,1) = {" aa aa aa @@ -62683,9 +56941,6 @@ aa aa aa aa -"} -(174,1,1) = {" -aa aa aa aa @@ -62847,6 +57102,7 @@ aa aa aa aa +ab aa aa aa @@ -62883,22 +57139,22 @@ aa ad aS Il -Iw -ID -Il -BN -Jh -Jw -JI -JI -Kl -JI -KA -KJ -Jh -KF +Iv +IF +IF +mv +Jg +Jg +JH +JT +Kk +JA +Kj +JB +JB +xJ aS -YG +Jd aS ad aa @@ -62933,6 +57189,8 @@ aa aa aa aa +"} +(175,1,1) = {" aa aa aa @@ -62940,8 +57198,6 @@ aa aa aa aa -"} -(175,1,1) = {" aa aa aa @@ -63138,24 +57394,24 @@ aa aa aa ad -Ih +aS Il Iw ID -II -KE -Jh -Jx -JJ -JJ -Km -JJ -JJ -Jx -KV -KF Il -RC +BN +Jh +Jw +JI +JI +Kl +JI +KA +KJ +Jh +oV +aS +YG aS ad aa @@ -63190,6 +57446,8 @@ aa aa aa aa +"} +(176,1,1) = {" aa aa aa @@ -63197,8 +57455,6 @@ aa aa aa aa -"} -(176,1,1) = {" aa aa aa @@ -63395,23 +57651,23 @@ aa aa aa ad -aS -Im -Iw -Im +Ih Il -QI +Iw +ID +II +KE Jh -Zx +Jx JJ -JU -JU -Kw -KB -KK -KW -Ld -Il +JJ +Km +JJ +JJ +sR +Jh +Sp +tm RC aS ad @@ -63447,6 +57703,8 @@ aa aa aa aa +"} +(177,1,1) = {" aa aa aa @@ -63454,8 +57712,6 @@ aa aa aa aa -"} -(177,1,1) = {" aa aa aa @@ -63652,23 +57908,23 @@ aa aa aa ad -Ih -Il -Ix -Il +aS +Im +Iw +Im Il -Cu -Cx -Jy -JK +Mm +Jh +Zx +JJ JU -Kn -Kx -VK -KL -KX +JU +Kw +KB +KK +Ru Ld -Im +IQ RC aS ad @@ -63704,6 +57960,8 @@ aa aa aa aa +"} +(178,1,1) = {" aa aa aa @@ -63711,8 +57969,6 @@ aa aa aa aa -"} -(178,1,1) = {" aa aa aa @@ -63909,24 +58165,24 @@ aa aa aa ad -aS -Im -Iw -Im +Ih Il -Cv -Jh -JA -JJ -JU +Ix +Il +Il +Ar +Cx +Jy +JK JU -Ky -JJ -KM -Jh +Kn +Kx +VK +KL +oM Ld -Of -Cm +ZX +RC aS ad aa @@ -63961,6 +58217,8 @@ aa aa aa aa +"} +(179,1,1) = {" aa aa aa @@ -63968,8 +58226,6 @@ aa aa aa aa -"} -(179,1,1) = {" aa aa aa @@ -64166,24 +58422,24 @@ aa aa aa ad -Ih +aS +Im +Iw +Im Il -Iy -IG -IN -BJ +fV Jh JA JJ +JU +JU +Ky JJ -Km -JJ -JJ -Jx -KY -KF -SI -RM +KM +Jh +Ld +Hw +Cm aS ad aa @@ -64218,6 +58474,8 @@ aa aa aa aa +"} +(180,1,1) = {" aa aa aa @@ -64225,8 +58483,6 @@ aa aa aa aa -"} -(180,1,1) = {" aa aa aa @@ -64425,22 +58681,22 @@ aa ad Ih Il -Iw -Il -BH -Cw -JB -Cy -Cy -Cr -JJ +Iy +IG +IN +KY +Jh JA -KC -IY +JJ +JJ +Km +JJ +JJ +sR Jh KF -BN -aS +BG +RM aS ad aa @@ -64475,6 +58731,8 @@ aa aa aa aa +"} +(181,1,1) = {" aa aa aa @@ -64482,8 +58740,6 @@ aa aa aa aa -"} -(181,1,1) = {" aa aa aa @@ -64684,21 +58940,21 @@ Ih Il Iw Il -BI -JN -Jh -Jh -Jh -JA -Ko +uT +Qe +JB +Cy +Cy +Cr +JJ JA +KC +IY Jh -KN -Jh -lS -Mj +KF +SU +aS aS -ad ad aa aa @@ -64732,6 +58988,8 @@ aa aa aa aa +"} +(182,1,1) = {" aa aa aa @@ -64739,8 +58997,6 @@ aa aa aa aa -"} -(182,1,1) = {" aa aa aa @@ -64941,19 +59197,19 @@ Ih Il Iw Il -BJ +LZ JN -Jm -JC Jh Jh Jh +JA +Ko +JA Jh +QY Jh -KO -ID -KF -Il +lS +Mj aS ad ad @@ -64989,6 +59245,8 @@ aa aa aa aa +"} +(183,1,1) = {" aa aa aa @@ -64996,8 +59254,6 @@ aa aa aa aa -"} -(183,1,1) = {" aa aa aa @@ -65197,30 +59453,23 @@ ad Ih Il Iw -II -BK -JN -Jn -Jn -JL -JW -Kp +Il +KY JN -Sk +Jm +JC +Jh +Jh +Jh +Jh +Jh +KO +ID +KF IQ -Il -Le -Lc aS ad ad -ad -aa -aa -aa -aa -aa -aa aa aa aa @@ -65450,42 +59699,42 @@ aa aa aa aa -ad -Ih -Il -Iw -Il -BJ -JN -Jn -Jn -Jn -JD -Kq -Kz -IG -KP -aS -aS -Lm -aS -aS -aS -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +aa +aa +aa +aa +aa +aa +aa +ad +Ih +Il +Iw +II +Ca +JN +Jn +Jn +JL +JW +Kp +JN +Sk +yE +yx +lR +Lc +aS +ad +ad +ad +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -65707,26 +59956,33 @@ aa aa aa aa +aa +aa +aa +aa +aa +aa +aa ad -aS -Im +Ih +Il Iw -Sk -BJ +Il +KY JN -Jo -JD -JD +Jn +Jn +Jn JD -Kr -JN -Il -KQ +Kq +XB +IG +KP +aS +aS +Lm +aS aS -Lf -Ln -Lv -LB aS ad aa @@ -65735,7 +59991,6 @@ aa aa aa aa -ab aa aa aa @@ -65761,14 +60016,16 @@ aa aa aa aa +"} +(186,1,1) = {" +aa +aa aa aa aa aa aa aa -"} -(186,1,1) = {" aa aa aa @@ -65913,7 +60170,6 @@ aa aa aa aa -ab aa aa aa @@ -65965,26 +60221,26 @@ aa aa aa ad -Ih -Il +aS +Im Iw -IJ -BL -Ch -Jp -Jp -JM -JX -Ks +Sk +KY +JN +Jo +JD +JD +JD +Kr JN Il KQ aS -Lg -Lo -Lw -LC -Ih +Lf +Ln +Lv +LB +aS ad aa aa @@ -65992,6 +60248,7 @@ aa aa aa aa +ab aa aa aa @@ -66016,6 +60273,8 @@ aa aa aa aa +"} +(187,1,1) = {" aa aa aa @@ -66024,10 +60283,6 @@ aa aa aa aa -"} -(187,1,1) = {" -aa -aa aa aa aa @@ -66165,6 +60420,7 @@ aa aa aa aa +ab aa aa aa @@ -66222,25 +60478,25 @@ aa aa aa ad -aS -Im +Ih +Il Iw -Im -Cd -JN -Jq -JD -JD -JD -Kt +IJ +Pc +Ch +Jp +Jp +JM +JX +Ks JN -KD -KR -KZ -Lh -Lp -Lx -LD +Il +KQ +aS +Lg +Lo +Lw +LC Ih ad aa @@ -66274,6 +60530,8 @@ aa aa aa aa +"} +(188,1,1) = {" aa aa aa @@ -66281,8 +60539,6 @@ aa aa aa aa -"} -(188,1,1) = {" aa aa aa @@ -66479,25 +60735,25 @@ aa aa aa ad -Ih -Il -Iy -IG -Ce -Cp -Jn -Jn -Jn +aS +Im +Iw +Im +Xt +JN +Jq JD -Ku -Js -KE -KS -La -Li -yC -JR -JR +JD +JD +Kt +JN +KD +KR +KZ +Lh +Lp +Lx +LD Ih ad aa @@ -66531,6 +60787,10 @@ aa aa aa aa +"} +(189,1,1) = {" +aa +aa aa aa aa @@ -66538,8 +60798,6 @@ aa aa aa aa -"} -(189,1,1) = {" aa aa aa @@ -66731,30 +60989,28 @@ aa aa aa aa -ab aa aa ad -ad -aS -Il -Iw +Ih Il -KF -JN +Iy +IG +Cw +Cp Jn Jn Jn -JY -Kv -JN -KF -KT -aS -Lj +JD +Ku +tw +KE +KS +La +Li +yC +JR JR -Ly -LE Ih ad aa @@ -66788,6 +61044,8 @@ aa aa aa aa +"} +(190,1,1) = {" aa aa aa @@ -66795,9 +61053,6 @@ aa aa aa aa -"} -(190,1,1) = {" -aa aa aa aa @@ -66989,29 +61244,30 @@ aa aa aa aa +ab aa aa ad ad aS -In -Iz -IL -Cf -JN -Jr -JE -JN -JN +Il +Iw +Il +KF JN +Jn +Jn +Jn +JY +Kv JN -KG +KF KT aS -Lk +Lj JR -Lz -LF +Ly +LE Ih ad aa @@ -67045,6 +61301,8 @@ aa aa aa aa +"} +(191,1,1) = {" aa aa aa @@ -67052,8 +61310,6 @@ aa aa aa aa -"} -(191,1,1) = {" aa aa aa @@ -67251,25 +61507,25 @@ aa ad ad aS -jQ -lk -lk -Bi +In +Iz +IL +eU JN +Jr +JE JN JN JN -Cs -Il -Il -KF +JN +KG KT aS -Ll -Bh -LA -LG -aS +Lk +JR +Lz +LF +Ih ad aa aa @@ -67302,6 +61558,8 @@ aa aa aa aa +"} +(192,1,1) = {" aa aa aa @@ -67309,8 +61567,6 @@ aa aa aa aa -"} -(192,1,1) = {" aa aa aa @@ -67506,26 +61762,26 @@ aa aa aa ad +ad aS -aS -Ip +jQ +lk +lk +Bi +JN +JN +JN +JN +Cs Il Il -Cg -Cq -Cq -Cq -Cq -Cq -Cq -Cq -Ct -KU -aS -aS -zZ -aS +KF +KT aS +Ll +Bh +LA +LG aS ad aa @@ -67559,6 +61815,8 @@ aa aa aa aa +"} +(193,1,1) = {" aa aa aa @@ -67566,8 +61824,6 @@ aa aa aa aa -"} -(193,1,1) = {" aa aa aa @@ -67764,27 +62020,26 @@ aa aa ad aS -jH -li -Jv aS -Ih -Ih +Ip +Il +Il +Cg +Cq +Cq +Cq +Cq +Cq +Cq +Cq +Ct +KU aS -Ih -Ih aS -Ih +zZ +aS aS -YT -IW -IG -IG -Lu aS -ad -ad -ad ad aa aa @@ -67817,14 +62072,16 @@ aa aa aa aa +"} +(194,1,1) = {" +aa +aa aa aa aa aa aa aa -"} -(194,1,1) = {" aa aa aa @@ -67943,7 +62200,6 @@ aa aa aa aa -ab aa aa aa @@ -68021,28 +62277,28 @@ aa aa ad aS -Il -lj -Il +jH +li +Jv +aS +Ih +Ih +aS +Ih +Ih +aS +Ih +aS +YT +IW +IG +IG +Lu aS ad ad ad ad -ad -ad -ad -ac -Le -CG -CF -BF -Cz -aS -ad -aa -aa -aa aa aa aa @@ -68073,6 +62329,8 @@ aa aa aa aa +"} +(195,1,1) = {" aa aa aa @@ -68080,8 +62338,6 @@ aa aa aa aa -"} -(195,1,1) = {" aa aa aa @@ -68278,23 +62534,23 @@ aa aa ad aS +Il +lj +Il aS -lm -aS -aS -aa ad ad -aa -aa ad ad -ac -Il -Il -CH -Ij -Ij +ad +ad +ad +aS +Le +CG +CF +BF +Cz aS ad aa @@ -68330,6 +62586,8 @@ aa aa aa aa +"} +(196,1,1) = {" aa aa aa @@ -68337,8 +62595,6 @@ aa aa aa aa -"} -(196,1,1) = {" aa aa aa @@ -68531,27 +62787,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -It -ad aa aa +ad +aS +aS +mw +aS +aS aa ad +ad aa aa ad -aa -ac -Ih -Ih +ad aS -Ih -Ih +Il +Il +CH +Ij +Ij aS ad aa @@ -68587,13 +62843,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa "} (197,1,1) = {" aa @@ -68791,17 +63040,7 @@ aa aa aa aa -ad -ad -ad -ad -aa -aa -aa -ad -aa aa -ad aa aa aa @@ -68810,14 +63049,24 @@ ad ad ad ad +It ad aa aa aa +ad aa aa +ad aa -aa +aS +Ih +Ih +aS +Ih +Ih +aS +ad aa aa aa @@ -69048,33 +63297,33 @@ aa aa aa aa -ad -aa aa aa aa aa aa -ad aa aa ad -aa -aa -aa ad -aa ad -aa ad aa aa aa +ad aa aa +ad aa aa aa +ad +ad +ad +ad +ad +ad aa aa aa @@ -69305,9 +63554,6 @@ aa aa aa aa -ad -aa -aa aa aa aa @@ -69315,6 +63561,7 @@ aa aa aa aa +ad aa aa aa @@ -69324,13 +63571,15 @@ aa ad aa aa +ad aa aa aa +ad aa +ad aa -aa -aa +ad aa aa aa @@ -69562,7 +63811,6 @@ aa aa aa aa -ad aa aa aa @@ -69570,6 +63818,7 @@ aa aa aa aa +ad aa aa aa @@ -69578,7 +63827,6 @@ aa aa aa aa -ad aa aa aa @@ -69586,6 +63834,7 @@ aa aa aa aa +ad aa aa aa @@ -69826,6 +64075,7 @@ aa aa aa aa +ad aa aa aa @@ -69841,8 +64091,7 @@ aa aa aa aa -aa -aa +ad aa aa aa diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm new file mode 100644 index 00000000000..a200a3cc559 --- /dev/null +++ b/maps/ministation/ministation-1.dmm @@ -0,0 +1,73690 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/obj/abstract/landmark{ + name = "carpspawn" + }, +/turf/space, +/area/space) +"ac" = ( +/turf/simulated/wall, +/area/space) +"ad" = ( +/obj/structure/lattice, +/turf/space, +/area/space) +"ae" = ( +/obj/item/stool/padded, +/obj/structure/sign/warning/nosmoking_2{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"af" = ( +/turf/exterior/wall/random/ministation, +/area/space) +"aj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"al" = ( +/obj/machinery/vending/coffee, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ar" = ( +/obj/structure/table, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/machinery/button/blast_door{ + id_tag = "CMO1"; + name = "CMO Shutter Button"; + pixel_y = 24 + }, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"at" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"ax" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"az" = ( +/obj/structure/rack, +/obj/machinery/door/window/brigdoor/southleft, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"aA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"aB" = ( +/obj/structure/disposalpipe/junction/mirrored{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"aD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/floor_decal/corner/red{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"aG" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"aH" = ( +/obj/structure/bed/chair, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"aL" = ( +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"aR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"aU" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/ministation/hop) +"aV" = ( +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"aW" = ( +/turf/simulated/floor/wood, +/area/ministation/detective) +"bj" = ( +/turf/simulated/wall, +/area/ministation/cafe) +"bo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"bp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"br" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/brown/Tom, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"bs" = ( +/obj/structure/ladder, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"bu" = ( +/turf/simulated/wall, +/area/ministation/maint/l2underpass) +"bv" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"bw" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"bx" = ( +/obj/item/storage/secure/safe{ + pixel_x = 4; + pixel_y = 26 + }, +/obj/machinery/network/requests_console{ + department = "Detective's office"; + pixel_x = 30; + initial_network_id = "molluscnet"; + dir = 4 + }, +/turf/simulated/floor/wood, +/area/ministation/detective) +"by" = ( +/obj/structure/rack, +/obj/machinery/door/window/brigdoor/southleft, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/suit/armor/bulletproof, +/turf/simulated/floor/tiled, +/area/ministation/security) +"bA" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"bB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"bG" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "32-2" + }, +/obj/machinery/atmospherics/pipe/zpipe/down/supply, +/obj/machinery/atmospherics/pipe/zpipe/down/scrubbers, +/obj/structure/disposalpipe/down, +/turf/simulated/open, +/area/ministation/maint/l2centraln) +"bH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"bI" = ( +/obj/effect/floor_decal/ss13/l13, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"bJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"bQ" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/blast_door{ + id_tag = "quarantine"; + name = "Infirmary Quarantine Button"; + directional_offset = null + }, +/obj/machinery/button/alternate/door{ + id_tag = "medleave"; + name = "Interior medbay doors button"; + pixel_y = 8; + directional_offset = null + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"bU" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/camera/autoname, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"cd" = ( +/obj/machinery/vending/hydronutrients{ + dir = 1 + }, +/obj/effect/floor_decal/corner/beige/half, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"cf" = ( +/obj/machinery/cryopod, +/obj/abstract/landmark/latejoin, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"cg" = ( +/obj/abstract/landmark{ + name = "carpspawn" + }, +/turf/simulated/floor/reinforced/airless, +/area/space) +"cm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"cq" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"cr" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"ct" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/hydro) +"cv" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/hop) +"cA" = ( +/obj/structure/table/woodentable, +/obj/item/flashlight/lamp/green, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/turf/simulated/floor/carpet, +/area/ministation/hop) +"cE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"cH" = ( +/obj/structure/catwalk, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"cN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"cQ" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"cU" = ( +/obj/machinery/door/airlock{ + name = "Cryo B" + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"cY" = ( +/turf/simulated/wall/r_wall, +/area/ministation/security) +"da" = ( +/turf/simulated/wall, +/area/ministation/security) +"db" = ( +/obj/machinery/power/apc{ + name = "_South APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/detective) +"dc" = ( +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/disposal, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"dd" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"dq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass/civilian{ + name = "Hydroponics" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"dr" = ( +/turf/simulated/floor/tiled, +/area/ministation/security) +"ds" = ( +/obj/machinery/computer/cryopod{ + pixel_y = -24; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"dE" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/machinery/lapvend{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"dK" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/structure/railing/mapped, +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"dN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"dQ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"dS" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"dU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"dW" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"dZ" = ( +/obj/machinery/door/window/brigdoor/westleft, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/blast/shutters{ + id_tag = "barshut"; + name = "Bar Shutters" + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"eb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"ed" = ( +/turf/simulated/floor/plating, +/area/ministation/arrival) +"ef" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"eg" = ( +/obj/machinery/hologram/holopad, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"em" = ( +/obj/machinery/vending/cola, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"eo" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/emergency{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"er" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"et" = ( +/obj/effect/floor_decal/snow, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"ew" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/wall/r_wall, +/area/ministation/security) +"ex" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"ey" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ez" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"eH" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "_East APC"; + pixel_x = 27; + pixel_y = 2 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"eK" = ( +/obj/machinery/door/airlock/hatch/autoname/command, +/turf/simulated/floor/tiled, +/area/ministation/security) +"eV" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"eZ" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"fd" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/obj/machinery/computer/modular/telescreen/preset/generic{ + name = "south bump"; + pixel_y = -20; + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"fe" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"fr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"fu" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/southright, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/blast/shutters{ + name = "office shutters"; + id_tag = "hopshut" + }, +/turf/simulated/floor/plating, +/area/ministation/hop) +"fw" = ( +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"fx" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"fy" = ( +/obj/structure/table, +/obj/machinery/chemical_dispenser/bar_coffee/full, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"fC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/firstaid{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/structure/sign/department/redcross{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"fD" = ( +/obj/structure/kitchenspike, +/obj/effect/floor_decal/snow, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"fF" = ( +/obj/structure/ladder, +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"fY" = ( +/obj/effect/floor_decal/industrial/firstaid{ + dir = 8 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"fZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"gb" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"gc" = ( +/obj/structure/closet/secure_closet/brig, +/turf/simulated/floor/tiled, +/area/ministation/security) +"ge" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"gp" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"gz" = ( +/turf/simulated/open, +/area/ministation/hall/e2) +"gB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/hygiene/drain, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"gC" = ( +/obj/effect/floor_decal/corner/red{ + dir = 6 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"gD" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/window/brigdoor/eastright{ + id_tag = "Cell 2" + }, +/obj/effect/floor_decal/corner/red{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"gE" = ( +/obj/structure/table/reinforced, +/obj/item/toy/eightball, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"gJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/wood, +/area/ministation/detective) +"gL" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "_East APC"; + pixel_x = 27; + pixel_y = 2 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/hydro) +"gS" = ( +/obj/machinery/cryopod{ + dir = 1 + }, +/obj/abstract/landmark/latejoin/cryo, +/obj/machinery/camera/network/medbay{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"gT" = ( +/turf/simulated/floor/carpet, +/area/ministation/hop) +"gU" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"gX" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"ha" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hb" = ( +/obj/effect/floor_decal/corner/red{ + dir = 6 + }, +/obj/machinery/door_timer/cell_2{ + pixel_x = 31; + pixel_y = -1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/wall/r_wall, +/area/ministation/security) +"hd" = ( +/obj/structure/bed, +/obj/item/bedsheet/mime, +/obj/item/radio/intercom{ + dir = 1; + pixel_y = -30 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hh" = ( +/obj/structure/bed/chair/office/light, +/obj/abstract/landmark/start{ + name = "Medical Doctor" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"hi" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"hj" = ( +/obj/machinery/door/airlock{ + locked = 1; + name = "helm" + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"hl" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"hm" = ( +/obj/structure/bed/chair, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"hr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"hs" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"hu" = ( +/obj/abstract/landmark/start{ + name = "Lieutenant" + }, +/turf/simulated/floor/carpet, +/area/ministation/hop) +"hv" = ( +/obj/machinery/seed_extractor, +/obj/effect/floor_decal/corner/beige/half, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"hw" = ( +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/head/earmuffs, +/obj/item/clothing/head/earmuffs, +/obj/machinery/status_display{ + pixel_y = 30 + }, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hx" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/box/flashbangs, +/obj/machinery/recharger/wallcharger{ + pixel_y = 25 + }, +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 32 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hz" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/flora/pottedplant/minitree, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hA" = ( +/obj/abstract/landmark/start{ + name = "Medical Doctor" + }, +/obj/structure/bed/chair/office/light{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"hC" = ( +/obj/structure/table/woodentable, +/obj/item/camera/loaded, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/item/taperecorder, +/obj/item/folder/yellow, +/obj/structure/filing_cabinet/wall{ + pixel_x = 32; + dir = 8 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"hH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"hO" = ( +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"hQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"hX" = ( +/obj/machinery/hologram/holopad, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hY" = ( +/obj/structure/table, +/obj/item/assembly/timer, +/obj/item/flash, +/turf/simulated/floor/tiled, +/area/ministation/security) +"hZ" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/security) +"ia" = ( +/obj/effect/floor_decal/corner/red{ + dir = 6 + }, +/obj/machinery/door_timer/cell_1{ + pixel_x = 31 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"ib" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"id" = ( +/obj/structure/table/woodentable, +/obj/item/folder/red, +/obj/item/hand_labeler, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"if" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"ih" = ( +/obj/machinery/door/airlock{ + name = "ATMOS"; + locked = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"ii" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"in" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"iq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"ir" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"is" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"iv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light, +/obj/structure/flora/bush/fullgrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"ix" = ( +/obj/structure/bed/chair/office/light, +/turf/simulated/floor/tiled, +/area/ministation/security) +"iy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/security) +"iz" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"iA" = ( +/obj/effect/floor_decal/corner/red{ + dir = 6 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"iB" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/window/brigdoor/eastright{ + id_tag = "Cell 1" + }, +/obj/effect/floor_decal/corner/red{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"iD" = ( +/obj/structure/table/reinforced, +/obj/item/synthesized_instrument/violin, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"iE" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"iG" = ( +/obj/structure/table/woodentable, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/storage/fancy/cigarettes, +/obj/item/handcuffs, +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 + }, +/obj/item/clothing/head/beret/corp/sec, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"iH" = ( +/obj/item/stool/padded, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"iK" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2underpass) +"iN" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"iR" = ( +/obj/machinery/light/small/emergency{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"iW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"iY" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"jd" = ( +/obj/machinery/computer/station_alert/security{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"je" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"jg" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/button/alternate/door{ + dir = 1; + id_tag = "secdoor"; + name = "security airlock access button"; + pixel_x = -25; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"jh" = ( +/obj/effect/floor_decal/corner/red{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"jk" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/camera/network/security{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/ministation/detective) +"js" = ( +/obj/machinery/computer/modular/preset/medical, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"jy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"jA" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/sign/warning/airlock{ + dir = 4; + pixel_x = -32 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"jF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/mob/living/simple_animal/corgi/Ian, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"jH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/junction/mirrored{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"jO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/camera/network/hallway{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"jR" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"jS" = ( +/obj/structure/table, +/obj/item/book/skill/service/cooking, +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"jT" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/item/storage/pill_bottle, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/eftpos, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"jU" = ( +/turf/simulated/wall, +/area/ministation/maint/sebypass) +"jV" = ( +/obj/effect/floor_decal/corner/green/half, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"jW" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"jZ" = ( +/obj/machinery/light, +/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"kh" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"km" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"kr" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"kv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"kB" = ( +/obj/structure/dogbed, +/obj/item/clothing/shoes/color/brown{ + desc = "Old, but sensible brown shoes. These belong to Ian." + }, +/obj/item/radio/intercom/locked/entertainment{ + dir = 1; + pixel_y = -30 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"kC" = ( +/obj/machinery/vending/snack, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"kE" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 9; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"kI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"kM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"kR" = ( +/obj/structure/table, +/obj/item/chems/glass/rag, +/obj/item/trash/stick, +/obj/item/kitchen/utensil/spoon, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"kS" = ( +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/medical) +"kX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/abstract/landmark/latejoin/observer, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"kZ" = ( +/turf/simulated/wall, +/area/ministation/hall/w2) +"la" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/hall/e2) +"ln" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/ss13/l12, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"lo" = ( +/obj/machinery/door/airlock/external{ + locked = 1; + id_tag = "l2_central_north_airlock_exterior"; + autoset_access = 0 + }, +/obj/machinery/button/access/interior{ + id_tag = "l2_central_north_airlock"; + name = "exterior access button"; + pixel_y = 24; + command = "cycle_exterior" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"lw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"ly" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/red{ + dir = 5 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"lB" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"lF" = ( +/turf/simulated/wall, +/area/ministation/maint/nebypass) +"lH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"lI" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/bed/chair, +/obj/machinery/status_display{ + pixel_x = -32; + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"lJ" = ( +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = -30; + dir = 1 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"lL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"lN" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/mirrored{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"lQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/obj/structure/hygiene/sink{ + dir = 8; + pixel_x = -11 + }, +/obj/item/chems/glass/bucket, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"lR" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"mc" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"md" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"mf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"mh" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"mi" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "_West APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"mj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"mk" = ( +/obj/structure/window/reinforced, +/obj/structure/table, +/obj/machinery/recharger, +/turf/simulated/floor/tiled, +/area/ministation/security) +"mp" = ( +/obj/structure/closet/secure_closet{ + req_access = list("ACCESS_FORENSICS"); + name = "evidence locker"; + closet_appearance = /decl/closet_appearance/secure_closet/security + }, +/turf/simulated/floor/wood, +/area/ministation/detective) +"mq" = ( +/turf/simulated/wall, +/area/ministation/maint/l2centraln) +"mw" = ( +/obj/machinery/light/small, +/obj/effect/floor_decal/snow, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"mz" = ( +/obj/machinery/door/airlock/glass/security, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"mC" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/machinery/light, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"mG" = ( +/obj/machinery/atmospherics/unary/engine, +/turf/space, +/area/ministation/arrival) +"mH" = ( +/turf/simulated/wall, +/area/ministation/hall/e2) +"mJ" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/flora/bush/fullgrass, +/obj/structure/flora/bush/lavendergrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"mL" = ( +/obj/structure/table, +/obj/item/storage/box/syringes, +/obj/machinery/light, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"mO" = ( +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"mR" = ( +/obj/effect/floor_decal/industrial/loading{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"mW" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"nf" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/airlock/medical, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"no" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal, +/turf/simulated/floor/tiled, +/area/ministation/security) +"np" = ( +/obj/machinery/door/airlock/external{ + autoset_access = 0; + id_tag = "l2_central_north_airlock_interior"; + locked = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/button/access/interior{ + id_tag = "l2_central_north_airlock"; + name = "interior access button"; + pixel_y = 24 + }, +/turf/simulated/floor, +/area/ministation/maint/l2centraln) +"ns" = ( +/obj/structure/sign/department/id_office{ + dir = 1; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"nu" = ( +/obj/structure/rack, +/obj/machinery/door/window/brigdoor/southleft, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/gun/projectile/automatic/assault_rifle, +/turf/simulated/floor/tiled, +/area/ministation/security) +"nx" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/embedded_controller/radio/airlock/docking_port{ + dir = 4; + id_tag = "station1"; + tag_airpump = "escape1_vent"; + tag_chamber_sensor = "escape1_sensor"; + tag_exterior_door = "escape1_airlock_exterior"; + tag_interior_door = "escape1_airlock_interior"; + pixel_x = -20 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"nB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/floor_decal/corner/red{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"nC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"nD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"nF" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"nK" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + id_tag = "l2_central_south_airlock_interior"; + locked = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/button/access/interior{ + id_tag = "l2_central_south_airlock"; + name = "interior access button"; + pixel_x = 20; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"nS" = ( +/obj/item/gun/energy/taser, +/obj/structure/closet/secure_closet/guncabinet, +/obj/item/gun/energy/taser, +/obj/item/gun/projectile/shotgun/doublebarrel/sawn, +/obj/item/gun/projectile/shotgun/doublebarrel/sawn, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/item/storage/box/ammo/shotgunshells, +/obj/item/storage/box/ammo/shotgunshells, +/turf/simulated/floor/tiled, +/area/ministation/security) +"nX" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"ob" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "_West APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/security) +"oc" = ( +/obj/structure/rack, +/obj/random/maintenance, +/obj/item/clothing/suit/storage/toggle/bomber, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"od" = ( +/obj/structure/skele_stand, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"oj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/camera/network/security{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"ol" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"on" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"or" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"ov" = ( +/obj/structure/table/reinforced, +/obj/machinery/camera/autoname, +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/item/storage/medical_lolli_jar{ + pixel_y = 7 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"oz" = ( +/turf/simulated/wall, +/area/ministation/medical) +"oA" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/southright, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/turf/simulated/floor/plating, +/area/ministation/medical) +"oB" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"oD" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"oE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"oF" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"oH" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"oN" = ( +/obj/effect/shuttle_landmark/escape_shuttle/station, +/turf/space, +/area/space) +"oS" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"oW" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"oX" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"oY" = ( +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"oZ" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/security) +"pb" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sqm_airlock_exterior" + }, +/obj/machinery/button/access/interior{ + id_tag = "sqm_airlock"; + name = "exterior access button"; + pixel_y = 20; + command = "cycle_exterior" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"pd" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/security) +"pe" = ( +/obj/item/stool/padded, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pf" = ( +/obj/structure/table/woodentable, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ph" = ( +/obj/structure/ladder, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"pl" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"pr" = ( +/turf/simulated/floor/airless, +/area/space) +"ps" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/wall, +/area/ministation/hall/w2) +"pu" = ( +/obj/structure/closet/crate/bin/ministation, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"pw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"pA" = ( +/obj/structure/table, +/obj/item/chems/drinks/glass2/mug, +/obj/item/chems/drinks/glass2/mug, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"pD" = ( +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"pG" = ( +/obj/structure/sign/plaque/diploma/medical{ + pixel_y = 31 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"pH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/item/stool/padded, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"pI" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/item/stool/padded, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/status_display{ + pixel_y = 33; + pixel_x = -1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/wall, +/area/ministation/medical) +"pK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/body_scan_display{ + pixel_y = 20; + id_tag = "mediscanner" + }, +/obj/machinery/bodyscanner{ + dir = 8; + id_tag = "mediscanner" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/machinery/body_scanconsole{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/masks, +/obj/item/storage/box/gloves, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/camera/network/medbay, +/obj/structure/bed/roller, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pP" = ( +/obj/structure/table, +/obj/item/surgicaldrill, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pQ" = ( +/obj/structure/table, +/obj/item/hemostat, +/obj/item/retractor, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pR" = ( +/obj/structure/table, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/circular_saw, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pS" = ( +/obj/structure/table, +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/item/bonesetter, +/obj/item/bonegel, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pT" = ( +/obj/structure/table, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/item/sutures, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"pU" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/medical) +"pY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"qe" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"qf" = ( +/turf/simulated/wall, +/area/ministation/maint/l2centrals) +"qg" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/meter{ + name = "Distribution Loop" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"qk" = ( +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"qn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/table, +/obj/item/book/skill/medical, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"qo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/table, +/obj/item/newspaper, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"qp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"qq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"qr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/paleblue{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qs" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/airlock/double/medical{ + name = "medbay airlock"; + autoset_access = 0; + id_tag = "medleave"; + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qy" = ( +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/obj/structure/closet/secure_closet/cmo, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qA" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"qB" = ( +/obj/structure/table/marble, +/obj/machinery/door/blast/shutters{ + id_tag = "Kitchen1"; + name = "Kitchen" + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"qF" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"qI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"qL" = ( +/obj/machinery/airlock_sensor{ + id_tag = "l2_central_north_sensor"; + pixel_y = 24; + pixel_x = 8 + }, +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "l2_central_north_airlock"; + pixel_y = 24; + tag_airpump = "l2_central_north_vent"; + tag_chamber_sensor = "l2_central_north_sensor"; + tag_exterior_door = "l2_central_north_airlock_exterior"; + tag_interior_door = "l2_central_north_airlock_interior"; + pixel_x = -8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"qM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"qN" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4; + icon_state = "warningcorner" + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"qO" = ( +/obj/machinery/cryopod{ + dir = 1 + }, +/obj/item/radio/intercom{ + dir = 1; + pixel_y = -30 + }, +/obj/abstract/landmark/latejoin/cryo, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"qS" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/space, +/area/ministation/security) +"qT" = ( +/obj/machinery/portable_atmospherics/hydroponics, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"qX" = ( +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/computer/modular/preset/security{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"qY" = ( +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"qZ" = ( +/obj/machinery/light, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"ra" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/carpet/blue2, +/area/ministation/medical) +"rb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/paleblue{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rc" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/status_display{ + pixel_x = -32; + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rd" = ( +/obj/abstract/landmark/start{ + name = "Medical Doctor" + }, +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/machinery/button/alternate/door{ + dir = 4; + id_tag = "medleave"; + name = "Interior medbay doors button"; + pixel_x = -32; + pixel_y = -32 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"re" = ( +/obj/abstract/landmark/start{ + name = "Medical Doctor" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rg" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ri" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rk" = ( +/obj/machinery/optable, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rm" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ro" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"rt" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"ry" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 1; + icon_state = "warningcorner" + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"rA" = ( +/obj/structure/table/woodentable, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rC" = ( +/obj/machinery/airlock_sensor{ + id_tag = "l2_central_south_sensor"; + pixel_y = 10; + pixel_x = -20; + dir = 4 + }, +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "l2_central_south_airlock"; + pixel_y = null; + tag_airpump = "l2_central_south_vent"; + tag_chamber_sensor = "l2_central_south_sensor"; + tag_exterior_door = "l2_central_south_airlock_exterior"; + tag_interior_door = "l2_central_south_airlock_interior"; + dir = 4; + pixel_x = -20 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"rD" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/closet/secure_closet/hop, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"rE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rI" = ( +/obj/item/stool/padded, +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/paleblue{ + dir = 10 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/paleblue{ + dir = 10 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rL" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/structure/curtain/medical, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rM" = ( +/obj/machinery/status_display{ + pixel_y = -29; + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rN" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rP" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/wall, +/area/ministation/medical) +"rR" = ( +/obj/machinery/vitals_monitor, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rS" = ( +/obj/structure/hygiene/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/camera/network/medbay{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"rU" = ( +/obj/structure/table, +/obj/machinery/faxmachine, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"rW" = ( +/obj/machinery/light, +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"rX" = ( +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"sg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"sh" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"si" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/machinery/door/airlock/double/medical{ + name = "Medbay Lobby airlock"; + autoset_access = 0 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"sj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"sk" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"sm" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"sn" = ( +/obj/structure/table, +/obj/item/storage/box/gloves, +/obj/item/storage/box/masks, +/obj/item/clothing/suit/surgicalapron, +/obj/item/clothing/suit/surgicalapron, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"so" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"sp" = ( +/obj/structure/flora/bush/fullgrass, +/turf/simulated/floor/grass, +/area/ministation/hall/w2) +"sq" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ss" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"st" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"su" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atm{ + pixel_y = 32 + }, +/obj/machinery/camera/network/hallway, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"sv" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"sB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"sC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sG" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"sI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"sM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/sign/department/forensics{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sQ" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sS" = ( +/obj/effect/floor_decal/industrial/firstaid{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"sU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/sign/department/security/alt{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/red{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/effect/decal/cleanable/filth, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"sX" = ( +/obj/machinery/sleeper/standard, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"sY" = ( +/obj/structure/table, +/obj/item/chems/dropper, +/obj/item/chems/glass/beaker, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ta" = ( +/obj/structure/iv_drip, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"tb" = ( +/obj/item/chems/ivbag/blood/aminus, +/obj/item/chems/ivbag/blood/aplus, +/obj/item/chems/ivbag/blood/bminus, +/obj/item/chems/ivbag/blood/bplus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/oplus, +/obj/structure/closet/crate/freezer, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"te" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/ss13/l1, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tg" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/floor_decal/ss13/l3, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"th" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/ss13/l5, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ti" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/ss13/l7, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/ss13/l9, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tl" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"tm" = ( +/obj/machinery/atmospherics/pipe/simple/visible/universal{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"tq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tt" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tv" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/turf/simulated/open, +/area/ministation/hall/e2) +"tx" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"ty" = ( +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tD" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tE" = ( +/obj/abstract/landmark{ + name = "lightsout" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tG" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tH" = ( +/obj/effect/floor_decal/industrial/firstaid{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"tI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"tJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"tL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/green/half, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/wall, +/area/ministation/hall/w2) +"tN" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/airlock/medical, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"tO" = ( +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"tP" = ( +/obj/effect/floor_decal/ss13/l10, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tS" = ( +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/cooker/fryer, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"tT" = ( +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"tU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/floor_decal/corner/red{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"tW" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"tZ" = ( +/obj/machinery/vending/coffee{ + dir = 4; + pixel_x = -5 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ua" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ub" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"uc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ud" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/ss13/l6, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ue" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ug" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ui" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 1; + icon_state = "warningcorner" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"ul" = ( +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"um" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"un" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + level = 2 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/security) +"up" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"uq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"us" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/firstaid{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"ut" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"uu" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"uv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"ux" = ( +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"uy" = ( +/obj/structure/morgue, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"uB" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"uC" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"uD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"uG" = ( +/obj/structure/bed/chair/office/comfy/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"uH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"uI" = ( +/turf/simulated/wall/r_wall, +/area/ministation/hop) +"uJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"uK" = ( +/obj/effect/decal/cleanable/filth, +/obj/machinery/atmospherics/pipe/simple/visible/universal, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"uL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/airlock/glass/civilian{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled, +/area/ministation/cafe) +"uM" = ( +/obj/effect/wallframe_spawn/no_grille, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/cafe) +"uN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/glass/civilian{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/cafe) +"uP" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"uV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/structure/sign/warning/nosmoking_1{ + pixel_x = -32; + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"uW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"uX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"uZ" = ( +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"vb" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"ve" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/shutters{ + name = "office shutters"; + id_tag = "hopshut" + }, +/turf/simulated/floor/plating, +/area/ministation/hop) +"vf" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/shutters{ + name = "office shutters"; + id_tag = "hopshut" + }, +/turf/simulated/floor/plating, +/area/ministation/hop) +"vi" = ( +/obj/machinery/door/window/brigdoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/security) +"vm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"vn" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"vp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/machinery/door/window/brigdoor/eastleft, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/medical) +"vq" = ( +/obj/structure/closet/secure_closet/detective, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/ammo_magazine/pistol, +/obj/item/ammo_magazine/pistol, +/turf/simulated/floor/wood, +/area/ministation/detective) +"vr" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"vt" = ( +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/structure/flora/pottedplant/minitree, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vv" = ( +/obj/structure/flora/pottedplant/unusual, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vy" = ( +/obj/machinery/vending/boozeomat, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vz" = ( +/obj/structure/table, +/obj/machinery/chemical_dispenser/bar_coffee/full, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vA" = ( +/obj/structure/table, +/obj/machinery/chemical_dispenser/bar_soft/full, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vE" = ( +/obj/item/synthesized_instrument/guitar, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southright, +/obj/structure/table/reinforced, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"vF" = ( +/obj/machinery/computer/arcade, +/obj/structure/noticeboard{ + default_pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vG" = ( +/obj/machinery/atm{ + pixel_y = 32 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"vH" = ( +/obj/structure/table, +/obj/item/chems/dropper, +/obj/item/storage/box/syringes, +/obj/item/mollusc/clam, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"vJ" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 6 + }, +/mob/living/simple_animal/crow{ + desc = "She's not a real doctor but she is a real bird."; + name = "Dr. Bird"; + stop_automated_movement = 0 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"vK" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/medical) +"vL" = ( +/obj/machinery/door/airlock/medical{ + name = "Head Doctor" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"vM" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/closet/coffin, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"vN" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/obj/item/radio/intercom{ + dir = 1; + pixel_y = -30 + }, +/obj/item/scanner/autopsy, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"vO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/industrial/warning, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"vP" = ( +/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"vS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command{ + name = "Head of Personell" + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"vT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/blast_door{ + id_tag = "hopshut"; + name = "Office Shutters Button"; + pixel_y = 30 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"vU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"vV" = ( +/obj/machinery/computer/modular/preset/cardslot/command{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"wc" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"wk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wm" = ( +/obj/item/stool/bar/padded, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"wn" = ( +/obj/structure/table/marble, +/obj/structure/sign/painting/monkey_painting{ + pixel_y = 24 + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/item/sticky_pad{ + pixel_x = -8; + pixel_y = 1 + }, +/obj/structure/flora/pottedplant/flower, +/obj/machinery/door/blast/shutters{ + id_tag = "barshut"; + name = "Bar Shutters" + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"wo" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/machinery/button/blast_door{ + id_tag = "barshut"; + name = "Bar Shutters Button"; + pixel_x = -24; + pixel_y = 36 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wp" = ( +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wq" = ( +/obj/structure/hygiene/sink/kitchen{ + dir = 8; + pixel_x = 21 + }, +/obj/machinery/light_switch{ + pixel_x = 27; + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wr" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/turf/simulated/open, +/area/ministation/maint/l2centrals) +"ws" = ( +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"wt" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"wu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"ww" = ( +/obj/machinery/computer/modular/preset/medical{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"wx" = ( +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"wy" = ( +/obj/machinery/chem_master, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"wz" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"wA" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/westright, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/plating, +/area/ministation/medical) +"wB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"wC" = ( +/obj/machinery/camera/network/medbay{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"wD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"wE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"wF" = ( +/turf/simulated/floor/tiled, +/area/ministation/hop) +"wL" = ( +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"wN" = ( +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"wO" = ( +/obj/item/chems/condiment/small/peppermill, +/obj/item/knife/table, +/obj/item/kitchen/utensil/fork, +/obj/structure/table/gamblingtable, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/table/gamblingtable, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wQ" = ( +/obj/structure/table/marble, +/obj/item/storage/box/donut, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/blast/shutters{ + id_tag = "barshut"; + name = "Bar Shutters" + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"wR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wS" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/table, +/obj/item/flame/lighter/zippo, +/obj/item/chems/drinks/shaker, +/obj/item/clothing/head/collectable/tophat, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"wW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/portable_atmospherics/hydroponics, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"wY" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"wZ" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xa" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Morgue" + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"xb" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"xc" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/structure/table, +/obj/item/cell/device/high, +/obj/item/cell/device/high, +/obj/item/defibrillator/loaded, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xd" = ( +/obj/structure/bed/chair/office/light{ + dir = 8 + }, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"xe" = ( +/obj/machinery/recharger, +/obj/structure/table/steel, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xf" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"xj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"xo" = ( +/obj/item/kitchen/utensil/spoon, +/obj/item/chems/condiment/small/saltshaker, +/obj/item/chems/condiment/small/sugar, +/obj/structure/table/gamblingtable, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/item/deck/cards, +/obj/structure/table/gamblingtable, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xq" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/obj/item/stool/padded, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xs" = ( +/obj/structure/table/marble, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/item/trash/tray, +/obj/machinery/door/blast/shutters{ + id_tag = "barshut"; + name = "Bar Shutters" + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"xt" = ( +/obj/structure/table, +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 + }, +/obj/machinery/chemical_dispenser/bar_alc/full{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"xy" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"xz" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"xA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/paleblue{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Chemistry" + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xF" = ( +/obj/machinery/camera/network/medbay{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"xH" = ( +/obj/structure/table, +/obj/item/storage/firstaid/fire{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"xJ" = ( +/turf/simulated/wall, +/area/ministation/hop) +"xK" = ( +/obj/machinery/light/small/emergency{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"xO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"xQ" = ( +/obj/item/stool/padded, +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xR" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xT" = ( +/obj/item/stool/bar/padded, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"xU" = ( +/obj/structure/table/marble, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/blast/shutters{ + id_tag = "barshut"; + name = "Bar Shutters" + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"xV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"xW" = ( +/obj/structure/table/marble, +/obj/machinery/status_display{ + pixel_y = -29; + dir = 1 + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/item/chems/condiment/ketchup, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/blast/shutters{ + id_tag = "barshut"; + name = "Bar Shutters" + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"xY" = ( +/obj/machinery/atmospherics/unary/engine{ + dir = 1 + }, +/turf/space, +/area/space) +"xZ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"ya" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/camera/network/security{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"yb" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder/juicer, +/obj/item/chems/glass/beaker, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"yc" = ( +/obj/structure/table, +/obj/machinery/reagent_temperature/cooler, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ye" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"yf" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/hydro) +"yg" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"yh" = ( +/obj/structure/table, +/obj/item/storage/firstaid/toxin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"yk" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/open, +/area/ministation/maint/nebypass) +"yl" = ( +/obj/structure/displaycase, +/obj/item/clothing/mask/gas/owl_mask{ + desc = "So realistic, you'd almost think it's the real thing."; + name = "replica 'The Owl' mask"; + pixel_x = 1; + pixel_y = -5 + }, +/obj/machinery/light_switch{ + pixel_y = 29; + pixel_x = 7 + }, +/turf/simulated/floor/carpet, +/area/ministation/hop) +"yn" = ( +/obj/random/trash, +/obj/machinery/atmospherics/portables_connector, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"yu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"yv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/media/jukebox/old, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"yw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"yx" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"yy" = ( +/obj/item/stool/bar/padded, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/simulated/floor/carpet, +/area/ministation/cafe) +"yA" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/decal/cleanable/tomato_smudge, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/reagent_dispensers/beerkeg, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"yB" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -29; + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"yC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"yD" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 8 + }, +/obj/machinery/camera/network/hallway{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"yE" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"yF" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"yG" = ( +/obj/structure/closet/secure_closet/personal/patient, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"yJ" = ( +/obj/structure/table, +/obj/item/gun/launcher/syringe, +/obj/item/flashlight/pen, +/obj/item/flashlight/pen, +/obj/item/clothing/suit/straight_jacket, +/obj/item/chems/hypospray/vial{ + desc = "One of the first hyposprays ever made. Supposedly only a handful exist."; + name = "prototype hypospray"; + origin_tech = null + }, +/obj/item/clothing/accessory/stethoscope, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"yK" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"yM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"yN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/camera/network/hallway{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"yS" = ( +/obj/effect/floor_decal/ss13/l11, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"yV" = ( +/obj/machinery/papershredder, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"yY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/table, +/obj/machinery/reagent_temperature, +/obj/machinery/camera/network/medbay{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"zd" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ze" = ( +/obj/effect/floor_decal/ss13/l16, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"zf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/civilian{ + autoset_access = 0; + name = "Kitchen airlock"; + req_access = list("ACCESS_KITCHEN") + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood, +/area/ministation/cafe) +"zg" = ( +/obj/structure/sign/warning/high_voltage{ + pixel_y = 32; + pixel_x = 23 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"zh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/civilian{ + autoset_access = 0; + name = "Kitchen airlock"; + req_access = list("ACCESS_KITCHEN") + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"zj" = ( +/obj/structure/table/glass, +/obj/item/hatchet, +/obj/item/hatchet, +/obj/item/minihoe, +/obj/item/minihoe, +/obj/item/book/skill/service/botany, +/obj/item/wirecutters/clippers, +/obj/item/scanner/plant, +/obj/item/storage/plants, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"zl" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"zn" = ( +/obj/structure/table/steel, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"zo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"zq" = ( +/obj/structure/bed, +/obj/item/bedsheet/clown, +/turf/simulated/floor/carpet/blue3, +/area/ministation/security) +"zt" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/table, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"zv" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"zy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"zA" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"zC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass/freezer{ + autoset_access = 0 + }, +/turf/simulated/floor/tiled/steel_ridged, +/area/ministation/cafe) +"zD" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/obj/structure/hygiene/sink/kitchen{ + pixel_y = 25 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zF" = ( +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zG" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"zH" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/table/woodentable, +/obj/machinery/button/blast_door{ + id_tag = "Kitchen1"; + name = "Kitchen Shutter"; + pixel_y = 24 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zI" = ( +/obj/machinery/status_display{ + pixel_y = 30 + }, +/obj/machinery/cooker/cereal, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zJ" = ( +/obj/machinery/vending/dinnerware, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"zL" = ( +/obj/machinery/smartfridge/foods, +/turf/simulated/floor/plating, +/area/ministation/cafe) +"zM" = ( +/obj/machinery/atmospherics/portables_connector{ + pixel_x = -3 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"zO" = ( +/obj/machinery/biogenerator, +/obj/effect/floor_decal/corner/beige/half, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"zP" = ( +/obj/effect/floor_decal/corner/beige/half, +/obj/machinery/vending/hydroseeds{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"zQ" = ( +/turf/simulated/wall, +/area/ministation/hydro) +"zW" = ( +/obj/machinery/door/airlock/glass/security{ + autoset_access = 0; + name = "Detective's Office"; + req_access = list("ACCESS_FORENSICS") + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/wood, +/area/ministation/detective) +"zZ" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ae" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Af" = ( +/obj/abstract/landmark/start{ + name = "Bartender" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ag" = ( +/obj/abstract/landmark/start{ + name = "Bartender" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ah" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ai" = ( +/obj/effect/decal/cleanable/flour, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Aj" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ak" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Am" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"An" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"As" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"At" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/cooker/grill, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Au" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"Av" = ( +/obj/structure/closet/chefcloset, +/obj/item/storage/box/ammo/beanbags, +/obj/item/clothing/suit/storage/toggle/wintercoat/hydro, +/obj/item/gun/projectile/shotgun/doublebarrel/sawn{ + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Aw" = ( +/obj/machinery/cooker/oven, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ax" = ( +/obj/structure/closet, +/obj/item/clothing/mask/gas/clown_hat, +/obj/item/clothing/shoes/clown_shoes, +/obj/item/clothing/under/clown, +/obj/item/stamp/clown, +/obj/item/storage/backpack/clown, +/obj/item/bikehorn, +/obj/item/storage/fancy/crayons, +/obj/item/poster, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"Ay" = ( +/obj/machinery/reagentgrinder, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Az" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/hygiene/sink{ + dir = 8; + pixel_x = -11 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"AA" = ( +/obj/machinery/cooker/candy, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"AB" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"AD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"AG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"AJ" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"AK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"AR" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"AX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Be" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Bj" = ( +/obj/machinery/airlock_sensor{ + id_tag = "escape3_sensor"; + pixel_y = 20 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "escape1_vent" + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"Bk" = ( +/obj/structure/table/woodentable, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/item/camera, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Bm" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "sqm_airlock_interior" + }, +/obj/machinery/button/access/interior{ + id_tag = "sqm_airlock"; + name = "interior access button"; + pixel_y = 20 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"Bs" = ( +/obj/structure/rack, +/obj/machinery/door/window/brigdoor/southleft, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/ammo_magazine/rifle, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Bv" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/crate/bin/ministation, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Bw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/computer/modular/telescreen/preset/generic{ + name = "south bump"; + pixel_y = -20; + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"Bz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"BA" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/obj/abstract/landmark/start{ + name = "Head of Security" + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/security) +"BE" = ( +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"BG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"BH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/ss13/l2, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"BJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/cafe) +"BS" = ( +/obj/machinery/vending/snack, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"BT" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"BW" = ( +/obj/structure/flora/bush/lavendergrass, +/turf/simulated/floor/grass, +/area/ministation/hall/w2) +"Ca" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Cb" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ci" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ck" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l2underpass) +"Co" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"Cu" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Cx" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/shutters/open{ + id_tag = "CMO1"; + name = "CMO Shutters" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/medical) +"CD" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/medical) +"CJ" = ( +/obj/structure/bed/roller, +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"CL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"CO" = ( +/obj/machinery/door/airlock/security{ + name = "Warden" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/carpet/blue3, +/area/ministation/security) +"CP" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"CU" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Airlock"; + autoset_access = 0 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"CV" = ( +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Dj" = ( +/obj/machinery/camera/autoname{ + dir = 1 + }, +/obj/structure/table/woodentable, +/obj/item/chems/condiment/enzyme, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Dn" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Ds" = ( +/obj/structure/bed, +/obj/item/bedsheet/hop, +/turf/simulated/floor/carpet, +/area/ministation/hop) +"Dw" = ( +/obj/machinery/photocopier, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"DC" = ( +/obj/machinery/computer/modular/preset/security{ + dir = 4 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"DD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"DF" = ( +/obj/abstract/landmark/start{ + name = "Robot" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"DG" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"DH" = ( +/obj/structure/closet/secure_closet/security, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/flashlight/maglight, +/turf/simulated/floor/tiled, +/area/ministation/security) +"DI" = ( +/obj/item/mollusc/barnacle{ + pixel_x = -13; + pixel_y = -14 + }, +/turf/space, +/area/space) +"DJ" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"DY" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/recharger, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Ea" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ec" = ( +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Eg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"Ei" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/bed/chair/comfy/beige, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Ev" = ( +/obj/machinery/atmospherics/unary/engine{ + dir = 1 + }, +/turf/space, +/area/ministation/arrival) +"Ez" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"EA" = ( +/obj/effect/shuttle_landmark/arrivas_south, +/turf/space, +/area/space) +"ED" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/cafe) +"EE" = ( +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Security Officer" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"EG" = ( +/obj/machinery/light/small/emergency{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"EL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"EM" = ( +/obj/machinery/computer/account_database{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/network/command, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"ER" = ( +/obj/structure/ladder, +/obj/structure/cable{ + icon_state = "16-0" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/zpipe/up/scrubbers, +/obj/machinery/atmospherics/pipe/zpipe/up/supply, +/obj/structure/disposalpipe/up{ + dir = 2 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"EV" = ( +/obj/structure/closet/secure_closet/guncabinet, +/obj/item/gun/projectile/automatic/smg, +/obj/item/gun/projectile/automatic/smg, +/obj/item/ammo_magazine/smg/rubber, +/obj/item/ammo_magazine/smg/rubber, +/obj/item/ammo_magazine/smg/rubber, +/obj/item/ammo_magazine/smg/rubber, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/item/ammo_magazine/smg/rubber, +/obj/item/ammo_magazine/smg/rubber, +/obj/item/ammo_magazine/smg/rubber, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Fn" = ( +/obj/structure/closet, +/obj/random/maintenance, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/poster, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Fo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/smartfridge/chemistry, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Fr" = ( +/obj/structure/flora/pottedplant/flower, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Ft" = ( +/obj/structure/target_stake, +/turf/simulated/floor/tiled, +/area/ministation/security) +"FF" = ( +/obj/structure/reagent_dispensers/water_cooler{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"FJ" = ( +/obj/abstract/landmark/start{ + name = "Clown" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/item/radio/intercom/locked/entertainment{ + dir = 1; + pixel_y = -30 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"FL" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"FQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"FZ" = ( +/obj/machinery/firealarm{ + pixel_y = 32 + }, +/obj/structure/bed/chair/comfy/beige, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Ga" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"Gb" = ( +/obj/machinery/door/airlock/security{ + name = "Head of Security" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/carpet/blue2, +/area/ministation/security) +"Gd" = ( +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"Ge" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/roller{ + pixel_y = 10 + }, +/obj/item/roller{ + pixel_y = 10 + }, +/obj/item/storage/belt/medical/emt, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Gg" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Gu" = ( +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 + }, +/obj/structure/rack/dark, +/obj/item/roller, +/obj/item/roller, +/obj/item/roller, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Gx" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"Gy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Gz" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/door/firedoor, +/turf/simulated/floor, +/area/ministation/hop) +"GR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"GZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Hd" = ( +/obj/machinery/light, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"Hi" = ( +/obj/effect/floor_decal/industrial/firstaid{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"Hn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Hy" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Hz" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"HF" = ( +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/machinery/alarm{ + dir = 4; + pixel_y = -1; + pixel_x = -25 + }, +/turf/simulated/floor/wood, +/area/ministation/detective) +"HG" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"HJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"HL" = ( +/obj/machinery/chemical_dispenser/full, +/obj/item/chems/glass/beaker/large, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"HM" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/eftpos, +/obj/item/mollusc/clam, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"HN" = ( +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -29 + }, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"HO" = ( +/turf/simulated/floor/reinforced/airless, +/area/space) +"HP" = ( +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"HR" = ( +/mob/living/simple_animal/mouse, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"HX" = ( +/obj/structure/closet/secure_closet/warden, +/obj/item/flashlight/maglight, +/turf/simulated/floor/carpet/blue3, +/area/ministation/security) +"Ib" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Ie" = ( +/obj/machinery/status_display{ + pixel_y = -29; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"Ig" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"Ij" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Im" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southleft, +/obj/structure/table/reinforced, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"Io" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/portables_connector{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"Ip" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"Ir" = ( +/obj/structure/table, +/obj/item/folder/blue, +/obj/item/storage/box/PDAs, +/obj/machinery/status_display{ + pixel_y = 30 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"Iw" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/unary/engine, +/turf/space, +/area/ministation/arrival) +"Ix" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 1; + id_tag = "l2_central_south_vent" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Iz" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"IA" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "Dock Airlock"; + autoclose = 0 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"IB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"IP" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/recharger, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"IT" = ( +/obj/machinery/newscaster{ + pixel_x = -32; + dir = 8 + }, +/obj/structure/flora/pottedplant/largebush, +/obj/machinery/camera/network/security{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"IX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"Jc" = ( +/obj/structure/closet/secure_closet/security, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/flashlight/maglight, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Jd" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Jl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Jm" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "_East APC"; + pixel_x = 27; + pixel_y = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"Jo" = ( +/obj/abstract/landmark/start{ + name = "Detective" + }, +/obj/structure/bed/chair/office/comfy/brown{ + dir = 4 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"Js" = ( +/obj/structure/closet/secure_closet/brig, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Jt" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/alarm{ + pixel_y = -24; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/e2) +"Jx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"Jz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"JH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"JJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/universal{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"JQ" = ( +/obj/structure/bed/chair/armchair/black{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"JX" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"JZ" = ( +/turf/simulated/wall, +/area/ministation/detective) +"Kd" = ( +/obj/structure/closet, +/obj/random/maintenance, +/obj/item/poster, +/turf/simulated/floor/plating, +/area/ministation/maint/secmaint) +"Kk" = ( +/obj/structure/bed, +/obj/item/bedsheet/blue, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"Kr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Kv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/structure/flora/bush/fullgrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"Kz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/camera/network/hallway{ + dir = 1 + }, +/obj/structure/flora/bush/lavendergrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"KG" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/simulated/floor/tiled, +/area/ministation/security) +"KH" = ( +/obj/structure/rack, +/obj/machinery/door/window/brigdoor/southleft, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser, +/turf/simulated/floor/tiled, +/area/ministation/security) +"KK" = ( +/obj/machinery/forensic/microscope, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"KN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"KV" = ( +/obj/machinery/door/airlock/glass/command{ + autoset_access = 0; + name = "Armory airlock"; + req_access = list("ACCESS_ARMORY") + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"KW" = ( +/obj/machinery/forensic/dnascanner, +/turf/simulated/floor/carpet/red, +/area/ministation/detective) +"KX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/paleblue{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"Lm" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Lr" = ( +/obj/structure/table/woodentable, +/obj/machinery/reagentgrinder/juicer, +/obj/item/chems/glass/beaker, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ls" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"Lt" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"LE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"LH" = ( +/obj/structure/ladder, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2underpass) +"LI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"LN" = ( +/obj/machinery/computer/dummy, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"LT" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 10 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"LY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Mb" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Md" = ( +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Me" = ( +/obj/structure/rack, +/obj/item/target, +/obj/item/target/alien, +/obj/item/target/syndicate, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/alien, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Mp" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"Mu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Mw" = ( +/obj/machinery/cryopod{ + dir = 1 + }, +/obj/abstract/landmark/latejoin/cryo, +/obj/machinery/status_display{ + pixel_y = -1; + pixel_x = 32; + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"MA" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/closet/secure_closet/hop2, +/obj/item/book/skill/organizational/finance, +/turf/simulated/floor/carpet, +/area/ministation/hop) +"MG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"MH" = ( +/obj/structure/table, +/obj/item/implantcase/tracking, +/obj/item/implantcase/chem, +/obj/item/implanter, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"MK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"ML" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"MQ" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"MU" = ( +/obj/structure/filing_cabinet/chestdrawer, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"MW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"MY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"Nf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/sign/double/barsign{ + dir = 1; + pixel_x = 1; + pixel_y = -63 + }, +/obj/structure/flora/bush/lavendergrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"Nh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4; + icon_state = "warningcorner" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Nj" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/item/bell, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Nm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"No" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/camera/network/security{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Np" = ( +/obj/machinery/door/airlock/command, +/obj/machinery/door/firedoor, +/turf/simulated/floor, +/area/ministation/hop) +"Nq" = ( +/obj/effect/floor_decal/ss13/l8, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Nu" = ( +/obj/machinery/airlock_sensor{ + id_tag = "escape2_sensor"; + pixel_y = -20; + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "escape1_vent" + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"Nv" = ( +/obj/machinery/camera/network/security{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Nz" = ( +/obj/effect/floor_decal/ss13/l15, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"NC" = ( +/turf/simulated/open, +/area/ministation/hall/w2) +"ND" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/item/stool/padded, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"NE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"NO" = ( +/obj/abstract/level_data_spawner/main_level, +/turf/space, +/area/space) +"NR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"NU" = ( +/obj/structure/closet, +/obj/random/maintenance, +/obj/item/clothing/glasses/meson, +/obj/item/flashlight, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"NX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"NZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ob" = ( +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"Oc" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Om" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Op" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Oq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/double/glass/security{ + id_tag = "secdoor"; + name = "Security" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Ou" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Ov" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ow" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + level = 2 + }, +/turf/simulated/floor/carpet/blue3, +/area/ministation/security) +"OF" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/cafe) +"OH" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"OK" = ( +/obj/structure/closet/secure_closet/hos, +/obj/item/flashlight/maglight, +/turf/simulated/floor/carpet/blue2, +/area/ministation/security) +"OL" = ( +/obj/structure/closet/secure_closet/medical1, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ON" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/door/blast/shutters/open{ + id_tag = "quarantine"; + name = "quarantine shutters" + }, +/obj/item/chems/spray/cleaner, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"OT" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + locked = 1; + id_tag = "escape1_airlock_interior" + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"OV" = ( +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"OW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/directions/evac{ + dir = 8; + pixel_x = -32; + pixel_y = 25 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/warning/corner{ + icon_state = "warningcorner" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"OY" = ( +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Pd" = ( +/obj/structure/table/woodentable, +/obj/item/storage/fancy/cigarettes{ + pixel_y = 2 + }, +/obj/item/flame/lighter/random, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Pf" = ( +/turf/simulated/wall, +/area/ministation/arrival) +"Pj" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Pk" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"Po" = ( +/obj/effect/floor_decal/corner/red{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Pw" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Pz" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/medical) +"PH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"PI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"PL" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"PN" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + locked = 1; + id_tag = "escape1_airlock_exterior" + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"PR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/machinery/light, +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"PS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"PU" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 5; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"PX" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "l2_central_north_vent"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"PY" = ( +/obj/machinery/airlock_sensor{ + id_tag = "escape1_sensor"; + pixel_y = -20; + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "escape1_vent" + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"Qh" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/full, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Medical Supply" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Qj" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Qk" = ( +/obj/machinery/gibber, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"Qm" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Qp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"Qs" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Qz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/obj/abstract/landmark/start{ + name = "Head Doctor" + }, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"QC" = ( +/obj/structure/iv_drip, +/obj/machinery/camera/network/medbay{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"QE" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet, +/obj/random/maintenance, +/obj/random/suit, +/obj/item/poster, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"QF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"QK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"QL" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor, +/obj/machinery/door/blast/shutters{ + name = "security shutter"; + id_tag = "secshut" + }, +/turf/simulated/floor/plating, +/area/ministation/security) +"QN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"QO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"QR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Rd" = ( +/obj/structure/bed/chair/armchair/black{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"Rk" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/abstract/landmark/latejoin, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"Rp" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"Ru" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/portable_atmospherics/hydroponics, +/obj/effect/floor_decal/corner/green/half{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"Rw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Rx" = ( +/turf/simulated/wall, +/area/ministation/maint/secmaint) +"Ry" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"RB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"RD" = ( +/turf/simulated/wall/r_wall, +/area/ministation/cryo) +"RH" = ( +/obj/structure/lattice, +/turf/simulated/wall/r_wall, +/area/ministation/cryo) +"RK" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/structure/cable{ + icon_state = "32-1" + }, +/turf/simulated/open, +/area/ministation/maint/hydromaint) +"RQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"RU" = ( +/obj/machinery/camera/network/medbay{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"RW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"RZ" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Sa" = ( +/turf/simulated/wall, +/area/ministation/maint/hydromaint) +"Sd" = ( +/obj/effect/floor_decal/corner/green/half, +/obj/structure/sign/department/botany{ + pixel_y = -32; + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Sg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Sl" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Sp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/flora/bush/lavendergrass, +/turf/simulated/floor/grass, +/area/ministation/hall/e2) +"Sq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Sw" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/simulated/floor/tiled/freezer{ + name = "kitchen freezer floor"; + temperature = 263 + }, +/area/ministation/cafe) +"Sx" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "Dock Airlock" + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"Sy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/structure/railing/mapped, +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/open, +/area/ministation/hall/w2) +"SA" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"SB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"SD" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"SF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/ss13/l4, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"SK" = ( +/obj/machinery/light/small/emergency{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"SV" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"SW" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"SX" = ( +/obj/effect/floor_decal/industrial/loading{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Td" = ( +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"Tj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Tr" = ( +/obj/structure/rack, +/obj/item/beartrap, +/obj/random/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"Ts" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/carpet/blue, +/area/ministation/medical) +"TB" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/detective) +"TD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"TO" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"TS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display{ + pixel_y = 30 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"TT" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"TV" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/airlock/security, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"TW" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "sqm_vent"; + dir = 8 + }, +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + dir = 0; + id_tag = "sqm_airlock"; + pixel_y = 24; + tag_airpump = "sqm_vent"; + tag_chamber_sensor = "sqm_sensor"; + tag_exterior_door = "sqm_airlock_exterior"; + tag_interior_door = "sqm_airlock_interior"; + pixel_x = -8 + }, +/obj/machinery/airlock_sensor{ + id_tag = "sqm_sensor"; + pixel_y = 24; + pixel_x = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"TX" = ( +/obj/structure/table/woodentable, +/obj/item/eftpos, +/obj/item/chems/spray/cleaner, +/obj/machinery/light, +/obj/item/chems/condiment/small/packet/honey, +/obj/item/chems/condiment/small/packet/honey, +/obj/item/chems/condiment/small/packet/honey, +/obj/item/chems/condiment/small/packet/honey, +/obj/item/chems/condiment/small/packet/honey, +/obj/item/chems/condiment/small/packet/honey, +/obj/item/chems/condiment/small/packet/honey, +/turf/simulated/floor/lino, +/area/ministation/cafe) +"Ug" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Ut" = ( +/obj/structure/sign/plaque/golden/security{ + pixel_y = 32 + }, +/obj/machinery/vending/security, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Uv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Uw" = ( +/obj/structure/lattice, +/obj/item/mollusc/barnacle{ + pixel_x = -13; + pixel_y = -14 + }, +/turf/space, +/area/space) +"Uz" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "Dock Airlock"; + autoclose = 0 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/w2) +"UB" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "_East APC"; + pixel_x = 27; + pixel_y = 2 + }, +/obj/structure/cable, +/turf/simulated/floor/plating, +/area/ministation/medical) +"UC" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -29; + dir = 4 + }, +/obj/structure/closet/wardrobe/chemistry_white, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"UJ" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"UL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centraln) +"UN" = ( +/obj/structure/bed/chair{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"UW" = ( +/obj/structure/bed/chair, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"UY" = ( +/obj/structure/bed, +/obj/item/bedsheet/hos, +/obj/machinery/computer/modular/telescreen/preset/generic{ + name = "north bump"; + pixel_y = 32 + }, +/obj/item/radio/intercom/locked/entertainment{ + pixel_y = 20 + }, +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 32 + }, +/turf/simulated/floor/carpet/blue2, +/area/ministation/security) +"UZ" = ( +/turf/simulated/wall/r_wall/hull, +/area/ministation/arrival) +"Va" = ( +/obj/structure/bed/chair/wheelchair, +/obj/machinery/camera/network/medbay, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Vb" = ( +/obj/structure/window/reinforced, +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/storage/box/ammo/beanbags, +/obj/item/ammo_magazine/rifle/practice, +/obj/item/ammo_magazine/rifle/practice, +/obj/item/ammo_magazine/rifle/practice, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Vc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Vd" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Vk" = ( +/obj/machinery/door/airlock/glass/medical{ + autoset_access = 0; + name = "Cryogenics airlock" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/cryo) +"Vr" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"Vs" = ( +/obj/machinery/door/airlock/external/glass{ + locked = 1; + id_tag = "l2_central_south_airlock_exterior"; + autoset_access = 0 + }, +/obj/machinery/button/access/interior{ + id_tag = "l2_central_south_airlock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Vt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Vu" = ( +/obj/machinery/status_display{ + pixel_x = 32; + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"Vx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"VE" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hydro) +"VL" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"VR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"VU" = ( +/obj/structure/rack, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/obj/item/clothing/mask/horsehead, +/obj/item/storage/wallet/random{ + pixel_z = -11 + }, +/obj/item/classic_baton{ + pixel_w = -7 + }, +/obj/item/clothing/suit/armor/bulletproof, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Wa" = ( +/obj/structure/table/woodentable, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/obj/structure/sign/warning/smoking{ + pixel_x = 32; + dir = 8 + }, +/turf/simulated/floor/carpet, +/area/ministation/hall/w2) +"Wb" = ( +/turf/simulated/wall, +/area/ministation/cryo) +"Wd" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l2centrals) +"Wf" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/open, +/area/ministation/maint/sebypass) +"Wi" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Wj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Wl" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/turf/simulated/floor/wood, +/area/ministation/detective) +"Wo" = ( +/obj/structure/stairs/long/east, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"Wr" = ( +/obj/structure/rack, +/obj/item/shield/riot, +/obj/item/shield/riot, +/obj/item/clothing/suit/armor/reactive, +/obj/item/storage/box/ammo/beanbags, +/obj/item/storage/box/ammo/beanbags, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"WC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"WL" = ( +/obj/machinery/smartfridge/drying_rack, +/turf/simulated/floor/plating, +/area/ministation/maint/hydromaint) +"WN" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/turf/simulated/floor/carpet/blue3, +/area/ministation/security) +"WQ" = ( +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"WW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"WY" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"WZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/effect/floor_decal/corner/paleblue{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"Xl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"Xm" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Xq" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 10 + }, +/obj/structure/sign/department/chemistry{ + pixel_x = 32; + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/hall/e2) +"Xr" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/sign/warning/armory{ + pixel_x = -32; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Xs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Xw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"XA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"XK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/ss13/l14, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) +"XY" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/blast/shutters{ + name = "security shutter"; + id_tag = "secshut" + }, +/turf/simulated/floor/plating, +/area/ministation/security) +"Yj" = ( +/obj/machinery/computer/prisoner{ + dir = 4 + }, +/obj/machinery/button/blast_door{ + id_tag = "secshut"; + name = "security shutter button"; + pixel_y = -32; + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"Yn" = ( +/obj/machinery/door/airlock{ + name = "Cryo A" + }, +/turf/simulated/floor/plating, +/area/ministation/arrival) +"Yv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_x = 32; + pixel_y = 25 + }, +/obj/structure/sign/directions/security{ + dir = 4; + pixel_x = 32; + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8; + icon_state = "warningcorner" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/e2) +"YU" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/security) +"YY" = ( +/obj/item/radio/intercom{ + name = "Common Channel"; + pixel_y = 20 + }, +/obj/structure/table, +/obj/item/storage/firstaid/o2{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/o2{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"Zb" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/space, +/area/ministation/hall/w2) +"Zh" = ( +/obj/machinery/vending/cigarette, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/dark, +/area/ministation/cafe) +"Zm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hop) +"Zr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/security) +"Zz" = ( +/obj/machinery/hologram/holopad, +/turf/simulated/floor/tiled/white, +/area/ministation/medical) +"ZK" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 32 + }, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/cryo) +"ZR" = ( +/obj/machinery/vending/coffee{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/w2) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +NO +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(45,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(47,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(48,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(53,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(54,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(55,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(56,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(57,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(58,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(59,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(60,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(61,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(62,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +af +aa +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(63,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(64,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(65,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(66,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(67,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(68,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(69,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(70,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +ab +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(71,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(72,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(73,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(74,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(75,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(76,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(77,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(78,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(79,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(80,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(81,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(82,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(83,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(84,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(85,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(86,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(87,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(88,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(89,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(90,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(91,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(92,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +ad +rt +PN +kZ +ad +ad +ad +rt +PN +kZ +PN +rt +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(93,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +ad +rt +PY +kZ +ad +ad +ad +rt +Nu +kZ +Bj +rt +aa +aa +aa +ad +aa +aa +aa +aa +aa +aa +mG +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +Ev +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(94,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +ad +rt +Qp +kZ +ad +ad +ad +rt +Qp +kZ +Qp +rt +aa +aa +aa +kZ +cr +cr +kZ +kZ +kZ +kZ +UZ +UZ +UZ +UZ +ed +Ob +Pf +Rk +Rk +Rk +VL +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(95,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +kZ +ad +Zb +Qp +kZ +ad +ad +ad +Zb +Qp +kZ +Qp +Zb +aa +ad +aa +kZ +uB +aV +vO +CU +mO +Uz +IA +ed +Ob +Sx +ed +ed +Yn +ed +ed +ed +ds +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(96,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +kZ +rt +OT +rt +kZ +cr +kZ +rt +OT +rt +OT +rt +aa +ad +kZ +kZ +uC +aV +vP +kZ +kZ +kZ +UZ +UZ +Pf +Pf +Pf +Ie +Pf +cf +cf +cf +cq +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(97,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +lI +mh +Ry +jA +nx +oH +rc +mh +Ry +jA +rW +kZ +aa +ad +kZ +aV +aV +GZ +GZ +aV +xf +rt +aa +SD +ed +ed +Pf +ed +Pf +Pf +Pf +Pf +Pf +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +EA +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(98,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cr +aH +hi +mR +GZ +aV +aV +aV +aV +mR +rm +rX +kZ +kZ +kZ +kZ +aV +aV +aV +aV +aV +xf +rt +aa +SD +LN +UN +Pf +SK +Pf +ed +ed +ed +ed +UZ +xY +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(99,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cr +hm +fe +Bz +Ca +HJ +HJ +HJ +HJ +rE +rn +md +aV +aV +te +aV +aV +aV +aV +aV +aV +dE +rt +aa +SD +ed +ed +hj +ed +ih +ed +ed +iR +ed +UZ +xY +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(100,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +Bv +Sq +aV +in +Gg +Ea +Ea +pY +Ea +ro +MY +Ea +Ea +tf +BH +tW +aV +aV +aV +aV +ZR +rt +aa +SD +ed +ed +Pf +ed +Pf +Pf +Pf +Pf +Pf +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(101,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +kC +bo +zy +Ov +NZ +nC +nC +nC +nC +rp +TD +ss +nC +tg +SF +tX +kX +vb +jZ +kZ +kZ +kZ +UZ +UZ +Pf +Pf +Pf +Ie +Pf +Rk +Rk +Rk +cq +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(102,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +kZ +em +aV +md +md +RW +Iz +yD +HJ +HJ +ey +fr +st +uD +th +ud +tY +uD +Lm +vP +CU +xK +Uz +IA +ed +iR +Sx +ed +ed +cU +ed +ed +ed +ds +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(103,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +mq +kZ +tM +kZ +tM +tM +xO +tM +tM +kZ +FZ +Pd +Ec +rn +aV +ti +Nq +tq +aV +aV +vP +kZ +kZ +kZ +UZ +UZ +UZ +UZ +ed +iR +Pf +cf +cf +cf +eo +UZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(104,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +cg +HO +HO +HO +mq +zM +nF +Gx +hO +NU +sg +Pk +mi +kZ +Ei +Bk +Ec +rn +aV +tj +tP +ua +aV +aV +aV +kZ +aa +aa +Iw +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +UZ +Ev +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(105,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +IB +cN +er +Eg +UL +qg +JJ +Io +kZ +CV +Ec +Ec +SV +nD +yS +ln +hS +kI +uc +dQ +kZ +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +aa +aa +ad +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(106,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +mq +mq +mq +mq +mq +mq +mq +mq +pw +uK +aG +mf +dd +ez +Td +dd +kZ +Wa +qF +dc +RQ +aV +bI +XK +RW +SX +uI +vS +uI +uI +uI +uI +uI +uI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(107,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +dd +dd +dd +dd +pl +dd +ir +dd +PL +dd +dd +dd +mq +mq +mq +kZ +kZ +kZ +kZ +su +aV +Nz +ze +aR +on +uI +vT +eg +rD +xJ +yl +MA +uI +qf +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(108,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +Co +mq +mq +mq +mq +mq +mq +mq +Lt +dd +dd +dd +dd +dd +pl +dd +dd +dd +dd +kZ +Kr +GZ +aV +aV +aR +on +ve +vU +Ez +wF +Np +gT +hu +Gz +Wd +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(109,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +mq +HO +HO +HO +HO +HO +mq +mq +mq +mq +mq +mq +mq +mq +mq +mq +mq +Co +kZ +sv +aV +aV +aV +lL +on +vf +vV +Zm +kB +xJ +cA +Ds +uI +Wd +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(110,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +mq +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +DI +aa +aa +mq +dd +kZ +Ak +hl +zG +hl +GR +Cb +fu +uG +MK +fd +uI +uI +uI +uI +Wd +qf +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(111,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +mq +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +mq +dd +kZ +Kr +wx +sp +WQ +ns +uI +uI +EM +fZ +wF +rU +uI +aU +Dn +Wd +qf +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(112,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +mq +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +mq +mq +mq +mq +dd +kZ +Kr +wx +sp +WQ +aR +uI +IP +HM +fZ +wF +yV +uI +cv +Wd +JX +qf +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(113,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +mq +HO +HO +HO +HO +HO +HO +aa +HO +HO +HO +HO +HO +mq +ER +or +at +BT +kZ +lH +wx +BW +bJ +aR +uI +Ir +ye +jF +Dw +uI +uI +xj +HR +qf +qf +qf +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(114,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +dd +mq +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +mq +mq +mq +mq +jy +kZ +Kr +wx +BW +WQ +aR +uI +SW +AB +Vr +MU +uI +Fn +xj +Wd +DJ +ph +qf +qf +qf +qf +qf +qf +qf +qf +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(115,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +mq +mq +mq +Co +mq +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +mq +mq +zM +bw +Gx +qk +eb +mq +Kr +Ug +sp +WQ +sG +uI +uI +uI +uI +uI +uI +QE +xj +Oc +qf +qf +qf +Wd +Wd +Wd +Dn +Wd +Wd +wr +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(116,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +mq +bs +dd +dd +mq +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +bG +at +cE +QK +Nm +iq +lN +lB +LI +bN +WW +bN +QN +Hn +An +cm +An +SB +An +An +zl +Wd +DJ +Wd +Dn +Wd +qf +qf +qf +qf +qf +qf +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(117,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +mq +mq +mq +mq +mq +cg +HO +HO +HO +HO +HO +HO +HO +HO +mq +mq +mq +np +mq +Co +dd +Jm +mq +PH +aV +aV +aV +iN +kZ +Wd +qf +qf +qf +qf +Qs +DF +Wd +qf +qf +qf +qf +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(118,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +fx +PX +mq +mq +ir +mq +kZ +PI +aV +aV +GZ +jO +kZ +Wd +qf +qf +qf +qf +qf +qf +qf +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(119,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +qL +kZ +mc +qN +cH +kZ +PI +GZ +aV +aV +Sq +kZ +Wd +DJ +Dn +wr +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(120,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +mq +lo +kZ +NC +Sy +aV +kZ +As +Ea +Ea +Ea +ue +ex +BG +qf +qf +qf +qf +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(121,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +ps +NC +dK +Wo +kZ +PI +aV +aV +aV +Sq +kZ +vm +qf +qf +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +cg +aa +aa +aa +aa +aa +aa +HO +HO +bu +bu +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(122,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +kZ +MQ +ry +kZ +kZ +PI +aV +aV +GZ +Sq +kZ +vn +Dn +qf +HO +HO +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +HO +HO +bu +LH +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(123,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +kZ +kZ +kZ +zA +kZ +kZ +sB +Mb +Mb +Mb +ug +kZ +tm +Wd +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +Ck +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(124,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +rt +al +RZ +aV +oX +ty +OW +zv +TO +tt +Nh +kZ +gp +Wd +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +Ck +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(125,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cg +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +rt +pu +aV +aV +oX +ty +Xl +gz +gz +gz +ML +kZ +sI +FQ +qf +Ij +Ij +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +Ck +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(126,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +rt +pf +zZ +Ci +MG +VR +dN +gz +tv +gz +ML +DJ +Wd +xz +nK +Ix +rC +Vs +HO +HO +HO +HO +HO +cg +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +iK +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(127,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +rt +qe +Qj +lR +oX +ty +sC +gz +gz +gz +PR +mH +kr +Ib +qf +Ij +Ij +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +Ck +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(128,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +rt +qe +qe +rA +oX +ty +Yv +AX +NR +AX +ui +mH +Wd +qf +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +Ck +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(129,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +rt +rt +rt +rt +rt +mH +sD +tx +tx +tx +sh +mH +Wd +qf +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +bu +Ck +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(130,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +cY +cY +cY +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +mH +RB +ty +ty +ty +sM +mH +AR +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +bu +LH +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(131,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +kh +dr +cY +cY +cY +cY +cY +cY +cY +cY +aa +aa +aa +ab +aa +la +RB +ty +ty +ty +sM +mH +Jt +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +bu +bu +bu +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(132,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +lF +lF +lF +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +az +dr +dr +cY +OK +un +Gb +kv +oW +cY +aa +aa +aa +aa +aa +la +hH +QF +ol +QF +dU +Sl +zl +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(133,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +lF +yk +lF +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +KH +dr +dr +cY +UY +BA +hZ +Ig +ax +cY +aa +aa +aa +aa +aa +la +RB +ty +ty +ty +yN +mH +qf +qf +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(134,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +lF +lF +lF +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +nu +dr +dr +cY +cY +cY +cY +Zr +pA +cY +cY +cY +cY +aa +aa +mH +TS +ty +ty +ty +Om +mH +aa +DI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(135,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +Bs +dr +dr +cY +zq +WN +hZ +Ne +fy +cY +DH +Jc +cY +cY +cY +cY +RB +wD +ty +ty +sM +la +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(136,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +by +dr +dr +cY +HX +Ow +CO +tl +oj +mz +pd +bp +IT +qX +Yj +cY +RB +ty +ty +wD +sM +la +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(137,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +DY +dr +dr +cY +cY +cY +cY +cY +cY +cY +Ut +QR +Wi +iz +ix +QL +nB +ty +ty +ty +sM +la +aa +ED +ED +ED +ED +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(138,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +KG +dr +dr +eK +dW +Wr +EV +nS +VU +cY +hw +EE +hX +iy +jd +XY +tU +ty +ty +ty +uH +mH +ED +ED +Rd +Rd +BE +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(139,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +cY +cY +cY +cY +cY +cY +YU +dr +dr +Nv +dr +cY +hx +MH +hY +QR +je +cY +RB +wD +ty +OY +Jx +bj +aL +BE +zn +xe +Hd +bj +bj +bj +bj +bj +bj +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(140,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +Ft +dr +Wi +kE +Me +cY +cY +cY +cY +cY +KV +cY +da +da +hZ +TV +da +cY +JH +ty +ty +OY +Sp +bj +Zh +BE +JQ +JQ +BE +ub +bj +Sw +wt +fD +bj +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(141,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +Ft +dr +hQ +oZ +Ou +vi +ya +Ou +FL +NE +Op +Xr +ha +No +Vt +gX +jg +Oq +ly +qI +qI +Jz +mJ +bj +vF +wk +BE +wk +xZ +FJ +bj +bU +mj +mw +bj +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(142,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +Ft +dr +LY +TT +dr +mk +dr +dr +Vc +dr +Po +gC +hb +hz +ia +iA +jh +Xs +aD +ty +ty +OY +Jx +bj +vG +BE +iH +iH +BE +Bw +bj +wL +et +Qk +bj +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(143,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +Ft +dr +eZ +PU +dr +Vb +dr +dr +no +cY +Vd +gD +hc +da +ew +iB +WY +cY +sU +QF +tz +OY +uu +bj +vt +xQ +wO +xo +xQ +yu +bj +zC +bj +bj +bj +bj +bj +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(144,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +cY +cY +cY +cY +cY +cY +qS +qS +Rx +Rx +cY +Qm +dr +eZ +da +gb +dr +eZ +cY +sV +qI +tA +qI +uv +uL +vu +ND +wP +xp +ND +yv +bj +zD +tS +At +Aw +vr +bj +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(145,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +cg +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +Rx +fF +cY +Js +gE +hd +da +gc +iD +hd +cY +sW +uq +Sg +uq +AG +uM +BE +BE +iH +xq +BE +yw +zf +zE +Ae +zF +zF +zF +ED +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(146,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +DI +Rx +jW +cY +cY +cY +cY +cY +cY +cY +cY +cY +jH +iY +kM +iY +OH +uN +vw +wl +vw +wl +xR +yx +qB +zF +Af +zF +zF +Lr +ED +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(147,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +ef +bA +ob +oB +Am +Ip +Am +Am +Am +DG +zg +ty +Xw +OY +Nf +bj +vv +BE +BE +BE +xS +IX +qB +zF +Ag +zF +zF +Dj +bj +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(148,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +ef +zo +Rx +Rx +JZ +JZ +JZ +JZ +JZ +JZ +lw +ty +Xw +OY +ge +bj +BE +wm +wm +wm +xT +yy +bj +zH +br +Jd +Av +TX +bj +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +jU +jU +jU +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(149,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +oc +db +JZ +HF +mp +KW +DC +KK +Wl +JZ +sN +wD +Gy +OY +iv +bj +bj +wn +wQ +xs +xU +xW +bj +zI +Rw +Ay +bj +Sa +Sa +Sa +Sa +Sa +Sa +Sa +Sa +HO +HO +HO +HO +HO +jU +Wf +jU +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(150,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +od +zo +TB +aW +aW +HP +Jo +HP +gJ +zW +yC +iW +gB +wE +Kv +bj +vy +wo +wR +wR +xV +yA +bj +zJ +Ai +QO +BJ +Ga +ib +mW +ib +Mp +ib +RK +Sa +HO +HO +HO +HO +HO +jU +jU +jU +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(151,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +oD +nX +JZ +bx +vq +hC +id +iG +jk +JZ +lw +ty +Xw +OY +Kz +bj +vz +wp +wp +wp +wp +aB +zh +zK +Ah +HN +bj +rq +WL +Sa +Sa +Sa +Sa +Sa +Sa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(152,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +Rx +Rx +zo +JZ +Rx +Rx +Rx +JZ +JZ +JZ +JZ +lw +ty +Xw +ty +Wj +bj +vA +jS +wS +xt +wq +yB +bj +zF +Aj +AA +bj +OF +Ax +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(153,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +oE +Am +Am +UB +ul +ef +Kd +mH +mH +sP +ty +Xw +ty +um +bj +bj +bj +bj +bj +bj +dZ +bj +zL +bj +bj +bj +dS +Tr +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(154,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Rx +Rx +Rx +Rx +oz +oz +jW +oz +oz +wc +sQ +qI +tD +aj +up +tL +dq +is +Au +lQ +qM +yM +KN +EL +ct +gL +eH +AK +NX +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(155,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +Fr +RU +pD +FF +oz +UW +lw +ty +Xw +ty +um +Sd +OV +if +qT +wN +qT +tT +xy +cd +zQ +zQ +Sa +yn +WC +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(156,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +pU +pe +oF +jR +lJ +oz +BS +lw +ty +tE +ty +um +jV +Im +MW +Ru +uJ +Ru +Rp +ws +hv +zQ +ad +Sa +Sa +Bm +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(157,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +pU +pe +pF +qn +qZ +oz +oz +lw +ty +Xw +ty +um +jV +vE +wu +wW +xx +wW +yE +ws +zO +zQ +ad +aa +Sa +TW +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(158,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +ae +pF +qo +qY +rI +oz +uP +qI +tG +wD +um +jV +OV +Vu +oY +CL +VE +yF +zj +zP +zQ +aa +aa +Sa +pb +Sa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(159,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +oz +pG +qp +qY +pe +oz +fC +sS +tH +Hi +us +fY +oz +oz +oz +vp +oz +oz +yf +zQ +zQ +aa +aa +ad +pr +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(160,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pH +qq +ra +rJ +si +KX +tJ +tI +tJ +ut +LT +kS +HL +UC +fw +mC +oz +aa +aa +Uw +ad +aa +aa +ad +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(161,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pI +qr +rb +rK +sj +WZ +Gd +Ls +Gd +Gd +Xq +oA +hh +pD +pD +Pw +vK +aa +aa +aa +ad +aa +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(162,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pJ +hr +qs +oz +oz +ov +Nj +iE +ON +Hy +oz +oz +wy +pD +pD +yb +vK +ad +aa +aa +ad +aa +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(163,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pK +qt +rd +rL +sk +bQ +so +hA +so +cQ +oz +vH +wz +qw +xA +yc +vK +ad +ad +ad +ad +ad +ad +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(164,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pL +qu +re +rL +sk +js +pD +zd +Zz +Gu +oz +jT +pe +wY +xB +yY +oz +aa +aa +aa +aa +aa +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(165,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pM +qu +pD +rM +oz +CD +pU +tN +pU +pU +oz +oz +wA +Fo +xC +rQ +oz +Wb +RD +RD +RD +RD +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(166,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pN +qv +rN +rf +Az +Jl +rf +Tj +rf +rf +uV +rf +rf +rN +xD +Cu +tZ +Wb +CP +Hz +gS +RD +aa +ad +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(167,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pO +qw +rg +rO +rO +Be +LE +Pj +Uv +Uv +XA +Uv +XA +bB +xE +PS +DD +Vk +AD +hs +qO +RD +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(168,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +CJ +pD +rh +rP +sm +qA +Vx +aA +pD +ux +tO +vJ +wC +wZ +pD +wB +AJ +Wb +ZK +EG +Mw +RD +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(169,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +oz +oz +oz +vK +nf +vK +oz +oz +UJ +aA +QC +oz +oz +oz +oz +xa +oz +Qh +vK +Wb +RD +RD +RH +RD +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(170,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pP +sn +eV +pD +ri +pD +yG +oz +sX +aA +ta +oz +uy +uZ +gU +xb +oz +yg +ii +zt +km +oz +aa +aa +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(171,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +oz +pQ +qz +qw +qw +rj +pD +sY +oz +sX +aA +pD +oz +uy +uZ +uX +xF +oz +Va +uW +pD +OL +vK +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(172,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pR +qA +rk +rR +sq +pD +mL +oz +HG +aA +pD +oz +uy +uZ +Pz +vM +oz +xc +uW +pD +SA +vK +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(173,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pS +pD +pD +pD +Vx +pD +ta +oz +oz +vL +Cx +oz +uy +uZ +uZ +vN +oz +Ge +qA +pD +yJ +vK +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(174,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +pT +kR +Xm +rS +Md +pD +tb +oz +ww +Mu +bv +oz +oz +pU +pU +oz +oz +YY +xH +yh +yK +oz +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(175,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +oz +oz +oz +oz +vK +vK +vK +oz +xd +Qz +qy +oz +aa +aa +aa +aa +oz +oz +vK +vK +oz +oz +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(176,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +aa +aa +aa +aa +aa +aa +aa +oz +Kk +bH +oS +Cx +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(177,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +oz +ar +Ts +oz +oz +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(178,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +DI +oz +Cx +Cx +oz +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(179,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(180,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(181,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(182,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(183,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(184,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(185,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(186,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(187,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(188,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(189,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(190,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(191,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(192,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(193,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(194,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(195,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(196,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(197,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HO +HO +HO +HO +HO +HO +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(198,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(199,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(200,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(201,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(202,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(203,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(204,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(205,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(206,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(207,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(208,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(209,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(210,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(211,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(212,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(213,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(214,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(215,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(216,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(217,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(218,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(219,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(220,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(221,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(222,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(223,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(224,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(225,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(226,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(227,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(228,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(229,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(230,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(231,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(232,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(233,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(234,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(235,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(236,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(237,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(238,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(239,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(240,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(241,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(242,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(243,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(244,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(245,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(246,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(247,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(248,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(249,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(250,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(251,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(252,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(253,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(254,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(255,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm new file mode 100644 index 00000000000..c23f66a8cc6 --- /dev/null +++ b/maps/ministation/ministation-2.dmm @@ -0,0 +1,72834 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/obj/abstract/landmark{ + name = "carpspawn" + }, +/turf/space, +/area/space) +"ad" = ( +/obj/structure/lattice, +/turf/space, +/area/space) +"ae" = ( +/turf/simulated/wall, +/area/ministation/science) +"af" = ( +/turf/exterior/wall/random/ministation, +/area/space) +"ah" = ( +/turf/simulated/wall, +/area/ministation/bridge) +"am" = ( +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/item/assembly/timer, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler, +/obj/item/multitool, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ao" = ( +/obj/structure/table/reinforced, +/obj/machinery/faxmachine/mapped, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ap" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"aq" = ( +/obj/machinery/photocopier, +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"ar" = ( +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"as" = ( +/obj/machinery/computer/modular/preset/security, +/obj/effect/floor_decal/corner/red/full, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"av" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"aw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor, +/area/ministation/science) +"ax" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/computer/modular/preset/cardslot/command, +/obj/effect/floor_decal/corner/blue/full, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ay" = ( +/obj/effect/floor_decal/corner/white/full, +/obj/machinery/computer/modular/preset/medical, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"az" = ( +/obj/effect/floor_decal/corner/yellow/full, +/obj/machinery/computer/ship/sensors{ + id_tag = "stationsensors" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aA" = ( +/obj/abstract/landmark{ + name = "carpspawn" + }, +/turf/simulated/floor/reinforced/airless, +/area/space) +"aB" = ( +/obj/structure/table/reinforced, +/obj/item/folder/envelope/nuke_instructions, +/obj/item/documents/corporate/account, +/obj/item/documents/corporate/personnel, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aC" = ( +/obj/structure/table/reinforced, +/obj/item/radio, +/obj/item/radio/beacon, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aD" = ( +/turf/simulated/wall/r_wall, +/area/ministation/bridge) +"aF" = ( +/obj/structure/glass_tank/aquarium, +/mob/living/simple_animal/aquatic/fish, +/mob/living/simple_animal/aquatic/fish, +/mob/living/simple_animal/aquatic/fish, +/mob/living/simple_animal/aquatic/fish, +/mob/living/simple_animal/aquatic/fish, +/mob/living/simple_animal/aquatic/fish/grump, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aI" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aJ" = ( +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aK" = ( +/obj/effect/floor_decal/corner/red{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aO" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aP" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/item/storage/toolbox/emergency, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aQ" = ( +/obj/structure/displaycase, +/obj/item/sword/replica/officersword, +/obj/machinery/status_display{ + pixel_y = 30 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aR" = ( +/obj/structure/bed, +/obj/item/bedsheet/captain, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/curtain/open/bed, +/turf/simulated/floor/carpet/red, +/area/ministation/bridge) +"aT" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/bridge) +"aU" = ( +/obj/structure/table/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/window/reinforced, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/button/blast_door{ + id_tag = "slimeblast3"; + name = "Enclosure 3 Blastdoors Button"; + directional_offset = null; + dir = 8 + }, +/obj/machinery/camera/network/research, +/turf/simulated/floor/tiled, +/area/ministation/science) +"aV" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"aW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/alternate/door/bolts{ + id_tag = "vaultbolt"; + name = "Vault Deadbolt Button"; + pixel_y = 27 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/bridge) +"aX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command{ + autoset_access = 0; + req_access = list("ACCESS_CAPTAIN"); + name = "Captain's Dormitory" + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/ministation/bridge) +"aY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"aZ" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/camera/network/research, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ba" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bb" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/megaphone, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/reinforced, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/radio/intercom{ + pixel_y = -1; + directional_offset = null + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"be" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bf" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bg" = ( +/turf/simulated/wall/r_wall, +/area/ministation/bridge/vault) +"bi" = ( +/obj/structure/filing_cabinet, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge/vault) +"bl" = ( +/turf/simulated/wall/r_wall, +/area/ministation/telecomms) +"bn" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Vault APC"; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/bluegrid, +/area/ministation/bridge/vault) +"bo" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/closet/l3closet/scientist, +/obj/effect/floor_decal/corner/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"bp" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/bluegrid, +/area/ministation/bridge/vault) +"bq" = ( +/turf/simulated/floor/bluegrid, +/area/ministation/bridge/vault) +"br" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/bridge) +"bs" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/bridge) +"bt" = ( +/obj/item/flashlight/lamp/green, +/obj/structure/table/woodentable/mahogany, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/item/gun/launcher/crossbow, +/obj/item/arrow, +/obj/item/arrow, +/obj/item/cell/crap, +/obj/item/mollusc/clam, +/turf/simulated/floor/wood/walnut, +/area/ministation/bridge) +"bu" = ( +/obj/machinery/shipsensors{ + id_tag = "stationsensors" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/airless, +/area/ministation/maint/l3sw) +"bv" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -29; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bw" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bx" = ( +/obj/structure/table/reinforced, +/obj/item/storage/secure/briefcase, +/obj/item/flash, +/obj/item/flash, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"by" = ( +/obj/structure/closet, +/obj/item/stack/material/ingot/mapped/gold, +/obj/item/stack/material/ingot/mapped/gold, +/obj/item/stack/material/ingot/mapped/gold, +/obj/item/storage/belt/champion, +/turf/simulated/floor/tiled, +/area/ministation/bridge/vault) +"bz" = ( +/obj/abstract/landmark/start{ + name = "Captain" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/bed/chair/comfy/captain, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bA" = ( +/obj/structure/table/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/blast_door{ + id_tag = "bridgeblast"; + dir = 8; + pixel_y = -2; + directional_offset = null + }, +/obj/machinery/button/blast_door{ + id_tag = "sensor"; + name = "Sensor Shroud"; + pixel_y = 8; + dir = 8; + directional_offset = null + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/vault/bolted{ + autoset_access = 0; + id_tag = "vaultbolt"; + req_access = list("ACCESS_VAULT") + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge/vault) +"bE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge/vault) +"bF" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/bluegrid, +/area/ministation/bridge/vault) +"bG" = ( +/obj/structure/closet/secure_closet/captains, +/obj/item/storage/belt/holster, +/turf/simulated/floor/carpet/red, +/area/ministation/bridge) +"bH" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/bed/chair/comfy/captain{ + dir = 4 + }, +/obj/machinery/camera/network/command{ + dir = 1; + initial_access = null + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/bridge) +"bI" = ( +/obj/structure/table/woodentable/mahogany, +/obj/item/modular_computer/tablet/lease/preset/command, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/bridge) +"bK" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/hologram/holopad/longrange, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bO" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bR" = ( +/obj/machinery/nuclearbomb/station{ + pixel_y = 2 + }, +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/dark/monotile, +/area/ministation/bridge/vault) +"bT" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/item/ammo_magazine/rifle/practice, +/obj/item/ammo_magazine/rifle/practice, +/obj/item/ammo_magazine/rifle/practice, +/obj/item/ammo_magazine/rifle/practice, +/obj/item/ammo_magazine/rifle/practice, +/turf/simulated/floor/tiled, +/area/ministation/bridge/vault) +"bV" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/camera/network/command{ + dir = 1; + initial_access = null + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bW" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/obj/structure/sign/department/bridge{ + dir = 4; + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"bX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"bZ" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ca" = ( +/obj/machinery/newscaster{ + pixel_y = -28; + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"cg" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning/corner{ + icon_state = "warningcorner" + }, +/turf/simulated/open, +/area/ministation/hall/n3) +"ch" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ci" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/glass/command, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"cn" = ( +/turf/simulated/floor/airless, +/area/space) +"co" = ( +/turf/simulated/wall/r_wall, +/area/ministation/company_rep) +"cp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"cr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"cs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ct" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"cu" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/plating, +/area/ministation/bridge) +"cw" = ( +/turf/simulated/floor/reinforced/airless, +/area/space) +"cx" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"cD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"cE" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/high_voltage{ + pixel_y = -32; + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"cF" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"cI" = ( +/obj/structure/closet/secure_closet{ + closet_appearance = /decl/closet_appearance/secure_closet/rd; + req_access = list("ACCESS_RESEARCH"); + name = "Science locker" + }, +/obj/item/storage/med_pouch/trauma, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/twohanded/spear/diamond, +/obj/item/shield/buckler, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"cJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"cL" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/science) +"cN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/wall, +/area/ministation/science) +"cP" = ( +/obj/machinery/network/acl{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"cU" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"cV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"cW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"cX" = ( +/obj/structure/rack, +/obj/random/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"da" = ( +/obj/structure/window/basic/full, +/turf/simulated/floor/plating, +/area/ministation/library) +"db" = ( +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"dc" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular/open{ + id_tag = "slimeblast3"; + name = "enclosure 3 blast door" + }, +/turf/simulated/floor, +/area/ministation/science) +"dd" = ( +/turf/simulated/floor, +/area/ministation/science) +"de" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"di" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"dn" = ( +/obj/structure/table/woodentable_reinforced/walnut, +/obj/item/paper_bin, +/obj/item/pen/retractable, +/turf/simulated/floor/carpet/red, +/area/ministation/court) +"dq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"dr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/glass/command{ + name = "Bridge" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"dt" = ( +/obj/machinery/button/blast_door{ + id_tag = "mech"; + name = "Mech Bay Door Control"; + pixel_x = -24; + pixel_y = 2; + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"du" = ( +/mob/living/slime, +/turf/simulated/floor, +/area/ministation/science) +"dv" = ( +/obj/machinery/cryopod/robot, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"dw" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"dx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"dy" = ( +/obj/machinery/door/window/westleft, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"dz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/window/eastleft, +/obj/machinery/door/blast/regular/open{ + id_tag = "slimeblast3"; + name = "enclosure 3 blast door" + }, +/turf/simulated/floor, +/area/ministation/science) +"dA" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor, +/area/ministation/science) +"dE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"dQ" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/pen, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"dS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/filth, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"dT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/random/trash, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"dX" = ( +/obj/machinery/papershredder, +/turf/simulated/floor/tiled, +/area/ministation/court) +"dY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/court) +"dZ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"eb" = ( +/obj/machinery/mech_recharger, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"ec" = ( +/obj/machinery/door/airlock/science, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"ee" = ( +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"ef" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"eg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular/open{ + id_tag = "slimeblast3"; + name = "enclosure 3 blast door" + }, +/turf/simulated/floor, +/area/ministation/science) +"eh" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/simulated/floor, +/area/ministation/science) +"ei" = ( +/obj/effect/wallframe_spawn/reinforced/titanium, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"es" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"et" = ( +/obj/structure/closet/wardrobe/lawyer_black, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"ey" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"eA" = ( +/obj/machinery/computer/shuttle_control/explore/ministation{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"eB" = ( +/obj/structure/table, +/obj/machinery/faxmachine/mapped, +/turf/simulated/floor/tiled, +/area/ministation/court) +"eD" = ( +/obj/machinery/recharge_station, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"eF" = ( +/obj/structure/fireaxecabinet{ + pixel_x = 32; + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"eH" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "science_airlock_exterior" + }, +/obj/machinery/button/access/interior{ + id_tag = "ministation_science_dock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/airless, +/area/ministation/science) +"eM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"eO" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"eP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"eV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"eW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"eX" = ( +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"eY" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"eZ" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"fb" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"fc" = ( +/obj/structure/closet/secure_closet/scientist, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"fd" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/optable, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"fe" = ( +/obj/machinery/computer/operating, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ff" = ( +/obj/structure/table, +/obj/item/scalpel{ + pixel_y = 15 + }, +/obj/item/circular_saw, +/obj/machinery/camera/network/research, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"fg" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"fh" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"fi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"fk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"fl" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"fz" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"fA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/abstract/landmark{ + name = "lightsout" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"fJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"fK" = ( +/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"fN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"fU" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"fV" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/floor_decal/corner/black/border{ + dir = 4; + pixel_x = 1 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"fZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"gd" = ( +/obj/machinery/destructive_analyzer{ + initial_network_id = "molluscnet" + }, +/obj/machinery/camera/network/research, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"ge" = ( +/obj/machinery/computer/shuttle_control/explore/ministation{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gf" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gg" = ( +/obj/abstract/landmark/start{ + name = "Scientist" + }, +/obj/item/stool/padded, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gh" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gi" = ( +/obj/machinery/smartfridge/secure/extract, +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gn" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"gp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"gy" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"gF" = ( +/obj/item/mollusc/barnacle{ + pixel_x = -13; + pixel_y = -14 + }, +/turf/simulated/floor/reinforced/airless, +/area/space) +"gG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/purple{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/purple, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/sign/department/xenobio_3{ + pixel_x = 32; + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gI" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gJ" = ( +/obj/machinery/camera/network/research, +/obj/structure/table, +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"gK" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"gN" = ( +/obj/structure/bed/chair/shuttle/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"gQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"gR" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"gS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"gT" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"gU" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "pqm_airlock_interior" + }, +/obj/machinery/button/access/interior{ + id_tag = "pqm_airlock"; + name = "interior access button"; + pixel_x = 10; + pixel_y = 20 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"gV" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/bookcase/skill_books/random, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"he" = ( +/obj/structure/closet, +/obj/random/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"hf" = ( +/obj/machinery/fabricator/protolathe{ + initial_network_id = "molluscnet" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"hg" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"hh" = ( +/obj/machinery/fabricator/bioprinter{ + initial_network_id = "molluscnet" + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"hi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/sign/department/xenoarch{ + pixel_y = 30 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hj" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hl" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/simulated/floor/airless, +/area/ministation/shuttle/outgoing) +"hm" = ( +/obj/machinery/atmospherics/unary/vent_pump/siphon/on, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/science) +"hn" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/design_database{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/science) +"hv" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/library) +"hx" = ( +/obj/effect/floor_decal/industrial/warning, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"hy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/wall/titanium, +/area/ministation/shuttle/outgoing) +"hF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/table, +/obj/item/storage/box/syringes, +/obj/item/chems/glass/beaker/large, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hG" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hI" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/structure/table, +/obj/item/disk/tech_disk, +/obj/item/disk/tech_disk, +/obj/item/disk/design_disk, +/obj/item/stack/material/ingot/mapped/osmium/twentyfive, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hJ" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hK" = ( +/obj/structure/table, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/manipulator, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hL" = ( +/obj/structure/table, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"hM" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/science) +"hN" = ( +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 5 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/science) +"hO" = ( +/obj/machinery/atmospherics/pipe/manifold/visible{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/ministation/science) +"hS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"hV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"hY" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/turf/simulated/open, +/area/ministation/maint/l3nw) +"if" = ( +/obj/machinery/door/window/eastright, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/blast/shutters{ + name = "science shutters"; + id_tag = "scishut" + }, +/turf/simulated/floor/plating, +/area/ministation/science) +"ig" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ih" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ii" = ( +/obj/machinery/door/airlock/glass/science, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ik" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/hologram/holopad, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"im" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"in" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/obj/machinery/recharger, +/obj/structure/table, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"io" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/science) +"ip" = ( +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 9 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/science) +"iq" = ( +/obj/effect/decal/cleanable/filth, +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/court) +"iu" = ( +/obj/machinery/vending/cola{ + dir = 4; + pixel_x = -5 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"iC" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + name = "fuel pump" + }, +/obj/structure/handrail{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"iG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"iI" = ( +/obj/machinery/fabricator{ + initial_network_id = "molluscnet" + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"iJ" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"iK" = ( +/obj/machinery/fabricator/imprinter{ + initial_network_id = "molluscnet" + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"iL" = ( +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"iM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/hologram/holopad/longrange, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"iN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/industrial/loading{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"iO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"iP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock/glass/science{ + name = "Xenobiology" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"iQ" = ( +/obj/abstract/landmark/start{ + name = "Scientist" + }, +/obj/structure/bed/chair/office/light, +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"iR" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"iS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass/science, +/obj/machinery/atmospherics/pipe/simple/visible, +/turf/simulated/floor/tiled/dark, +/area/ministation/science) +"iT" = ( +/obj/machinery/atmospherics/pipe/manifold/visible, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"iZ" = ( +/obj/machinery/vending/coffee{ + dir = 4; + pixel_x = -5 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"jd" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/ministation/science) +"jm" = ( +/obj/machinery/door/blast/regular{ + id_tag = "sensor" + }, +/turf/simulated/floor/airless, +/area/ministation/maint/l3sw) +"jn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/item/wrench, +/obj/item/crowbar/red, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jo" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/glasses/science, +/obj/item/clothing/mask/gas/budget, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jp" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/purple, +/obj/structure/disposalpipe/junction/mirrored{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/purple{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"js" = ( +/obj/structure/table, +/obj/item/chems/glass/beaker/large, +/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/dropper, +/obj/effect/floor_decal/corner/purple{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jt" = ( +/obj/structure/table, +/obj/item/stock_parts/console_screen, +/obj/item/stock_parts/console_screen, +/obj/item/stock_parts/console_screen, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ju" = ( +/obj/structure/table, +/obj/item/clothing/glasses/welding, +/obj/item/stack/material/pane/mapped/glass/fifty, +/obj/item/stack/material/reinforced/mapped/fiberglass/fifty, +/obj/item/stack/material/sheet/mapped/steel/fifty, +/obj/item/stack/material/shiny/mapped/aluminium/fifty, +/obj/item/stack/material/ingot/mapped/copper/fifty, +/obj/machinery/camera/network/research{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jv" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jw" = ( +/obj/abstract/landmark{ + name = "blobstart" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jx" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jy" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"jL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"jM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 8 + }, +/obj/structure/sign/department/eva{ + pixel_y = -32; + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jN" = ( +/obj/effect/shuttle_landmark/bridge_north, +/turf/space, +/area/space) +"jP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass/science{ + name = "Research and Development/Robotics"; + req_access = list("ACCESS_XENOBIO"); + autoset_access = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"jR" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kg" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/hall/s3) +"kh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"ki" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"kk" = ( +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"kn" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ko" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/camera/network/research, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kp" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 5 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"kr" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"ks" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/purple{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ku" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kv" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kx" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ky" = ( +/obj/machinery/camera/network/research, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kz" = ( +/mob/living/simple_animal/cat/fluff/ran, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kG" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/obj/machinery/computer/design_console{ + dir = 4 + }, +/turf/simulated/floor/carpet/magenta, +/area/ministation/science) +"kP" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/airlock/glass/science{ + autoset_access = 0; + req_access = list("ACCESS_ROBOTICS") + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"kQ" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kR" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kT" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"kU" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kV" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"kW" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/shutters/open{ + name = "RD Shutter"; + id_tag = "RD1" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/science) +"lb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 1; + icon_state = "warningcorner" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"lh" = ( +/obj/structure/closet, +/obj/item/multitool, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"ll" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"lp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"ls" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"lv" = ( +/obj/structure/closet/emcloset, +/obj/effect/floor_decal/industrial/warning{ + dir = 10 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lw" = ( +/obj/structure/closet/firecloset, +/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lx" = ( +/obj/structure/closet/firecloset, +/obj/effect/floor_decal/industrial/warning{ + dir = 6 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lz" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"lA" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/effect/floor_decal/corner/purple, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lB" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/purple{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 8 + }, +/obj/structure/sign/department/xenoflora{ + pixel_y = -32; + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lF" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 4 + }, +/obj/machinery/camera/network/research, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"lG" = ( +/obj/machinery/door/blast/shutters{ + dir = 4; + id_tag = "mech"; + name = "Mech Bay" + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"lH" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"mf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass/science{ + name = "Xenobotony" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mk" = ( +/obj/effect/floor_decal/corner/red{ + dir = 5 + }, +/obj/structure/bed/chair/padded/blue{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ml" = ( +/obj/machinery/mass_driver{ + id_tag = "artifactlauncher"; + dir = 4 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"mm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"ms" = ( +/obj/machinery/atmospherics/unary/tank/air{ + start_pressure = 6000 + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"mA" = ( +/obj/machinery/seed_extractor, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mB" = ( +/obj/machinery/botany/editor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mC" = ( +/obj/machinery/botany/extractor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mD" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/biogenerator, +/obj/effect/floor_decal/corner/purple{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/purple{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mF" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/vending/hydronutrients, +/obj/effect/floor_decal/corner/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mG" = ( +/obj/structure/table, +/obj/item/scanner/gas, +/obj/item/wrench, +/obj/item/minihoe, +/obj/item/hatchet, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/camera/network/research, +/obj/item/wirecutters/clippers, +/obj/item/scanner/plant, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mH" = ( +/obj/machinery/atmospherics/portables_connector, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mJ" = ( +/turf/simulated/floor/reinforced, +/area/ministation/science) +"mK" = ( +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass, +/area/ministation/science) +"mN" = ( +/obj/machinery/door/airlock/glass/science{ + autoset_access = 0; + req_access = list("ACCESS_RESEARCH_DIRECTOR") + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"mU" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/bed/chair/shuttle/blue{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"mW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"mX" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"mY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"nj" = ( +/obj/machinery/camera/network/command{ + initial_access = null + }, +/turf/simulated/floor/bluegrid, +/area/ministation/bridge/vault) +"nl" = ( +/turf/simulated/wall, +/area/ministation/maint/l3ne) +"nr" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -29; + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/syringes, +/obj/item/storage/box/botanydisk, +/obj/item/chems/glass/beaker/large, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ns" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"nt" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"nu" = ( +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 5 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"nv" = ( +/obj/machinery/door/window/westleft, +/obj/machinery/door/window/eastleft, +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 4 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"nw" = ( +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"nz" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/mirrored{ + dir = 2 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"nA" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"nG" = ( +/turf/simulated/wall/titanium, +/area/ministation/shuttle/outgoing) +"nI" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "_East APC"; + pixel_x = 27; + pixel_y = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/alarm{ + pixel_y = -24; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/s3) +"nL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"nN" = ( +/obj/structure/ladder, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"nP" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"nQ" = ( +/obj/structure/lattice, +/turf/simulated/wall, +/area/ministation/maint/l3ne) +"nS" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"nW" = ( +/obj/structure/filing_cabinet, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"nX" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"nZ" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"ob" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"oc" = ( +/turf/simulated/wall, +/area/ministation/maint/l3se) +"od" = ( +/obj/machinery/computer/air_control{ + dir = 8; + id_tag = "xenobot"; + name = "Xenoflora Gas Monitor" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"oe" = ( +/obj/machinery/air_sensor{ + id_tag = "xenobot"; + name = "Xenoflora Gas Sensor" + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"of" = ( +/obj/machinery/commsrelay, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"og" = ( +/obj/machinery/door/airlock/glass/command{ + autoset_access = 0; + name = "Telecommunications glass airlock"; + req_access = list("ACCESS_TELECOMS") + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/turf/simulated/floor/holofloor/lino, +/area/ministation/telecomms) +"op" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"ot" = ( +/obj/structure/tank_rack/oxygen, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"oB" = ( +/obj/machinery/portable_atmospherics/hydroponics, +/obj/effect/floor_decal/corner/green/full, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"oC" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/chems/glass/bucket, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"oD" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor, +/area/ministation/science) +"oE" = ( +/obj/machinery/light, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"oF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/telecomms) +"oG" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/closet/crate, +/obj/item/stock_parts/circuitboard/telecomms_hub, +/obj/item/cell, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"oN" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"oP" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"oQ" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"oR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"oS" = ( +/obj/effect/floor_decal/corner/yellow/full, +/obj/machinery/computer/modular/preset/engineering, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"pa" = ( +/obj/item/mollusc/barnacle{ + pixel_x = -13; + pixel_y = -14 + }, +/turf/space, +/area/space) +"pb" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/turf/simulated/open, +/area/ministation/maint/l3sw) +"pf" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"pi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"pp" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"ps" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/paper_bundle, +/obj/effect/floor_decal/stoneborder{ + dir = 6 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"pz" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/hall/n3) +"pM" = ( +/obj/effect/floor_decal/corner/yellow{ + dir = 5 + }, +/obj/structure/bed/chair/padded/blue{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"pP" = ( +/obj/effect/floor_decal/techfloor/orange, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"qi" = ( +/obj/structure/ladder, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"qx" = ( +/obj/machinery/keycard_auth{ + pixel_x = -24; + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"qY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"rf" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"rh" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"rk" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"rl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/handrail{ + dir = 4 + }, +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"rp" = ( +/obj/structure/hygiene/sink{ + dir = 8; + pixel_x = -11 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"rx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"rB" = ( +/obj/machinery/computer/ship/helm{ + dir = 8 + }, +/obj/effect/overmap/visitable/ship/landable/science_shuttle, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"rI" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"rK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/corner/purple{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"rV" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/button/blast_door{ + id_tag = "RD1"; + name = "RD Shutter Button"; + pixel_x = 24; + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"rW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"sh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"sl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock/glass{ + name = "Library" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/library) +"sr" = ( +/turf/simulated/floor/tiled/dark/monotile{ + name = "telecomms dark floor"; + temperature = 263 + }, +/area/ministation/telecomms) +"ss" = ( +/obj/machinery/door/airlock/glass/command{ + name = "Bridge" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"st" = ( +/obj/effect/floor_decal/carpet/green{ + dir = 8 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"sB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"sC" = ( +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"sD" = ( +/turf/simulated/wall, +/area/ministation/hall/n3) +"sE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/effect/wallframe_spawn/reinforced/titanium, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"sM" = ( +/obj/structure/closet, +/obj/item/storage/briefcase, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"sQ" = ( +/obj/structure/ladder, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/zpipe/up/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "16-0" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"sV" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/bed, +/obj/item/bedsheet/purple, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"sY" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass, +/turf/exterior/grass, +/area/ministation/hall/n3) +"tc" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/dark/monotile{ + name = "telecomms dark floor"; + temperature = 263 + }, +/area/ministation/telecomms) +"td" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/dark/monotile{ + name = "telecomms dark floor"; + temperature = 263 + }, +/area/ministation/telecomms) +"te" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"tm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/table, +/obj/item/chems/spray/extinguisher{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/chems/spray/extinguisher{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ts" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"tt" = ( +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"tu" = ( +/obj/structure/table, +/obj/item/integrated_circuit_printer, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"tv" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/turf/simulated/open, +/area/ministation/hall/n3) +"tx" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ministation/hall/n3) +"ty" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/turf/simulated/open, +/area/ministation/maint/l3se) +"tA" = ( +/obj/effect/floor_decal/corner/yellow/full, +/obj/machinery/computer/modular/preset/civilian, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"tB" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 6 + }, +/obj/structure/sign/department/science_2{ + pixel_x = 32; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"tQ" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + name = "bridge blast door"; + id_tag = "bridgeblast" + }, +/turf/simulated/floor/plating, +/area/ministation/bridge) +"tT" = ( +/obj/machinery/atmospherics/unary/freezer{ + dir = 8; + set_temperature = 263 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"tU" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/dark/monotile{ + name = "telecomms dark floor"; + temperature = 263 + }, +/area/ministation/telecomms) +"tV" = ( +/obj/machinery/network/router{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"tY" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"tZ" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/court) +"ug" = ( +/obj/structure/catwalk, +/turf/simulated/open, +/area/ministation/hall/n3) +"uh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"ui" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"ur" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"uA" = ( +/obj/machinery/network/mainframe{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"uB" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8; + level = 2 + }, +/obj/effect/floor_decal/corner/b_green/three_quarters, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"uG" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/network/command{ + dir = 8; + initial_access = null + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"uH" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"uK" = ( +/obj/structure/railing/mapped{ + dir = 8 + }, +/obj/effect/floor_decal/carpet/green/corners, +/obj/effect/floor_decal/stoneborder{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"uN" = ( +/obj/machinery/door/airlock/glass/science, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"uR" = ( +/obj/machinery/airlock_sensor{ + id_tag = "science_sensor"; + pixel_y = 10; + pixel_x = -20; + dir = 4 + }, +/obj/machinery/embedded_controller/radio/airlock/docking_port{ + tag_airpump = "science_vent"; + tag_chamber_sensor = "science_sensor"; + tag_exterior_door = "science_airlock_exterior"; + tag_interior_door = "science_airlock_interior"; + id_tag = "ministation_science_dock"; + dir = 4; + pixel_y = -3; + pixel_x = -21 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/science) +"uS" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"uV" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"uX" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"uZ" = ( +/obj/effect/floor_decal/industrial/warning, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"vc" = ( +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Scientist" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"vl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/blast/regular/open{ + id_tag = "repblast"; + name = "rep blast door" + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"vm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"vo" = ( +/obj/machinery/door/blast/regular{ + dir = 4; + id_tag = "anomvent"; + name = "Emergency Vent" + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"vq" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"vs" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"vJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"wa" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning, +/obj/structure/railing/mapped, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"wd" = ( +/obj/effect/floor_decal/corner/red/full, +/obj/machinery/computer/station_alert/all, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"we" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/camera/network/hallway{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"wq" = ( +/obj/item/stool/padded, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"wJ" = ( +/obj/structure/bed, +/obj/item/bedsheet/rd, +/turf/simulated/floor/carpet/magenta, +/area/ministation/science) +"wM" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/machinery/vending/cola{ + dir = 1 + }, +/turf/simulated/floor/lino, +/area/ministation/hall/s3) +"wY" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/pen/fancy, +/obj/item/storage/fancy/crayons, +/obj/effect/floor_decal/stoneborder{ + dir = 6 + }, +/obj/item/storage/candle_box, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"xc" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/turf/simulated/open, +/area/ministation/maint/l3ne) +"xg" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/computer/modular/preset/cardslot/command, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"xt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"xH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"xN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"ya" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/item/chems/drinks/bottle/cola, +/obj/item/chems/drinks/bottle/cola, +/obj/item/chems/drinks/bottle/cola, +/obj/item/chems/drinks/bottle/cola, +/obj/item/chems/food/sliceable/chocolatecake, +/obj/item/chems/food/sliceable/pizza/vegetablepizza, +/obj/item/chems/food/sliceable/pizza/meatpizza, +/obj/item/chems/food/sliceable/pizza/margherita, +/obj/item/chems/food/sliceable/pizza/mushroompizza, +/obj/item/chems/drinks/cans/waterbottle, +/obj/item/chems/drinks/cans/waterbottle, +/obj/item/chems/drinks/cans/waterbottle, +/obj/item/chems/drinks/cans/waterbottle, +/obj/item/chems/drinks/cans/waterbottle, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"yc" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"yd" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"yf" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"yh" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"yj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"ym" = ( +/turf/simulated/floor/tiled, +/area/ministation/bridge/vault) +"yu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/science) +"yz" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"yA" = ( +/obj/machinery/door/airlock/civilian, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/library) +"yH" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"yP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"yR" = ( +/obj/machinery/atmospherics/unary/engine{ + dir = 4 + }, +/turf/simulated/floor/airless, +/area/ministation/shuttle/outgoing) +"yS" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/turf/space, +/area/space) +"zd" = ( +/obj/machinery/fabricator/industrial{ + initial_network_id = "molluscnet" + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"zl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"zs" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning/corner{ + icon_state = "warningcorner" + }, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/structure/sign/directions/bridge{ + dir = 1; + pixel_y = 42; + pixel_x = -28 + }, +/obj/machinery/camera/network/hallway{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"zt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"zw" = ( +/obj/machinery/light/small, +/obj/structure/bed/chair/armchair/black, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"zy" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"zC" = ( +/turf/simulated/floor/carpet/magenta, +/area/ministation/science) +"zQ" = ( +/obj/structure/closet/secure_closet{ + closet_appearance = /decl/closet_appearance/secure_closet/rd; + req_access = list("ACCESS_RESEARCH"); + name = "Science locker" + }, +/obj/machinery/light, +/obj/item/storage/med_pouch/trauma, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/twohanded/spear/diamond, +/obj/item/shield/buckler, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"zT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Aa" = ( +/obj/machinery/camera/network/command{ + dir = 4; + initial_access = null + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"Ab" = ( +/obj/machinery/network/message_server{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"Af" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"Aj" = ( +/obj/effect/floor_decal/carpet/green{ + dir = 8 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"Al" = ( +/obj/machinery/button/blast_door{ + id_tag = "scishut"; + name = "Science Shutter Button"; + pixel_x = 5; + pixel_y = -6; + directional_offset = null + }, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Am" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Ar" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"As" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Ax" = ( +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"AE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"AH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/wall, +/area/ministation/hall/n3) +"AL" = ( +/obj/machinery/network/telecomms_hub{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"AQ" = ( +/obj/effect/floor_decal/carpet/green{ + dir = 4 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"AS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/techfloor/orange, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"AU" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/shutters{ + name = "science shutters"; + id_tag = "scishut" + }, +/turf/simulated/floor/plating, +/area/ministation/science) +"AV" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + dir = 8; + name = "_West APC"; + pixel_x = -25 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"AW" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes/buildable/max_cap_in_out, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"AX" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/company_rep) +"AY" = ( +/obj/machinery/computer/cryopod/robot{ + pixel_y = 29 + }, +/obj/abstract/landmark/start{ + name = "Robot" + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"AZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Be" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Bf" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Bh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Bk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Bn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Bp" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"Br" = ( +/obj/machinery/light/small, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + temperature = 263 + }, +/area/ministation/telecomms) +"Bs" = ( +/obj/effect/wallframe_spawn/reinforced, +/turf/simulated/floor/plating, +/area/ministation/telecomms) +"Bt" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Bu" = ( +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/obj/machinery/computer/station_alert/all, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Bv" = ( +/obj/structure/table, +/obj/item/folder/blue, +/obj/item/pen/blue, +/obj/item/paper/monitorkey, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Bw" = ( +/obj/machinery/computer/message_monitor, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Bx" = ( +/obj/structure/table, +/obj/item/clothing/suit/storage/toggle/wintercoat, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 20 + }, +/obj/item/radio, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"By" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BC" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 4 + }, +/obj/structure/sign/warning/server_room{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"BD" = ( +/obj/structure/table, +/obj/item/paper_bin, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BE" = ( +/obj/structure/bed/chair/padded/blue{ + dir = 1 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BG" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet{ + pixel_x = 29; + dir = 8 + }, +/obj/item/disk/nuclear, +/obj/machinery/recharger, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BP" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"BS" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"BV" = ( +/obj/effect/floor_decal/carpet/green, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"BZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/airlock/glass/command{ + autoset_access = 0; + name = "Telecommunications glass airlock"; + req_access = list("ACCESS_TELECOMS") + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Cd" = ( +/turf/simulated/wall, +/area/ministation/maint/l3central) +"Cg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Cj" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Ck" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Cl" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/camera/network/command{ + initial_access = null + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Co" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Cw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/monkeycubes, +/obj/item/stack/material/puck/mapped/uranium/ten, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Cy" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"CA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"CB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/hologram/holopad/longrange, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"CC" = ( +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"CD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/black{ + dir = 8 + }, +/obj/structure/sign/warning/server_room{ + pixel_x = -32; + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"CE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"CL" = ( +/obj/machinery/fabricator/robotics{ + initial_network_id = "molluscnet" + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"CM" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/obj/effect/floor_decal/corner/purple{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"CN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"CR" = ( +/obj/machinery/door/window{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"CT" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"CU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Telecommunications" + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor, +/area/ministation/telecomms) +"CV" = ( +/obj/effect/floor_decal/corner/black{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"CW" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"CY" = ( +/obj/machinery/door/airlock/glass{ + autoset_access = 0; + name = "Court Room Airlock" + }, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"Da" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/flora/grass/both, +/turf/exterior/grass, +/area/ministation/hall/n3) +"Dc" = ( +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"De" = ( +/obj/structure/table, +/obj/item/multitool, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Df" = ( +/obj/structure/table, +/obj/item/radio, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -30; + dir = 1 + }, +/obj/item/chems/spray/extinguisher, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Dg" = ( +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/filing_cabinet/chestdrawer, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"Dh" = ( +/obj/effect/floor_decal/corner/black{ + dir = 1 + }, +/obj/structure/sign/department/telecomms{ + dir = 4; + pixel_x = -32 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Di" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Dk" = ( +/obj/machinery/camera/network/hallway{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Do" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/obj/machinery/camera/autoname{ + dir = 4 + }, +/turf/simulated/open, +/area/ministation/hall/n3) +"Dp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/junction/mirrored, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Dt" = ( +/turf/simulated/wall, +/area/ministation/maint/l3sw) +"Du" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "pqm_airlock_exterior" + }, +/obj/machinery/button/access/interior{ + id_tag = "pqm_airlock"; + name = "exterior access button"; + pixel_x = -10; + pixel_y = 20; + command = "cycle_exterior" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Dv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Dw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Dx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + icon_state = "tube1" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Dy" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Dz" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + name = "bridge blast door"; + id_tag = "bridgeblast" + }, +/turf/simulated/floor/plating, +/area/ministation/bridge) +"DB" = ( +/obj/effect/floor_decal/corner/green/full, +/obj/machinery/smartfridge/drying_rack, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"DC" = ( +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"DD" = ( +/obj/structure/table/woodentable, +/obj/item/stack/material/panel/mapped/plastic/ten, +/obj/item/stack/material/plank/mapped/wood/ten, +/obj/item/stack/material/plank/mapped/wood/ten, +/obj/item/stack/material/panel/mapped/plastic/ten, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"DF" = ( +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"DQ" = ( +/obj/structure/table/woodentable, +/obj/item/storage/pill_bottle/dice, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"DX" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"Ec" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Ee" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"Ef" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"Eg" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Eu" = ( +/obj/structure/table, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 24 + }, +/turf/simulated/floor/carpet/magenta, +/area/ministation/science) +"Ex" = ( +/obj/structure/bed/chair/armchair/black{ + dir = 4 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"EB" = ( +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/door/airlock/glass/science{ + name = "Science Department"; + req_access = list("ACCESS_ROBOTICS"); + autoset_access = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/science) +"EP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ET" = ( +/obj/effect/decal/cleanable/blood/oil, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"EW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/techfloor/orange, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Fe" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4; + icon_state = "warningcorner" + }, +/obj/structure/sign/directions/science{ + pixel_y = -21; + pixel_x = -28 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Fy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/sign/warning/airlock{ + pixel_y = 26; + pixel_x = -31 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"FC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/vending/coffee, +/turf/simulated/floor/lino, +/area/ministation/hall/s3) +"FM" = ( +/obj/machinery/port_gen/pacman/super, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"Gh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Gi" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Go" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"Gu" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Gy" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"GD" = ( +/turf/simulated/open, +/area/ministation/hall/n3) +"GF" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/network/research{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"GJ" = ( +/obj/machinery/light, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"GK" = ( +/obj/machinery/computer/ship/sensors{ + dir = 8; + id_tag = "shuttlesensors" + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"GL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"GT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/court) +"Hj" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Hl" = ( +/obj/structure/table/woodentable/ebony, +/obj/item/paper_bin, +/obj/effect/floor_decal/stoneborder{ + dir = 6 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"Ho" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Hw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"HB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"HK" = ( +/obj/effect/floor_decal/carpet/green{ + dir = 4 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"HX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/handrail{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"Ia" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Ib" = ( +/obj/machinery/door/blast/regular/open{ + id_tag = "repblast"; + name = "rep blast door" + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"Id" = ( +/obj/machinery/door/airlock, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"Ie" = ( +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Ik" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8 + }, +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"Il" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/plating, +/area/ministation/company_rep) +"Io" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/bed/chair/wood/maple{ + dir = 8 + }, +/obj/abstract/landmark/start{ + name = "Company Representative" + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"Ir" = ( +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Ix" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"IA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning{ + dir = 4; + icon_state = "warning" + }, +/obj/structure/railing/mapped{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"IB" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"IC" = ( +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"IP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"IS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/lino, +/area/ministation/telecomms) +"IT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"IV" = ( +/obj/machinery/door/airlock/glass/command, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"Je" = ( +/obj/machinery/camera/network/research{ + dir = 4 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Jk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/alarm{ + pixel_y = 22 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Jo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Jx" = ( +/obj/structure/closet/secure_closet/research_director, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Jz" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"JJ" = ( +/obj/machinery/door/airlock/glass, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"JK" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/structure/cable{ + icon_state = "32-4" + }, +/obj/machinery/atmospherics/pipe/zpipe/down/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/zpipe/down/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/down{ + dir = 4 + }, +/turf/simulated/open, +/area/ministation/maint/l3central) +"Kg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Kr" = ( +/obj/effect/floor_decal/corner/b_green/half{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"KQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"KU" = ( +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"Le" = ( +/obj/structure/table/woodentable, +/obj/item/chems/drinks/cans/waterbottle, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"Lq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"LA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"LC" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"LL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"LM" = ( +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"LN" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8; + icon_state = "warningcorner" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"LP" = ( +/obj/machinery/keycard_auth{ + pixel_y = -20; + dir = 1 + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/machinery/camera/network/command{ + dir = 1; + initial_access = null + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"LS" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"LT" = ( +/obj/structure/bed/chair/armchair/black{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"LW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Mb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"Mc" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Md" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Me" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + name = "bridge blast door"; + id_tag = "bridgeblast" + }, +/turf/simulated/floor/plating, +/area/ministation/bridge) +"Mi" = ( +/obj/machinery/portable_atmospherics/hydroponics, +/obj/effect/floor_decal/corner/green/full, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Mk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Mn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Mo" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + name = "bridge blast door"; + id_tag = "bridgeblast" + }, +/turf/simulated/floor/airless, +/area/ministation/bridge) +"Ms" = ( +/obj/item/radio/intercom{ + dir = 8; + pixel_x = 22 + }, +/obj/structure/table/woodentable_reinforced/walnut, +/obj/item/folder, +/turf/simulated/floor/carpet/red, +/area/ministation/court) +"My" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Mz" = ( +/obj/machinery/atmospherics/unary/tank/carbon_dioxide{ + start_pressure = 10000 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"MA" = ( +/obj/structure/closet/secure_closet/courtroom, +/turf/simulated/floor/tiled, +/area/ministation/court) +"MB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"MF" = ( +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"MI" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 5 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"MJ" = ( +/obj/structure/bed/chair/armchair/black, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"MP" = ( +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"MU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/camera/network/hallway{ + dir = 4 + }, +/obj/effect/floor_decal/techfloor/orange, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"MV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"MZ" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Na" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"Nb" = ( +/obj/effect/wallframe_spawn/reinforced/titanium, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"Nc" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 32 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Ng" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 10 + }, +/turf/simulated/wall/titanium, +/area/ministation/shuttle/outgoing) +"Nh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"Nk" = ( +/obj/machinery/photocopier, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Nm" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ + dir = 4 + }, +/turf/simulated/wall/titanium, +/area/ministation/shuttle/outgoing) +"Np" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Nr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/airlock/double/glass/science{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"Nw" = ( +/turf/simulated/floor/tiled, +/area/ministation/court) +"Ny" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -29; + dir = 1 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"ND" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"NF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"NH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"NJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/flora/pottedplant/aquatic, +/turf/simulated/floor/lino, +/area/ministation/hall/s3) +"NM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"NN" = ( +/obj/structure/table, +/obj/machinery/alarm{ + pixel_y = -2; + dir = 4; + pixel_x = -24 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"NO" = ( +/obj/abstract/level_data_spawner/main_level, +/turf/space, +/area/space) +"NR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"NW" = ( +/obj/effect/decal/cleanable/dirt{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden, +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Oa" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Oc" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"Od" = ( +/obj/structure/bed/chair/wood/walnut{ + dir = 4 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Ok" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/effect/paint/red, +/turf/simulated/wall/titanium, +/area/ministation/shuttle/outgoing) +"Om" = ( +/obj/structure/bed/chair/armchair/black{ + dir = 8 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"Oo" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "conpipe-c" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Ou" = ( +/obj/effect/floor_decal/corner/b_green/three_quarters{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Ov" = ( +/obj/structure/table/woodentable/walnut, +/obj/machinery/light, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Oy" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 4; + name = "airlock pump" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"OC" = ( +/obj/structure/sign/warning/airlock{ + pixel_y = -32; + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"OD" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning, +/obj/structure/railing/mapped, +/turf/simulated/open, +/area/ministation/hall/n3) +"OG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"OK" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "science_shuttle_interior" + }, +/obj/machinery/button/access/interior{ + id_tag = "science_shuttle"; + name = "interior access button"; + pixel_x = 20; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"OL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"OM" = ( +/obj/structure/railing/mapped{ + dir = 8 + }, +/obj/effect/floor_decal/carpet/green{ + dir = 4 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"ON" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"OP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"OQ" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"OU" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"OW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Pa" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Pe" = ( +/obj/structure/catwalk, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/turf/simulated/open, +/area/ministation/hall/n3) +"Pg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Pk" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/folder/blue, +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Pn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"Po" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment/bent{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Pw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/floor_decal/techfloor/orange, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Px" = ( +/obj/structure/table/woodentable/walnut, +/obj/item/folder/red, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Pz" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"PB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/item/stool/padded, +/obj/abstract/landmark/start{ + name = "Librarian" + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"PE" = ( +/obj/structure/bed/chair/armchair/black{ + dir = 8 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"PL" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "science_shuttle_pump"; + dir = 4 + }, +/obj/effect/shuttle_landmark/science_dock, +/obj/machinery/embedded_controller/radio/airlock/docking_port{ + cycle_to_external_air = 1; + id_tag = "science_shuttle"; + tag_airpump = "science_shuttle_pump"; + tag_chamber_sensor = "science_shuttle_sensor"; + tag_exterior_door = "science_shuttle_exterior"; + tag_interior_door = "science_shuttle_interior"; + dir = 4; + pixel_x = -22 + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"PO" = ( +/turf/simulated/wall, +/area/ministation/maint/l3nw) +"PP" = ( +/obj/structure/closet, +/obj/random/maintenance, +/obj/item/flashlight, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"PR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"PT" = ( +/obj/structure/table/woodentable_reinforced/walnut, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/court) +"PV" = ( +/obj/structure/table, +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4; + level = 2 + }, +/obj/item/modular_computer/tablet/preset/custom_loadout/cheap, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"PW" = ( +/obj/structure/closet/secure_closet/xenoarchaeologist, +/obj/item/ano_scanner, +/obj/item/stock_parts/circuitboard/suspension_gen, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"PX" = ( +/obj/abstract/landmark/start{ + name = "Research Director" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/bed/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/light_switch{ + pixel_y = 25; + pixel_x = -23 + }, +/turf/simulated/floor/carpet/magenta, +/area/ministation/science) +"Qf" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Qh" = ( +/obj/structure/bed/chair/wood/walnut{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Qk" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"Qq" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Qs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"Qt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/mirrored, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Qu" = ( +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Qx" = ( +/obj/structure/table, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/storage/firstaid/stab, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"QD" = ( +/obj/structure/table/woodentable, +/obj/item/book/printable_red, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"QG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"QK" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/abstract/landmark/latejoin/cyborg, +/turf/simulated/floor/tiled/steel_grid, +/area/ministation/science) +"QR" = ( +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"QT" = ( +/obj/machinery/computer/design_console{ + dir = 8; + initial_network_id = "molluscnet" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/ministation/science) +"QW" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/structure/table/woodentable, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Re" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3nw) +"Rf" = ( +/obj/machinery/door/airlock/civilian{ + autoset_access = 0; + name = "Librarian's Chamber"; + req_access = list("ACCESS_LIBRARY") + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/library) +"Ri" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Rl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/purple{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Rp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Rt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Rv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Rx" = ( +/turf/simulated/wall, +/area/ministation/court) +"RB" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"RE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/handrail{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"RG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"RI" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"RO" = ( +/obj/effect/decal/cleanable/blood/oil, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"RQ" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"RR" = ( +/obj/effect/floor_decal/carpet/green{ + dir = 8 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 8 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"RS" = ( +/obj/machinery/power/smes/buildable/max_cap_in_out{ + RCon_tag = null; + capacity = 5e+009; + charge = 5e+009 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"RT" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"RV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"RY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Sa" = ( +/turf/simulated/wall, +/area/ministation/library) +"Sb" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Sc" = ( +/obj/machinery/door/airlock, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/company_rep) +"Sf" = ( +/obj/structure/table/woodentable/walnut, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Sh" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/reinforced, +/area/ministation/science) +"Sk" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"Sm" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"So" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Sq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"SE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/network/hallway{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"SG" = ( +/obj/effect/floor_decal/corner/purple{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"SI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"SP" = ( +/obj/item/stool/padded, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"SS" = ( +/obj/machinery/computer/ship/engines{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"ST" = ( +/obj/effect/floor_decal/corner/paleblue{ + dir = 5 + }, +/obj/effect/floor_decal/corner/white{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"SW" = ( +/obj/structure/closet/secure_closet/lawyer, +/turf/simulated/floor/tiled, +/area/ministation/court) +"Tc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Tk" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Tm" = ( +/obj/effect/floor_decal/carpet/green{ + dir = 1 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 1 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"Tn" = ( +/obj/machinery/shipsensors{ + id_tag = "shuttlesensors" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/airless, +/area/ministation/shuttle/outgoing) +"Tq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/network/hallway{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Tr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/effect/floor_decal/corner/purple, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Tv" = ( +/obj/structure/railing/mapped{ + dir = 8 + }, +/obj/structure/table/woodentable/ebony, +/obj/item/pen, +/obj/item/pen/blue, +/obj/item/pen/retractable, +/obj/item/pen/retractable/green, +/obj/item/pen/retractable/blue, +/obj/item/pen/multi, +/obj/effect/floor_decal/stoneborder/corner, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"Tz" = ( +/obj/machinery/portable_atmospherics/canister/air/airlock{ + start_pressure = 730 + }, +/obj/machinery/atmospherics/portables_connector, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"TE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/obj/effect/overmap/visitable/ship/ministation, +/obj/structure/bed/chair/padded/blue, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"TF" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"TH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"TI" = ( +/obj/structure/table/woodentable, +/obj/random/cash, +/obj/item/chems/drinks/cans/waterbottle, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"TP" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/turf/simulated/open, +/area/ministation/hall/n3) +"TR" = ( +/obj/structure/window/basic{ + dir = 1 + }, +/obj/structure/curtain/open/bed{ + icon_state = "closed"; + opacity = 1 + }, +/obj/machinery/door/blast/regular/open{ + id_tag = "repblast"; + name = "rep blast door" + }, +/turf/simulated/floor/plating, +/area/ministation/company_rep) +"TS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"TZ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"Ua" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/table, +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/obj/machinery/faxmachine/mapped, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"Um" = ( +/obj/effect/floor_decal/carpet/green/corners, +/obj/effect/floor_decal/stoneborder/corner{ + dir = 8 + }, +/obj/structure/reagent_dispensers/water_cooler{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"Uo" = ( +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Up" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Uq" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Uw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"UB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/lino, +/area/ministation/hall/s3) +"UD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"UE" = ( +/obj/structure/closet/crate/uranium, +/obj/item/wrench, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"UG" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/bookcase/skill_books/random, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"UH" = ( +/obj/machinery/alarm{ + pixel_y = 23 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"UI" = ( +/obj/effect/wallframe_spawn/no_grille, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/court) +"UJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment/bent{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"UK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/portables_connector{ + pixel_x = -3 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"UL" = ( +/obj/effect/decal/cleanable/filth, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"UQ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3se) +"UR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"Vb" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/open, +/area/ministation/maint/l3se) +"Vi" = ( +/obj/machinery/light_switch{ + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/table/woodentable, +/obj/item/knife/kitchen, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/obj/item/mollusc/clam, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Vq" = ( +/obj/structure/bookcase/skill_books/random, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Vt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Vv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/bed/chair/comfy/captain{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/simulated/floor/carpet/red, +/area/ministation/court) +"Vw" = ( +/obj/structure/table/woodentable, +/obj/item/deck/cards, +/turf/simulated/floor/carpet/green, +/area/ministation/library) +"Vx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 10 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"VB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/reinforced/titanium, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"VI" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "science_vent"; + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/science) +"VJ" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"VL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"VW" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/status_display{ + pixel_y = 30; + pixel_x = -33 + }, +/obj/machinery/power/apc{ + dir = 1; + name = "_North APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/table/woodentable, +/obj/machinery/fabricator/book, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"VX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"VY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "science_shuttle_exterior" + }, +/obj/machinery/button/access/interior{ + id_tag = "science_shuttle"; + name = "exterior access button"; + pixel_x = 20; + command = "cycle_exterior"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"VZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Wg" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/purple{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Wh" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/blast/regular{ + name = "bridge blast door"; + id_tag = "bridgeblast" + }, +/turf/simulated/floor/plating, +/area/ministation/bridge) +"Wr" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Ws" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1; + level = 2 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Wx" = ( +/obj/machinery/door/airlock/hatch/maintenance, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"WA" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"WJ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/alarm{ + pixel_y = 22 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"WK" = ( +/obj/machinery/artifact_analyser, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"WM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/fuel{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/machinery/alarm{ + dir = 1; + pixel_y = -26 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"WO" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"WQ" = ( +/obj/structure/railing/mapped{ + dir = 8 + }, +/obj/effect/floor_decal/stoneborder{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"WT" = ( +/obj/structure/bed/padded, +/obj/item/bedsheet/green, +/obj/random_multi/single_item/captains_spare_id, +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 32 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"Xa" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Xb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning{ + dir = 8; + icon_state = "warning" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/railing/mapped{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"Xe" = ( +/obj/structure/bed/chair/wood/walnut{ + dir = 4 + }, +/obj/machinery/light, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Xi" = ( +/obj/machinery/newscaster{ + pixel_x = 32; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/carpet/red, +/area/ministation/court) +"Xl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"XA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning, +/obj/structure/railing/mapped, +/turf/simulated/open, +/area/ministation/hall/n3) +"XE" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8; + icon_state = "warningcorner" + }, +/turf/simulated/open, +/area/ministation/hall/n3) +"XI" = ( +/obj/effect/floor_decal/carpet/green/corners, +/obj/effect/floor_decal/stoneborder/corner{ + dir = 4 + }, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"XJ" = ( +/obj/structure/closet, +/obj/random/maintenance, +/obj/random/suit, +/obj/random/gloves, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"XM" = ( +/obj/machinery/door/airlock, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/ministation/court) +"XS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"XT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Ye" = ( +/obj/effect/wallframe_spawn/reinforced/titanium, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"Yi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Yj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/button/blast_door{ + id_tag = "repblast"; + name = "Panic Lockdown"; + pixel_y = -23; + pixel_x = -26; + dir = 1 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"Yl" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Ym" = ( +/obj/structure/window/reinforced, +/obj/structure/flora/bush/grassybush, +/turf/exterior/grass, +/area/ministation/hall/n3) +"Yv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3central) +"Yw" = ( +/obj/machinery/artifact_scanpad, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Yy" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "science_airlock_interior" + }, +/obj/machinery/button/access/interior{ + id_tag = "ministation_science_dock"; + name = "interior access button"; + pixel_x = 20; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/science) +"YH" = ( +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"YI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"YL" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"YO" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 8; + id_tag = "science_shuttle_pump_out_internal" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/airlock_sensor{ + id_tag = "science_shuttle_sensor"; + pixel_x = -22; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"YP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/computer/modular/preset/civilian{ + dir = 1 + }, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"YQ" = ( +/obj/structure/closet/lawcloset, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/court) +"YR" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -27 + }, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 22 + }, +/turf/simulated/floor/plating, +/area/ministation/shuttle/outgoing) +"YS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"YX" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "science_shuttle_pump_out_external" + }, +/obj/structure/handrail{ + dir = 8 + }, +/turf/simulated/floor/airless, +/area/ministation/shuttle/outgoing) +"YZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"Zd" = ( +/obj/machinery/button/blast_door{ + id_tag = "anomvent"; + name = "emergency vent control"; + pixel_y = -32; + pixel_x = -5; + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/button/mass_driver{ + pixel_y = -32; + pixel_x = 7; + id_tag = "artifactlauncher"; + name = "LAUNCH"; + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"Zg" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Zj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Zo" = ( +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + dir = 0; + id_tag = "pqm_airlock"; + pixel_y = 24; + tag_airpump = "pqm_vent"; + tag_chamber_sensor = "pqm_sensor"; + tag_exterior_door = "pqm_airlock_exterior"; + tag_interior_door = "pqm_airlock_interior" + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + dir = 4; + id_tag = "pqm_vent" + }, +/obj/machinery/airlock_sensor{ + id_tag = "pqm_sensor"; + pixel_y = 20 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3sw) +"Zr" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l3ne) +"Zt" = ( +/obj/structure/bed/chair/wood/walnut{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 21 + }, +/turf/simulated/floor/wood/yew, +/area/ministation/court) +"Zu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/alarm{ + pixel_y = 22 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"Zv" = ( +/turf/simulated/wall, +/area/ministation/hall/s3) +"ZB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/ministation/bridge) +"ZH" = ( +/obj/effect/floor_decal/carpet/green, +/turf/simulated/floor/wood/walnut, +/area/ministation/library) +"ZJ" = ( +/obj/machinery/door/firedoor, +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/tiled, +/area/ministation/hall/n3) +"ZK" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/carpet/magenta, +/area/ministation/science) +"ZP" = ( +/obj/effect/wallframe_spawn/no_grille, +/turf/simulated/floor/plating, +/area/ministation/court) +"ZR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/tiled, +/area/ministation/hall/s3) +"ZS" = ( +/obj/structure/bed/chair/shuttle/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/ministation/shuttle/outgoing) +"ZT" = ( +/obj/machinery/camera/network/research{ + dir = 4 + }, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = -22 + }, +/turf/simulated/floor/tiled/white, +/area/ministation/science) +"ZV" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/simulated/floor/carpet/green, +/area/ministation/company_rep) +"ZW" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/wood/mahogany, +/area/ministation/library) +"ZZ" = ( +/obj/structure/table/woodentable_reinforced/walnut, +/obj/item/bell, +/turf/simulated/floor/carpet/red, +/area/ministation/court) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +NO +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(45,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(47,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(48,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(53,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(54,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(55,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(56,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(57,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(58,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(59,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(60,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(61,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(62,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +af +aa +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(63,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(64,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(65,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(66,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(67,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(68,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(69,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(70,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +ab +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(71,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(72,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(73,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(74,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(75,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(76,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(77,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(78,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(79,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(80,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(81,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(82,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(83,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(84,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(85,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(86,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(87,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(88,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +yS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(89,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(90,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(91,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(92,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +aa +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(93,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +aa +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(94,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +aa +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(95,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +aa +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(96,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(97,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(98,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(99,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(100,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(101,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(102,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(103,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(104,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(105,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(106,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +cn +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(107,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dt +Du +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(108,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +Dt +Zo +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(109,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +Dt +jm +Dt +Dt +Dt +gU +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(110,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +Dt +bu +Dt +UK +XJ +NW +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(111,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +Dt +Dt +Dt +Dt +Dt +Dt +Dt +Dt +Zg +Dt +PP +HB +NF +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(112,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Cd +Cd +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +Dt +Gh +vm +Zj +zT +zT +mY +zT +RO +CN +KQ +eP +Dv +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(113,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Cd +JK +Cd +cw +Cd +Cd +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +Dt +Dt +Dt +Dt +oR +bl +bl +bl +bl +bl +bl +bl +bl +bl +bl +Am +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(114,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +PO +PO +PO +PO +PO +PO +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +Cd +Ie +Cd +cw +Cd +sQ +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +Dt +pb +rk +Wx +sh +bl +nA +of +Aa +Ax +cP +Ax +AV +Aa +bl +Am +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(115,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ah +ah +ah +ah +ah +aa +aa +PO +Re +mW +mW +dZ +PO +PO +PO +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +Cd +lp +Cd +cw +Cd +DC +Cd +cw +cw +cw +cw +cw +cw +cw +aA +cw +cw +cw +cw +cw +Dt +Dt +Dt +Dt +sh +bl +sr +sr +sr +sr +sr +Ax +AW +Br +bl +Ec +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(116,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +pa +ah +aR +br +bG +ah +aa +aa +PO +Il +Af +mW +qY +ur +hY +PO +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +Cd +Cd +Gu +Cd +Cd +Cd +RB +Cd +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +Dt +sh +bl +nA +Ax +Ab +AL +sr +Ax +Bp +Ax +bl +Am +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(117,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Mo +aT +bs +bH +ah +co +co +co +co +co +Ee +av +PO +PO +PO +cw +cw +aa +aa +ab +aa +aa +aa +aa +aa +aa +cw +gF +Cd +Oo +Lq +xN +xN +xN +Fy +ls +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +Dt +sh +bl +Bs +Bs +Bs +Bs +sr +tc +tU +sr +bl +GL +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(118,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ah +aW +bt +bI +ah +co +Ua +ZV +PV +co +yf +av +PO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Cd +lp +sD +sD +Gi +sD +sD +Np +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +Dt +Dt +sh +bl +Bv +BD +BP +og +sr +td +tV +uA +bl +Am +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(119,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ah +ah +aX +ah +ah +ah +co +Dc +Io +YP +co +co +av +PO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Cd +lp +sD +Pe +cg +Do +sD +Np +Cd +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +Dt +nL +sh +bl +Bu +BE +BQ +Bs +Bs +oF +Bs +Bs +bl +Yi +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(120,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ah +ah +aF +NH +bv +bK +qx +TR +IC +cD +Yj +Ib +AX +av +PO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Cd +lp +sD +ug +XA +GD +sD +Np +Cd +Cd +Cd +Cd +Cd +Cd +Cd +Cd +Cd +cw +aa +aa +aa +aa +aa +Dt +fi +sh +bl +xg +Bt +IS +Bs +Cj +CA +By +De +bl +Am +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(121,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +tQ +am +aI +ba +bw +TH +aJ +TR +WT +kq +sM +co +co +av +PO +PO +PO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +sD +sD +Cd +jy +AH +ug +OD +GD +sD +dE +Yv +Yv +Yv +Yv +Yv +Rp +Bh +ls +Cd +aa +aa +aa +aa +aa +aa +Dt +Dt +sh +bl +Bw +BE +BR +BZ +Ck +CB +BP +Df +bl +Am +Dt +Dt +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(122,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +ao +aJ +aY +aJ +MV +aJ +co +co +vl +co +co +fU +av +ur +qi +PO +aa +aa +aa +aa +aa +aa +aa +aa +sD +sD +sD +sD +pz +Eg +fl +sD +ug +XE +TP +sD +Be +LS +LS +LS +LS +LS +nI +Zv +nP +Zv +Zv +aa +aa +aa +aa +aa +aa +Dt +vJ +bl +Bx +BG +oG +Bs +Cl +CC +CT +Dg +bl +fN +Wx +pb +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(123,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +as +aK +aY +aJ +MV +bV +aD +aD +Sc +aD +aD +sD +eM +sD +sD +sD +sD +sD +sD +sD +tx +tx +tx +sD +sD +iu +iZ +sD +sD +Gu +sD +sD +sD +Cy +sD +sD +sD +sD +sD +sD +sD +Zv +Zv +Zv +Mn +Hj +Zv +kg +kg +kg +Zv +Zv +Zv +Zv +Bf +bl +bl +bl +bl +bl +bl +bl +CU +bl +bl +Dw +Dt +Dt +Dt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(124,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +wd +mk +aY +aJ +UR +pf +IV +Na +jL +Oc +ss +bW +cr +Pw +xH +fz +MU +RY +OW +Md +OW +So +gR +gR +Md +So +OW +OW +OW +OU +OW +OW +Qu +OW +uV +cp +zs +IA +hS +IA +Fe +JJ +Mc +we +Kg +uh +FC +UB +NJ +UB +wM +Pa +uh +uh +RQ +Bn +uh +RI +uh +ZR +uh +CD +CV +Dh +Dk +Dx +Zv +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(125,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +tA +aO +bb +bx +bM +Qs +yd +ZB +bM +rh +uX +sY +sB +pP +MZ +kh +pP +MZ +sC +sC +sC +sC +kh +kh +sC +PR +sC +sC +sC +ll +sC +sC +sC +sC +ZJ +sC +hx +GD +GD +GD +de +Gy +tt +tt +Mn +tt +Ou +Kr +Kr +Kr +uB +tt +tt +oN +Mn +tt +tt +Sq +tt +tt +tt +tt +Xl +tt +tt +Mn +kg +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(126,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Wh +ax +TE +bc +bz +bN +bX +ch +cs +fk +cE +cU +Ym +Sb +EW +Ar +rx +EW +zt +LL +fA +es +gx +gS +rx +LL +LL +LL +LL +LL +eO +sC +PR +sC +sC +ZJ +sC +uZ +GD +tv +GD +BS +Gy +oN +tt +uS +Pg +Pg +Pg +Pg +Pg +Bk +Pg +Pg +Pg +Rv +Pg +Pg +YZ +Pg +Pg +Rt +Pg +CW +Rt +Pg +Dy +kg +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(127,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +ay +ST +be +bA +bM +Qs +yd +OQ +bM +di +Pz +Da +sB +pP +MZ +kh +pP +MZ +sC +sC +sC +gQ +sC +kh +sC +PR +sC +sC +sC +ts +PR +sC +sC +sC +ZJ +sC +wa +GD +GD +GD +vq +Gy +tt +tt +tt +tt +tt +tt +tt +tt +aV +tt +tt +tt +tt +oN +oN +Sq +tt +tt +oN +tt +fZ +tt +tt +Mn +kg +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(128,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +az +pM +aJ +aY +bO +bY +ci +ct +uG +cF +dr +WO +Jo +AS +VL +gT +AS +VL +Wr +Dp +VZ +gy +VZ +Qt +hV +Tq +VZ +cJ +VZ +tY +VZ +VZ +VZ +VZ +Ia +VZ +LN +Xb +rf +Xb +lb +eZ +MB +fJ +iN +iN +iN +QG +fJ +zy +Co +fJ +fJ +rK +SE +fJ +tB +CM +SG +ui +ui +CE +SI +tt +oN +Dx +Zv +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(129,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +oS +aO +aJ +aY +bM +bZ +aD +ah +ah +ah +ah +LW +UI +UI +UI +CY +UI +ZP +Rx +Id +Sa +da +da +sl +da +Sa +Sa +da +da +Sa +Sa +Sa +Sa +sD +sD +sD +sD +tx +tx +tx +sD +ae +ae +ae +lG +lG +lG +ae +ae +ae +ae +ae +ae +if +AU +ae +ae +EB +ae +ae +ae +ae +ae +ae +ae +RT +oc +oc +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(130,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Dz +aB +aJ +aJ +aY +bM +vs +aD +cu +Mk +cV +yP +dS +Rx +Qh +Od +ND +Od +Xe +Rx +rW +Sa +QW +SP +YS +LT +gV +Vq +LM +LM +Vq +yj +Vq +Sa +aa +aa +cw +cw +cw +cw +cw +gF +ae +dw +dt +ar +ar +ar +ae +tu +zd +hf +iK +Al +gg +MF +ae +kn +kQ +lv +ae +mA +nr +MF +Mi +ae +iG +yh +ty +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(131,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Me +aC +aP +bf +bB +bP +ca +aD +he +VJ +UL +VJ +dT +Rx +Zt +Od +ND +Od +Od +Rx +Sk +Sa +wq +Uw +Up +Uw +Uw +Ws +LM +LM +Vq +LM +Vq +Sa +aa +aa +cw +cw +cw +cw +cw +cw +ae +gJ +fK +ar +eb +ar +ae +ee +iL +iL +iL +ig +db +dQ +ae +ko +RV +lw +ae +mB +ns +As +oB +ae +iG +oc +oc +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(132,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ah +ah +aQ +eF +Mb +LP +ah +aD +nl +Qq +cW +cW +Zr +tZ +Ir +Ir +UD +Ir +Ny +Rx +rW +Sa +VW +Tk +Ri +LM +Vq +Vq +Nk +LM +LM +LM +zw +Sa +aa +aa +cw +cw +cw +cw +cw +cw +ae +AY +fK +ar +ar +ar +ae +QT +iL +iL +iL +ig +db +jn +ae +kp +kR +lx +ae +mC +db +As +oB +ae +Nh +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(133,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +jN +aa +aa +aa +aa +aa +aa +aa +aa +aD +bg +bg +bD +bg +bg +ad +nl +xc +cX +VJ +ET +Rx +Sf +Pk +TF +Px +Ov +Rx +pi +Sa +PB +QD +Uq +AE +RG +Jz +LM +LM +Vq +LM +Vq +Sa +aa +aa +cw +cw +cw +ae +kW +kW +ae +dv +Ik +QK +hg +eD +ae +gd +iL +iL +iL +ig +db +jo +ae +ae +kP +ae +ae +mD +db +As +oB +ae +iG +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(134,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bg +bi +bE +bT +bg +aa +nl +nl +nl +nl +LW +Rx +QR +Ir +ND +Ir +Ir +Rx +rW +Sa +Jk +ZW +yc +MP +UG +Vq +LM +fV +Vq +PE +Vq +Sa +Sa +Sa +cw +cw +ae +ae +kG +Jx +ae +ae +ae +ec +ae +ae +ae +iL +CL +iI +hh +ih +db +jp +ae +kr +kT +lz +ae +mG +db +As +oB +ae +iG +oc +oc +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(135,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bg +bn +bF +bq +bg +aa +aa +aa +aa +nl +NR +Rx +IB +ZZ +PT +dn +Ir +Rx +rW +Sa +Rf +Sa +Sa +Sa +Tv +WQ +uK +AQ +OM +OM +OM +HK +Um +hv +cw +cw +kW +wJ +PX +UJ +mN +Ix +hj +Sm +te +GF +iJ +nz +hG +hG +hG +Cg +LC +jq +ae +ks +kU +lA +ae +mF +db +As +DB +ae +iG +ap +rI +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(136,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bg +bp +bR +bq +bg +ad +aa +nl +nl +nl +Tc +Rx +Nc +Ms +Vv +Xi +YI +XM +eV +Sa +Zu +oQ +DD +Sa +Hl +kk +ZH +KU +Ex +Ex +Ex +KU +Tm +hv +cw +cw +kW +zC +ZK +rV +cL +bo +hH +hH +hH +XT +gH +Rl +gG +hH +hH +ik +iO +jr +jP +kt +kV +lB +mf +mE +nt +Po +dx +yu +ki +ap +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(137,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bg +nj +bq +bq +bg +ad +ad +nl +nN +nS +Tc +Rx +Rx +Rx +Rx +Rx +Rx +Rx +eW +Sa +ya +LM +lh +Sa +ps +kk +ZH +MJ +TI +DQ +Le +KU +Tm +Sa +cw +cw +kW +Eu +ae +ae +ae +cN +ae +ae +ae +ae +ae +iP +ae +ae +hI +db +db +js +ae +ku +NM +lC +ae +mH +nu +od +oC +ae +Qk +ap +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(138,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bg +by +ym +ym +bg +ad +aa +nl +nl +nQ +ET +VJ +Rx +MA +YQ +dX +eB +nX +eX +Sa +Vi +LA +lH +Sa +wY +mX +BV +KU +Vw +Le +Ef +KU +Tm +Sa +cw +cw +ae +ae +ae +cw +cL +ob +db +db +db +rp +Je +Wg +gI +ae +hJ +db +db +jt +ae +kv +NM +lD +ae +oD +nv +oD +oD +ae +iG +ap +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(139,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bg +bg +bg +bg +bg +aa +aa +aa +aa +nl +Tc +VJ +Rx +Nw +dq +dY +dY +dY +eY +Sa +sV +LM +xt +Sa +Sa +Sa +Sa +KU +Om +Om +Om +KU +Tm +hv +cw +cw +cw +cw +cw +cw +cL +ob +db +db +fb +db +db +RV +GJ +ae +hK +db +db +ju +ae +kw +NM +lE +ae +mJ +nw +oe +mJ +ae +jd +ap +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(140,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +Vt +yH +tZ +Nw +OP +Nw +Nw +Nw +Nw +Sa +Sa +Sa +yA +Sa +Sa +nZ +nl +RR +RR +st +RR +Aj +XI +hv +cw +cw +cw +cw +cw +cw +ae +aU +dy +ef +ae +fd +gf +OL +gK +ae +hL +in +iQ +jv +ae +kx +NM +Qf +ae +mJ +mJ +mJ +oE +ae +DX +op +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(141,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +iq +GT +Rx +SW +et +aq +nW +DF +Nw +Rx +WJ +pp +Ho +VJ +Oa +VJ +nl +Sa +Sa +Sa +Sa +Sa +Sa +Sa +cw +cw +cw +cw +cw +cw +ae +dc +dz +eg +ae +fe +db +tm +ae +ae +ae +ae +ae +ae +ae +ky +NM +GJ +ae +mK +mK +mK +mK +ae +oc +oc +yh +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(142,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +nl +Tc +Rx +Rx +Rx +Rx +Rx +Rx +Rx +Rx +Tc +nl +nl +nl +nl +nS +nl +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +dd +dd +aw +ae +ff +vc +Cw +ae +hm +hN +io +iR +ZT +db +kz +NM +db +ae +ae +ae +ae +ae +ae +aa +oc +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(143,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +yz +pp +cW +cW +cW +pp +cW +cW +cW +Ho +nl +cw +cw +nl +Di +nl +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +dd +du +aw +ae +fg +gh +hF +ae +hn +hO +iS +iT +db +jw +db +NM +db +ae +cx +db +db +cI +ae +aa +oc +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(144,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +nl +nl +nl +nl +nl +nl +nl +nl +nl +nl +nl +cw +cw +nl +VJ +nl +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +dd +dA +eh +ae +fh +LC +gi +ae +hM +ip +io +BC +jx +db +Xa +My +Tr +ae +lF +db +db +cI +ae +aa +oc +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(145,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +xc +nl +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +ae +ae +ae +ae +cL +cL +cL +ae +ae +ae +ae +tT +fc +jR +XS +ob +Vx +uN +MI +db +db +zQ +ae +aa +oc +UQ +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(146,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nl +nl +nl +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +ae +ae +ae +ae +ae +XS +ob +jM +ae +gI +db +db +cI +ae +aa +oc +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(147,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +PW +Yl +Yw +WK +ae +hi +ob +Oy +ae +ot +db +db +ge +ae +aa +oc +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(148,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +Uo +OG +im +AZ +ii +Hw +IP +oP +ae +ae +ae +cL +cL +ae +aa +oc +ap +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(149,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +db +Qf +db +Zd +ae +db +VX +WA +ae +cw +pa +aa +aa +aa +aa +oc +Vb +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(150,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +aZ +gn +CR +Sh +ae +db +VX +GJ +ae +cw +aa +aa +aa +aa +aa +oc +oc +oc +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(151,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +aA +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +UH +ey +ml +mJ +ae +db +VX +db +ae +cw +aa +aa +hl +YX +yR +yR +Tn +hl +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(152,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +uH +ey +mJ +mJ +ae +db +VX +db +cL +aa +aa +aa +Ok +sE +Ng +Nm +VB +Ok +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(153,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +ae +ae +vo +ae +ae +db +VX +db +cL +aa +aa +aa +nG +FM +UE +YR +rl +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(154,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +ky +VX +OC +ae +ae +ae +ae +nG +hy +nG +nG +zl +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(155,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +ae +uH +EP +gp +Yy +VI +uR +eH +VY +YO +PL +OK +HX +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(156,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aA +cw +cw +cw +cw +cw +aa +cw +cw +cw +ae +db +db +db +ae +ae +cL +ae +nG +Ye +Nb +nG +RE +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(157,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +ae +cL +cL +cL +ae +aa +aa +aa +ei +Mz +Go +iC +WM +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(158,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +nG +Tz +IT +TZ +YL +ei +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(159,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nG +ms +iM +Pn +mU +ei +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(160,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nG +RS +ON +TS +mm +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(161,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nG +nG +YH +Nr +nG +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(162,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +nG +Qx +gN +ZS +NN +nG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(163,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ei +eA +rB +GK +SS +ei +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(164,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ei +ei +ei +ei +ei +ei +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(165,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(166,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(167,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(168,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(169,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(170,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(171,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(172,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(173,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(174,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(175,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(176,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(177,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(178,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(179,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(180,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(181,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(182,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(183,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(184,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(185,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(186,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(187,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(188,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(189,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(190,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(191,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(192,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(193,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(194,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(195,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(196,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(197,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(198,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(199,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(200,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(201,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(202,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(203,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(204,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(205,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(206,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(207,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(208,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(209,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(210,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(211,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(212,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(213,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(214,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(215,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(216,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(217,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(218,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(219,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(220,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(221,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(222,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(223,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(224,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(225,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(226,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(227,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(228,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(229,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(230,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(231,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(232,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(233,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(234,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(235,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(236,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(237,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(238,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(239,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(240,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(241,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(242,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(243,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(244,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(245,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(246,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(247,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(248,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(249,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(250,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(251,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(252,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(253,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(254,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(255,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/maps/ministation/ministation-3.dmm b/maps/ministation/ministation-3.dmm new file mode 100644 index 00000000000..c957f544da3 --- /dev/null +++ b/maps/ministation/ministation-3.dmm @@ -0,0 +1,66010 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/obj/abstract/landmark{ + name = "carpspawn" + }, +/turf/space, +/area/space) +"af" = ( +/turf/exterior/wall/random/ministation, +/area/space) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"aV" = ( +/obj/machinery/atmospherics/binary/pump/on{ + target_pressure = 200; + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"cw" = ( +/turf/simulated/floor/reinforced/airless, +/area/space) +"dp" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"dH" = ( +/turf/simulated/floor/plating, +/area/space) +"es" = ( +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/sign/warning/airlock{ + pixel_y = 26 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"gu" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"hx" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/tracker, +/turf/simulated/floor/plating, +/area/space) +"hC" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/space) +"jq" = ( +/obj/machinery/portable_atmospherics/canister/air/airlock, +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"kV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"ld" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"mI" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/space) +"nf" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/space) +"nY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/space) +"rw" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/simulated/floor/plating, +/area/space) +"rB" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/high{ + dir = 1; + pixel_y = 20 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"sD" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"tN" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4overpass) +"ug" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "roof_airlock_exterior" + }, +/obj/machinery/button/access/interior{ + id_tag = "roof_airlock"; + name = "exterior access button"; + pixel_x = -20; + command = "cycle_exterior"; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/airless, +/area/ministation/maint/l4central) +"uG" = ( +/obj/structure/lattice, +/turf/space, +/area/space) +"uQ" = ( +/turf/simulated/floor/plating, +/area/ministation/maint/l4overpass) +"vD" = ( +/obj/machinery/power/solar_control{ + dir = 8 + }, +/obj/structure/cable, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"wi" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/space) +"xN" = ( +/obj/abstract/map_data{ + height = 4 + }, +/turf/space, +/area/space) +"xZ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plating, +/area/space) +"yS" = ( +/obj/abstract/landmark{ + name = "bluespace_a" + }, +/turf/space, +/area/space) +"yX" = ( +/turf/simulated/wall, +/area/ministation/maint/l4overpass) +"zd" = ( +/obj/structure/ladder, +/obj/structure/lattice, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/open, +/area/ministation/maint/l4overpass) +"Aj" = ( +/obj/structure/cable, +/turf/simulated/floor/plating, +/area/space) +"AT" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/solar, +/turf/simulated/floor/plating, +/area/space) +"Cd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/hatch/maintenance, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"Cl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/space) +"Cu" = ( +/obj/structure/ladder, +/obj/structure/lattice, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/open, +/area/ministation/maint/l4overpass) +"CJ" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/solar, +/turf/simulated/floor/airless, +/area/space) +"Dc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"DX" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/simulated/floor/plating, +/area/space) +"Ed" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/space) +"Fa" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4overpass) +"GD" = ( +/obj/machinery/door/airlock/external/glass{ + autoset_access = 0; + name = "External Airlock Hatch"; + req_access = list("ACCESS_EXTERNAL"); + locked = 1; + id_tag = "roof_airlock_interior" + }, +/obj/machinery/button/access/interior{ + id_tag = "roof_airlock"; + name = "interior access button"; + pixel_x = 20; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"Hs" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/space) +"HM" = ( +/obj/machinery/network/relay{ + initial_network_id = "molluscnet" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"IZ" = ( +/obj/machinery/power/solar, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/space) +"Lu" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/solar, +/turf/simulated/floor/airless, +/area/space) +"Lx" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/space) +"MF" = ( +/obj/machinery/power/solar, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/space) +"Np" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"Nz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"NO" = ( +/obj/abstract/level_data_spawner/main_level, +/turf/space, +/area/space) +"SJ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/space) +"Uw" = ( +/obj/structure/lattice, +/obj/structure/ladder, +/obj/structure/cable{ + icon_state = "32-4" + }, +/obj/machinery/atmospherics/pipe/zpipe/down/supply{ + dir = 4 + }, +/turf/simulated/open, +/area/ministation/maint/l4central) +"VO" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"Wi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/simulated/floor/plating, +/area/space) +"Wl" = ( +/obj/machinery/power/smes/buildable/preset, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"XA" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ + id_tag = "roof_vent" + }, +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + id_tag = "roof_airlock"; + pixel_y = null; + tag_airpump = "roof_vent"; + tag_chamber_sensor = "roof_sensor"; + tag_exterior_door = "roof_airlock_exterior"; + tag_interior_door = "roof_airlock_interior"; + dir = 4; + pixel_x = -20 + }, +/obj/machinery/airlock_sensor{ + id_tag = "roof_sensor"; + pixel_y = 10; + pixel_x = -20; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/ministation/maint/l4central) +"Yv" = ( +/turf/simulated/wall, +/area/ministation/maint/l4central) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +NO +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(45,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(47,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(48,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +af +af +af +af +aa +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(53,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(54,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(55,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(56,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(57,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(58,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(59,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(60,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(61,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(62,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +af +aa +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(63,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(64,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(65,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(66,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(67,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(68,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(69,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(70,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +af +af +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +ab +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(71,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(72,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(73,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(74,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(75,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(76,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(77,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(78,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(79,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(80,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(81,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(82,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(83,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(84,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(85,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(86,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(87,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(88,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +yS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(89,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(90,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(91,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(92,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(93,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(94,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +af +af +af +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(95,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +af +af +af +af +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(96,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +af +af +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(97,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(98,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(99,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(100,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(101,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(102,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(103,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +hx +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(104,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +Cl +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(105,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +uG +uG +uG +uG +Cl +uG +uG +uG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(106,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Lu +Lu +Lu +AT +AT +aa +wi +aa +AT +AT +Lu +Lu +Lu +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(107,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +xZ +mI +mI +mI +mI +Aj +dH +rw +Lx +Lx +Lx +Lx +hC +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(108,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +CJ +CJ +CJ +CJ +CJ +aa +dH +aa +CJ +CJ +CJ +CJ +CJ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(109,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +uG +aa +aa +aa +dH +aa +aa +aa +uG +aa +aa +uG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(110,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Lu +Lu +Lu +Lu +Lu +aa +dH +aa +Lu +Lu +Lu +Lu +Lu +uG +uG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(111,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +xZ +mI +mI +mI +mI +Aj +dH +rw +Lx +Lx +Lx +Lx +hC +aa +uG +uG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(112,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +CJ +CJ +CJ +CJ +CJ +aa +dH +aa +CJ +CJ +CJ +CJ +CJ +cw +aa +uG +uG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(113,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +uG +aa +aa +aa +dH +aa +aa +aa +uG +cw +cw +cw +aa +Yv +Yv +Yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(114,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +IZ +IZ +IZ +IZ +IZ +aa +dH +aa +IZ +IZ +IZ +IZ +IZ +cw +aa +Yv +Uw +Yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(115,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +SJ +Wi +Wi +Wi +Wi +Aj +dH +rw +Ed +Ed +Ed +Ed +DX +cw +aa +Yv +es +Yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(116,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +MF +MF +MF +MF +MF +aa +dH +aa +MF +MF +MF +MF +MF +cw +cw +Yv +Cd +Yv +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(117,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +uG +aa +aa +aa +dH +aa +aa +aa +cw +cw +cw +cw +Yv +Yv +kV +Yv +Yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(118,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +Lu +Lu +Lu +Lu +Lu +aa +dH +aa +aa +aa +cw +cw +cw +cw +Yv +rB +aF +jq +Yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(119,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +xN +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +xZ +mI +mI +mI +mI +Aj +nf +aa +aa +aa +cw +cw +cw +Yv +Yv +Yv +aV +Np +Yv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(120,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +CJ +CJ +CJ +CJ +CJ +aa +Hs +nY +nY +nY +nY +nY +nY +ug +XA +GD +sD +Dc +Yv +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(121,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +yX +yX +aa +aa +aa +aa +aa +uG +aa +aa +aa +dH +aa +cw +cw +cw +cw +cw +Yv +Yv +Yv +Nz +Wl +Yv +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(122,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +Cu +yX +aa +aa +aa +aa +aa +uG +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +Yv +gu +VO +dp +Yv +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(123,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +Yv +HM +ld +vD +Yv +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(124,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +Yv +Yv +Yv +Yv +Yv +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(125,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +tN +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(126,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(127,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(128,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(129,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(130,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(131,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(132,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(133,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +yX +tN +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(134,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(135,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +aa +cw +cw +cw +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(136,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +yX +yX +yX +yX +yX +yX +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(137,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +yX +zd +uQ +Fa +uQ +uQ +uQ +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(138,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +yX +yX +yX +yX +yX +yX +yX +yX +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(139,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(140,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(141,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(142,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(143,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(144,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(145,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(146,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(147,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(148,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(149,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(150,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(151,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(152,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(153,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(154,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(155,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(156,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(157,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(158,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(159,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(160,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(161,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(162,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(163,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(164,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +cw +cw +cw +cw +cw +cw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(165,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(166,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(167,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(168,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(169,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(170,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(171,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(172,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(173,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(174,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(175,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(176,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(177,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(178,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(179,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(180,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(181,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(182,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(183,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(184,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(185,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(186,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(187,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(188,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(189,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(190,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(191,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(192,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(193,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(194,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(195,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(196,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(197,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(198,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(199,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(200,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(201,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(202,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(203,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(204,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(205,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(206,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(207,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(208,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(209,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(210,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(211,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(212,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(213,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(214,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(215,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(216,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(217,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(218,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(219,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(220,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(221,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(222,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(223,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(224,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(225,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(226,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(227,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(228,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(229,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(230,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(231,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(232,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(233,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(234,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(235,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(236,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(237,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(238,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(239,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(240,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(241,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(242,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(243,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(244,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(245,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(246,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(247,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(248,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(249,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(250,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(251,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(252,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(253,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(254,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(255,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 69a9050c93e..a1f6317b4f0 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -2,28 +2,70 @@ Ministation "Zebra" A butchered variant on Giacom's Ministation designed for 5 to 10 players. Now poorly imported for Nebula! +And then imported back to ScavStation! +And then copied back upstream to Neb... */ #if !defined(USING_MAP_DATUM) + #define USING_MAP_DATUM /datum/map/ministation + + #ifdef UNIT_TEST + #include "../../code/unit_tests/offset_tests.dm" + #endif + + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/neoavians/_neoavians.dme" + #include "../../mods/species/vox/_vox.dme" #include "../../mods/species/serpentid/_serpentid.dme" - - #define USING_MAP_DATUM /datum/map/ministation - - #include "ministation.dmm" - #include "space.dmm" - #include "ministation_unit_testing.dm" + #include "../../mods/species/bayliens/_bayliens.dme" + #include "../../mods/content/mundane.dm" + #include "../../mods/content/bigpharma/_bigpharma.dme" + #include "../../mods/content/government/_government.dme" + #include "../../mods/content/modern_earth/_modern_earth.dme" + #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/scaling_descriptors.dm" #include "ministation_antagonists.dm" #include "ministation_areas.dm" #include "ministation_departments.dm" + #include "ministation_documents.dm" #include "ministation_jobs.dm" #include "ministation_shuttles.dm" #include "ministation_objects.dm" + #include "ministation_unit_testing.dm" + #include "ministation_overrides.dm" + + #include "ministation-0.dmm" + #include "ministation-1.dmm" + #include "ministation-2.dmm" + #include "ministation-3.dmm" + #include "space.dmm" + + #include "../away/bearcat/bearcat.dm" + #include "../away/casino/casino.dm" + #include "../away/derelict/derelict.dm" + #include "../away/errant_pisces/errant_pisces.dm" + #include "../away/lost_supply_base/lost_supply_base.dm" + #include "../away/magshield/magshield.dm" + #include "../away/mining/mining.dm" + #include "../away/mobius_rift/mobius_rift.dm" + #include "../away/smugglers/smugglers.dm" + #include "../away/slavers/slavers_base.dm" + #include "../away/unishi/unishi.dm" + #include "../away/yacht/yacht.dm" + #include "../away/liberia/liberia.dm" + + #include "../../mods/mobs/dionaea/_dionaea.dme" + #include "../../mods/mobs/borers/_borers.dme" + + #include "ministation_overmap.dm" #include "jobs/command.dm" #include "jobs/civilian.dm" @@ -31,6 +73,7 @@ Now poorly imported for Nebula! #include "jobs/medical.dm" #include "jobs/security.dm" #include "jobs/science.dm" + #include "jobs/corporate.dm" #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" @@ -40,6 +83,7 @@ Now poorly imported for Nebula! #include "outfits/medical.dm" #include "outfits/science.dm" #include "outfits/security.dm" + #include "outfits/corporate.dm" #elif !defined(MAP_OVERRIDE) diff --git a/maps/ministation/ministation_antagonists.dm b/maps/ministation/ministation_antagonists.dm index 914948d8fdb..3d2dbfd9be4 100644 --- a/maps/ministation/ministation_antagonists.dm +++ b/maps/ministation/ministation_antagonists.dm @@ -1,5 +1,4 @@ /decl/special_role - valid_species = list(SPECIES_HUMAN) initial_spawn_req = 1 initial_spawn_target = 1 @@ -29,11 +28,11 @@ initial_spawn_target = 2 command_department_id = /decl/department/command -/datum/map/ministation/potential_theft_targets = list( +/datum/map/ministation + potential_theft_targets = list( "an owl mask" = /obj/item/clothing/mask/gas/owl_mask, "a toy ripley" = /obj/item/toy/prize/powerloader, "a collectable top hat" = /obj/item/clothing/head/collectable/tophat, - "the reactive teleport armor" = /obj/item/clothing/suit/armor/reactive, "a jetpack" = /obj/item/tank/jetpack, "a captain's jumpsuit" = /obj/item/clothing/under/captain, "a pair of magboots" = /obj/item/clothing/shoes/magboots, @@ -43,6 +42,8 @@ "the hypospray" = /obj/item/chems/hypospray, "the captain's pinpointer" = /obj/item/pinpointer, "the championship belt" = /obj/item/storage/belt/champion, + "the corporate account documents" = /obj/item/documents/corporate/account, + "the corporate personnel data" = /obj/item/documents/corporate/personnel, "the table-top spaceship model" = /obj/item/toy/shipmodel, "the AI inteliCard" = /obj/item/aicard, "the nuclear authentication disk" = /obj/item/disk/nuclear, diff --git a/maps/ministation/ministation_areas.dm b/maps/ministation/ministation_areas.dm index b8472417cec..91e6b18998a 100644 --- a/maps/ministation/ministation_areas.dm +++ b/maps/ministation/ministation_areas.dm @@ -33,17 +33,29 @@ area_flags = AREA_FLAG_HALLWAY holomap_color = HOLOMAP_AREACOLOR_HALLWAYS -/area/ministation/hall/w - name = "\improper Port Hallway" +/area/ministation/hall/n + name = "\improper Forward Hallway" -/area/ministation/hall/s - name = "\improper Aft Hallway" +// first floor hallways -/area/ministation/hall/e - name = "\improper Starboard Hallway" +/area/ministation/hall/s1 + name = "\improper L1 Aft Hallway" -/area/ministation/hall/n - name = "\improper Forward Hallway" +// second floor hallways + +/area/ministation/hall/w2 + name = "\improper L2 Port Hallway" + +/area/ministation/hall/e2 + name = "\improper L2 Starboard Hallway" + +// third floor hallways + +/area/ministation/hall/s3 + name = "\improper L3 Aft Hallway" + +/area/ministation/hall/n3 + name = "\improper L3 Forward Hallway" //Maintenance /area/ministation/maint @@ -54,29 +66,71 @@ secure = TRUE holomap_color = HOLOMAP_AREACOLOR_MAINTENANCE -/area/ministation/maint/nw - name = "\improper Port Forward Maintenance" +// First floor maint + +/area/ministation/maint/westatmos + name = "\improper West Atmos Maintenance" + +/area/ministation/maint/eastatmos + name = "\improper East Atmos Maintenance" + +// /area/ministation/maint/l1nw +// name = "\improper Level One North West Maintenance" -/area/ministation/maint/ne - name = "\improper Starboard Forward Maintenance" +/area/ministation/maint/l1ne + name = "\improper Level One North East Maintenance" -/area/ministation/maint/w - name = "\improper Port Maintenance" +/area/ministation/maint/l1central + name = "\improper Level One Central Maintenance" -/area/ministation/maint/e - name = "\improper Starboard Maintenance" +// Second Floor Maint -/area/ministation/maint/sw - name = "\improper Port Quarter Maintenance" +/area/ministation/maint/l2centraln + name = "\improper Level Two Central North Maintenance" -/area/ministation/maint/se - name = "\improper Starboard Quarter Maintenance" +/area/ministation/maint/l2centrals + name = "\improper Level Two Central South Maintenance" -/area/ministation/maint/sec +/area/ministation/maint/secmaint name = "\improper Security Maintenance" -/area/ministation/maint/detective - name = "\improper Detective Office Maintenance" +/area/ministation/maint/hydromaint + name = "\improper Hydro Maintenance" + +/area/ministation/maint/l2underpass + name = "\improper Level Two Maintenance Underpass" + +// Third Floor Maint + +/area/ministation/maint/l3nw + name = "\improper Level Three Northwest Maintenance" + +/area/ministation/maint/l3ne + name = "\improper Level Three Northeast Maintenance" + +/area/ministation/maint/l3central + name = "\improper Level Three Central Maintenance" + +/area/ministation/maint/l3sw + name = "\improper Level Three Southwest Maintenance" + +/area/ministation/maint/l3se + name = "\improper Level Three Southeast Maintenance" + +// Fourth Floor Maint +/area/ministation/maint/l4central + name = "\improper Level Four Central Maintenance" + +/area/ministation/maint/l4overpass + name = "\improper Level Four Maintenance Overpass" + +//Maint Bypasses + +/area/ministation/maint/sebypass + name = "\improper Southeast Maintenance Shaft" + +/area/ministation/maint/nebypass + name = "\improper Northeast Maintenance Shaft" //Departments /area/ministation/hop @@ -90,13 +144,14 @@ req_access = list(access_janitor) icon_state = "janitor" -/area/ministation/commons - name = "\improper Common Area" - icon_state = "pink" +/area/ministation/trash + name = "\improper Trash Room" + req_access = list(access_janitor) + icon_state = "janitor" /area/ministation/cargo name = "\improper Cargo Bay" - req_access = list(access_cargo) + req_access = list(access_mining) icon_state = "brown" secure = TRUE holomap_color = HOLOMAP_AREACOLOR_CARGO @@ -106,6 +161,7 @@ req_access = list(access_heads) secure = TRUE icon_state = "dark_blue" + holomap_color = HOLOMAP_AREACOLOR_SECURITY /area/ministation/bridge/vault name = "\improper Vault" @@ -119,7 +175,6 @@ secure = TRUE icon_state = "red" area_flags = AREA_FLAG_SECURITY - holomap_color = HOLOMAP_AREACOLOR_SECURITY /area/ministation/detective name = "\improper Detective Office" @@ -137,14 +192,6 @@ name = "\improper Library" icon_state = "LIB" -/area/ministation/disused - name = "\improper Disused Section" - icon_state = "pink" - -/area/ministation/disused_office - name = "\improper Disused Office" - icon_state = "dark_blue" - /area/ministation/atmospherics name = "\improper Atmospherics" req_access = list(access_atmospherics) @@ -153,10 +200,9 @@ /area/ministation/science name = "\improper Research & Development Laboratory" - req_access = list(access_research) + req_access = list(access_robotics) secure = TRUE icon_state = "purple" - holomap_color = HOLOMAP_AREACOLOR_SCIENCE /area/ministation/eva name = "\improper EVA Storage" @@ -172,11 +218,17 @@ holomap_color = HOLOMAP_AREACOLOR_MEDICAL /area/ministation/cryo - name = "\improper Cryogenic Storage" + name = "\improper Medical Cryogenics" req_access = list() icon_state = "green" secure = FALSE +/area/ministation/dorms + name = "\improper Dormatories" + req_access = list() + icon_state = "red" + secure = FALSE + /area/ministation/hydro name = "\improper Hydroponics" req_access = list(access_hydroponics) @@ -189,12 +241,26 @@ /area/ministation/engine name = "Engineering" - req_access = list(access_engine) + req_access = list(access_engine_equip) ambience = list('sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambieng1.ogg') secure = TRUE icon_state = "yellow" holomap_color = HOLOMAP_AREACOLOR_ENGINEERING +/area/ministation/supermatter + name = "\improper Supermatter Engine" + req_access = list(access_engine) + ambience = list('sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambieng1.ogg') + secure = TRUE + icon_state = "brown" + +/area/ministation/smcontrol + name = "\improper Supermatter Control" + req_access = list(access_engine) + ambience = list('sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambieng1.ogg') + secure = TRUE + icon_state = "red" + /area/ministation/telecomms name = "\improper Telecommunications Control" req_access = list(list(access_engine),list(access_heads)) //can get inside to monitor but not actually access anything important. Inner doors have tcomm access @@ -203,6 +269,20 @@ icon_state = "light_blue" holomap_color = HOLOMAP_AREACOLOR_ENGINEERING +/area/ministation/company_rep + name = "\improper Company Representative Chamber" + req_access = list(access_lawyer) + icon_state = "brown" + +/area/ministation/arrival + name = "\improper Arrival Shuttle" // I hate this ugly thing + icon_state = "white" + requires_power = 0 + +/area/ministation/shuttle/outgoing + name = "\improper Science Shuttle" + icon_state = "shuttle" + //satellite /area/ministation/ai_sat name = "\improper Satellite" @@ -225,3 +305,36 @@ /area/shuttle/escape_shuttle name = "\improper Emergency Shuttle" icon_state = "shuttle" + +//Elevator + +/area/turbolift + name = "\improper Elevator" + icon_state = "shuttle" + requires_power = 0 + dynamic_lighting = TRUE + sound_env = STANDARD_STATION + area_flags = AREA_FLAG_RAD_SHIELDED | AREA_FLAG_ION_SHIELDED + ambience = list( + 'sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg' + ) + + arrival_sound = null + lift_announce_str = null + +/area/turbolift/alert_on_fall(var/mob/living/carbon/human/H) + if(H.client && SSpersistence.elevator_fall_shifts > 0) + SSwebhooks.send(WEBHOOK_ELEVATOR_FALL, list("text" = "We managed to make it [SSpersistence.elevator_fall_shifts] shift\s without someone falling down an elevator shaft.")) + SSpersistence.elevator_fall_shifts = -1 + +/area/turbolift/l1 + name = "Station Level 1" + base_turf = /turf/simulated/floor + +/area/turbolift/l2 + name = "Station Level 2" + base_turf = /turf/simulated/open + +/area/turbolift/l3 + name = "Station Level 3" + base_turf = /turf/simulated/open \ No newline at end of file diff --git a/maps/ministation/ministation_areas.dmi b/maps/ministation/ministation_areas.dmi index e4389c0e3bd..bc53c1e9b8a 100644 Binary files a/maps/ministation/ministation_areas.dmi and b/maps/ministation/ministation_areas.dmi differ diff --git a/maps/ministation/ministation_define.dm b/maps/ministation/ministation_define.dm index 85ea9221e5b..10f60b50d39 100644 --- a/maps/ministation/ministation_define.dm +++ b/maps/ministation/ministation_define.dm @@ -17,6 +17,10 @@ lobby_screens = list('maps/ministation/ministation_lobby.png') + overmap_ids = list(OVERMAP_ID_SPACE) + num_exoplanets = 3 + away_site_budget = 3 + shuttle_docked_message = "The public ferry to %dock_name% has docked with the station. It will depart in approximately %ETD%" shuttle_leaving_dock = "The public ferry has left the station. Estimate %ETA% until the ferry docks at %dock_name%." shuttle_called_message = "A public ferry to %dock_name% has been scheduled. It will arrive in approximately %ETA%" @@ -39,7 +43,7 @@ radiation_detected_message = "High levels of radiation have been detected in proximity of the %STATION_NAME%. Station wide maintenance access has been granted. Please take shelter within the nearest maintenance tunnel." - allowed_spawns = list( + allowed_latejoin_spawns = list( /decl/spawnpoint/arrivals, /decl/spawnpoint/cryo ) @@ -58,7 +62,6 @@ list("name" = "Security", "key" = "s", "frequency" = 1359, "color" = COMMS_COLOR_SECURITY, "span_class" = "secradio", "secured" = list(access_security)) ) - /datum/map/ministation/get_map_info() - return "You're aboard the [station_name], an older station once used for unethical scientific research. It has long since been repurposed as deep space communication relay, though only on paper. \ - Onboard activity is at the whims of the [boss_name] who treat the station as a glorified dogsbody, and sometimes guinea pig." + return "You're aboard the [station_name], an older station once used for unethical economic research. It has long since been repurposed as deep space communication relay, though only on paper. \ + Onboard activity is at the whims of the [boss_name] who treat the station as a dumping ground for less desired personnel." \ No newline at end of file diff --git a/maps/ministation/ministation_departments.dm b/maps/ministation/ministation_departments.dm index 8c759b6850f..f77a1d5c9b3 100644 --- a/maps/ministation/ministation_departments.dm +++ b/maps/ministation/ministation_departments.dm @@ -62,10 +62,17 @@ /obj/item/robot_module/security associated_department = /decl/department/security -/obj/machinery/network/pager/security +/obj/machinery/network/pager/security department = /decl/department/security /decl/department/miscellaneous name = "Misc" display_priority = -1 display_color = "#ccffcc" + +/decl/department/corporate + name = "Corporate" + announce_channel = "Corporate" + colour = "#b98f03" + display_priority = 4 + display_color = "#ffddf0" \ No newline at end of file diff --git a/maps/ministation/ministation_documents.dm b/maps/ministation/ministation_documents.dm new file mode 100644 index 00000000000..14c3d1d8b7d --- /dev/null +++ b/maps/ministation/ministation_documents.dm @@ -0,0 +1,9 @@ +/obj/item/documents/corporate/account + name = "corporate accounting documents" + desc = "These contain exhaustive information about company dealings, with up-to-date information regarding wealth and resources controlled by the house." + description_antag = "In the wrong hands, the house could certainly find itself disavantaged in dealings in the future." + +/obj/item/documents/corporate/personnel + name = "corporate personnel data" + desc = "Corporate interests are furthered by those who serve the company. A good operation must know all who work for it." + description_antag = "An enemy of the company could use this to figure out where personnel live and who among them might be a problem to them." diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index b12bc242543..cc588b7ecc6 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -8,12 +8,90 @@ /datum/job/ministation/captain, /datum/job/ministation/cargo, /datum/job/ministation/robot, + /datum/job/ministation/computer, /datum/job/ministation/detective, /datum/job/ministation/doctor, + /datum/job/ministation/doctor/head, /datum/job/ministation/engineer, + /datum/job/ministation/engineer/head, /datum/job/ministation/hop, /datum/job/ministation/janitor, /datum/job/ministation/scientist, + /datum/job/ministation/scientist/head, /datum/job/ministation/security, - /datum/job/ministation/librarian + /datum/job/ministation/security/head, + /datum/job/ministation/librarian, + /datum/job/ministation/corporate/rep ) + species_to_job_whitelist = list( + /decl/species/vox = list( + /datum/job/ministation/assistant, + /datum/job/ministation/bartender, + /datum/job/ministation/cargo, + /datum/job/ministation/janitor, + /datum/job/ministation/scientist, + /datum/job/ministation/scientist/head, + /datum/job/ministation/engineer, + /datum/job/ministation/engineer/head, + /datum/job/ministation/detective, + /datum/job/ministation/doctor, + /datum/job/ministation/doctor/head + ), + /decl/species/neoavian = list( + /datum/job/ministation/assistant, + /datum/job/ministation/bartender, + /datum/job/ministation/cargo, + /datum/job/ministation/janitor, + /datum/job/ministation/scientist, + /datum/job/ministation/scientist/head, + /datum/job/ministation/engineer, + /datum/job/ministation/engineer/head, + /datum/job/ministation/detective, + /datum/job/ministation/doctor, + /datum/job/ministation/doctor/head + ), + /decl/species/serpentid = list( + /datum/job/ministation/assistant, + /datum/job/ministation/bartender, + /datum/job/ministation/cargo, + /datum/job/ministation/janitor, + /datum/job/ministation/scientist, + /datum/job/ministation/scientist/head, + /datum/job/ministation/engineer, + /datum/job/ministation/engineer/head, + /datum/job/ministation/detective, + /datum/job/ministation/doctor, + /datum/job/ministation/doctor/head + ), + /decl/species/adherent = list( + /datum/job/ministation/assistant, + /datum/job/ministation/bartender, + /datum/job/ministation/cargo, + /datum/job/ministation/janitor, + /datum/job/ministation/scientist, + /datum/job/ministation/scientist/head, + /datum/job/ministation/engineer, + /datum/job/ministation/engineer/head, + /datum/job/ministation/detective, + /datum/job/ministation/doctor, + /datum/job/ministation/doctor/head + ) + + ) + species_to_job_blacklist = list( + /decl/species/human = list( + /datum/job/ministation/captain, + /datum/job/ministation/robot, + /datum/job/ministation/detective, + /datum/job/ministation/doctor, + /datum/job/ministation/doctor/head, + /datum/job/ministation/engineer, + /datum/job/ministation/engineer/head, + /datum/job/ministation/hop, + /datum/job/ministation/scientist, + /datum/job/ministation/scientist/head, + /datum/job/ministation/security, + /datum/job/ministation/security/head, + /datum/job/ministation/librarian + ) + ) \ No newline at end of file diff --git a/maps/ministation/ministation_objects.dm b/maps/ministation/ministation_objects.dm index 8edc719f8e0..5acbedc536a 100644 --- a/maps/ministation/ministation_objects.dm +++ b/maps/ministation/ministation_objects.dm @@ -1,29 +1,3 @@ -/obj/abstract/ministation/random_asteroid_spawner/ - name = "random asteroid spawner" - icon = 'icons/misc/mark.dmi' - icon_state = "X" - color = COLOR_PURPLE - alpha = 255 //so it's not invisible in map editor - -/obj/abstract/ministation/random_asteroid_spawner/Initialize() - ..() - . = INITIALIZE_HINT_LATELOAD - -/obj/abstract/ministation/random_asteroid_spawner/LateInitialize(var/ml) - var/turf/space/thisturf = src.loc - if(prob(1) && istype(thisturf)) //if this turf is space there is a one percent chance of turning it into an asteroid. - generate_asteroid(70, thisturf.ChangeTurf(/turf/exterior/wall/random/ministation)) //turn the turf into an asteroid wall and call generate asteroid on it, which will generate more walls around it. - qdel(src) - -//tries to convert the space turfs around the asteroid into asteroids. -/obj/abstract/ministation/random_asteroid_spawner/proc/generate_asteroid(var/probability, var/turf/sourceasteroid) - for(var/ndir in global.cardinal) - var/turf/ad = get_step(sourceasteroid, ndir) - if(prob(probability)) - if(istype(ad, /turf/space)) //if it's space turn it into asteroid - //newasteroid = ad.ChangeTurf(/turf/exterior/wall/random/ministation) - generate_asteroid(max(10,probability-10), ad.ChangeTurf(/turf/exterior/wall/random/ministation)) //reduce the probability of conversion with 10 percent for each turf away from the starting one. - /turf/exterior/wall/random/ministation/get_weighted_mineral_list() if(prob(80)) . = list() @@ -88,28 +62,9 @@ /obj/machinery/camera/motion/ministation preset_channels = list("Satellite") -//Detective bs -/obj/item/camera_film/high - name = "high capacity film cartridge" - max_uses = 30 - uses_left = 30 - -/obj/item/camera/detective - name = "detective's camera" - desc = "A single use disposable polaroid photo camera." +/obj/machinery/camera/network/command + preset_channels = list("Command") + initial_access = list(access_bridge) -/obj/item/camera/detective/Initialize() - . = ..() - film = new /obj/item/camera_film/high(src) - -/obj/item/camera/detective/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/camera_film)) - return FALSE //Prevent reloading - return ..() - -/obj/item/camera/detective/eject_film(mob/user) - return - -/obj/item/camera/detective/get_alt_interactions(mob/user) - . = ..() - LAZYREMOVE(., /decl/interaction_handler/camera_eject_film) +/obj/machinery/camera/network/hallway + preset_channels = list("Hallway") \ No newline at end of file diff --git a/maps/ministation/ministation_overmap.dm b/maps/ministation/ministation_overmap.dm new file mode 100644 index 00000000000..678130539c2 --- /dev/null +++ b/maps/ministation/ministation_overmap.dm @@ -0,0 +1,20 @@ +/obj/effect/overmap/visitable/ship/ministation + name = "Space Station Zebra" + color = "#00ffff" + start_x = 4 + start_y = 4 + vessel_mass = 5000 + max_speed = 1/(2 SECONDS) + burn_delay = 2 SECONDS + restricted_area = 30 + sector_flags = OVERMAP_SECTOR_KNOWN|OVERMAP_SECTOR_BASE|OVERMAP_SECTOR_IN_SPACE + + initial_generic_waypoints = list( + "nav_ministation_bridge_north", + "nav_ministation_arrivals_south" + ) + + //exploration and rescue shuttles can only dock port side, b/c there's only one door. + initial_restricted_waypoints = list( + /datum/shuttle/autodock/overmap/science_shuttle = list("nav_ministation_science_dock_shuttle") + ) diff --git a/maps/ministation/ministation_overrides.dm b/maps/ministation/ministation_overrides.dm new file mode 100644 index 00000000000..508fbdaab31 --- /dev/null +++ b/maps/ministation/ministation_overrides.dm @@ -0,0 +1,10 @@ +/datum/computer_file/program/merchant/ministation + read_access = list() + +/obj/machinery/computer/modular/preset/merchant/ministation + default_software = list( + /datum/computer_file/program/merchant/ministation, + /datum/computer_file/program/email_client, + /datum/computer_file/program/wordprocessor, + /datum/computer_file/program/supply + ) diff --git a/maps/ministation/ministation_shuttles.dm b/maps/ministation/ministation_shuttles.dm index e82fc97b319..7aaac066f70 100644 --- a/maps/ministation/ministation_shuttles.dm +++ b/maps/ministation/ministation_shuttles.dm @@ -37,3 +37,57 @@ /obj/effect/shuttle_landmark/escape_shuttle/station landmark_tag = "nav_escape_shuttle_station" docking_controller = "station1" + +/obj/effect/shuttle_landmark/bridge_north + landmark_tag = "nav_ministation_bridge_north" + +/obj/effect/shuttle_landmark/arrivas_south + landmark_tag = "nav_ministation_arrivals_south" + +/obj/machinery/computer/shuttle_control/explore/ministation + name = "science shuttle console" + shuttle_tag = "Science Shuttle" + +/datum/shuttle/autodock/overmap/science_shuttle + name = "Science Shuttle" + shuttle_area = /area/ministation/shuttle/outgoing + dock_target = "science_shuttle" + current_location = "nav_ministation_science_dock_shuttle" + +/obj/effect/shuttle_landmark/science_dock + name = "Science Department Docking Arm" + docking_controller = "ministation_science_dock" + landmark_tag = "nav_ministation_science_dock_shuttle" + +/obj/effect/overmap/visitable/ship/landable/science_shuttle + name = "Science Shuttle" + shuttle = "Science Shuttle" + moving_state = "ship_moving" + max_speed = 1/(2 SECONDS) + burn_delay = 1 SECONDS + vessel_mass = 3000 + fore_dir = EAST + skill_needed = SKILL_BASIC + vessel_size = SHIP_SIZE_SMALL + +// Essentially a bare platform that moves up and down. +/obj/abstract/turbolift_spawner/ministation + name = "Tradestation cargo elevator placeholder" +// icon = 'icons/obj/turbolift_preview_nowalls_3x3.dmi' + depth = 3 + lift_size_x = 2 + lift_size_y = 2 + door_type = null + wall_type = null + firedoor_type = null + light_type = null + floor_type = /turf/simulated/floor/tiled/steel_grid + button_type = /obj/structure/lift/button/standalone + panel_type = /obj/structure/lift/panel/standalone + areas_to_use = list( + /area/turbolift/l1, + /area/turbolift/l2, + /area/turbolift/l3 + ) + floor_departure_sound = 'sound/effects/lift_heavy_start.ogg' + floor_arrival_sound = 'sound/effects/lift_heavy_stop.ogg' diff --git a/maps/ministation/ministation_unit_testing.dm b/maps/ministation/ministation_unit_testing.dm index d2242b32d00..5a9d945921f 100644 --- a/maps/ministation/ministation_unit_testing.dm +++ b/maps/ministation/ministation_unit_testing.dm @@ -8,4 +8,12 @@ /area/ministation/maint = NO_SCRUBBER|NO_VENT, /area/ministation/bridge/vault = NO_SCRUBBER|NO_VENT, /area/ministation/supply_dock = NO_SCRUBBER|NO_VENT|NO_APC, + /area/ministation/arrival = NO_SCRUBBER|NO_VENT|NO_APC, + /area/ministation/shuttle/outgoing = NO_SCRUBBER, + /area/ministation/maint/sebypass = NO_SCRUBBER|NO_VENT|NO_APC, + /area/ministation/maint/nebypass = NO_SCRUBBER|NO_VENT|NO_APC, + /area/ministation/maint/l4overpass = NO_SCRUBBER|NO_VENT|NO_APC, + /area/ministation/maint/l2underpass = NO_SCRUBBER|NO_VENT|NO_APC, + /area/turbolift = NO_SCRUBBER|NO_VENT|NO_APC, + /area/ministation/atmospherics = NO_SCRUBBER, ) diff --git a/maps/ministation/outfits/_outfits.dm b/maps/ministation/outfits/_outfits.dm index e42f30fd13b..08bbd22b146 100644 --- a/maps/ministation/outfits/_outfits.dm +++ b/maps/ministation/outfits/_outfits.dm @@ -4,4 +4,4 @@ pda_type = /obj/item/modular_computer/pda pda_slot = slot_l_store_str l_ear = null - r_ear = null \ No newline at end of file + r_ear = null diff --git a/maps/ministation/outfits/civilian.dm b/maps/ministation/outfits/civilian.dm index f5695c67e75..eb934653708 100644 --- a/maps/ministation/outfits/civilian.dm +++ b/maps/ministation/outfits/civilian.dm @@ -1,22 +1,11 @@ /decl/hierarchy/outfit/job/ministation/cargo - l_ear = /obj/item/radio/headset/ministation_headset_cargo + l_ear = /obj/item/radio/headset/headset_cargo name = "Ministation - Job - Cargo technician" uniform = /obj/item/clothing/under/cargotech id_type = /obj/item/card/id/ministation/cargo pda_type = /obj/item/modular_computer/pda/cargo backpack_contents = list(/obj/item/crowbar = 1, /obj/item/storage/ore = 1) - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL - -/obj/item/encryptionkey/ministation_headset_cargo - name = "cargo radio encryption key" - icon_state = "srv_cypherkey" - can_decrypt = list(access_cargo) - -/obj/item/radio/headset/ministation_headset_cargo - name = "supply radio headset" - desc = "A headset used by the box-pushers." - icon = 'maps/ministation/icons/headset_cargo.dmi' - encryption_keys = list(/obj/item/encryptionkey/ministation_headset_cargo) + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR /decl/hierarchy/outfit/job/ministation/cargo/Initialize() . = ..() diff --git a/maps/ministation/outfits/command.dm b/maps/ministation/outfits/command.dm index b0680406cb7..0a499acf24b 100644 --- a/maps/ministation/outfits/command.dm +++ b/maps/ministation/outfits/command.dm @@ -14,13 +14,13 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/storage/backpack/messenger/com -/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H) +/decl/hierarchy/outfit/job/ministation/captain/post_equip(var/mob/living/carbon/human/H) ..() - if(H.get_age() > 49) + if(H.get_age() > 20) // Since we can have something other than the default uniform at this // point, check if we can actually attach the medal var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) - if(uniform) + if(istype(uniform)) var/obj/item/clothing/accessory/medal/gold/medal = new() if(uniform.can_attach_accessory(medal)) uniform.attach_accessory(null, medal) @@ -32,6 +32,8 @@ uniform = /obj/item/clothing/under/head_of_personnel l_ear = /obj/item/radio/headset/heads/hop shoes = /obj/item/clothing/shoes/color/brown + r_pocket = /obj/item/gun/energy/taser + hands = list(/obj/item/clothing/suit/armor/bulletproof) id_type = /obj/item/card/id/silver pda_type = /obj/item/modular_computer/pda/heads/hop backpack_contents = list(/obj/item/storage/box/ids = 1) diff --git a/maps/ministation/outfits/corporate.dm b/maps/ministation/outfits/corporate.dm new file mode 100644 index 00000000000..892411a9d66 --- /dev/null +++ b/maps/ministation/outfits/corporate.dm @@ -0,0 +1,9 @@ +/decl/hierarchy/outfit/job/ministation/corporate + name = "Ministation - Company Representative" + id_type = /obj/item/card/id/ministation/corporate_rep + +/obj/item/card/id/ministation/corporate_rep + name = "identification card" + desc = "A card issued to Company Representatives." + color = COLOR_GOLD + extra_details = list("goldstripe") diff --git a/maps/ministation/outfits/engineering.dm b/maps/ministation/outfits/engineering.dm index daeedf3c563..994ca44c6ed 100644 --- a/maps/ministation/outfits/engineering.dm +++ b/maps/ministation/outfits/engineering.dm @@ -4,7 +4,7 @@ l_ear = /obj/item/radio/headset/headset_eng shoes = /obj/item/clothing/shoes/workboots pda_slot = slot_l_store_str - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR head = /obj/item/clothing/head/hardhat uniform = /obj/item/clothing/under/engineer r_pocket = /obj/item/t_scanner @@ -15,7 +15,16 @@ . = ..() BACKPACK_OVERRIDE_ENGINEERING +/decl/hierarchy/outfit/job/ministation/engineer/head + name = "Job - Head Engineer" + glasses = /obj/item/clothing/glasses/welding/superior + suit = /obj/item/clothing/suit/storage/hazardvest + gloves = /obj/item/clothing/gloves/thick + pda_type = /obj/item/modular_computer/pda/heads/ce + hands = list(/obj/item/wrench) + l_ear = /obj/item/radio/headset/heads/ce + /obj/item/card/id/ministation/engineering name = "identification card" desc = "A card issued to engineering staff." - detail_color = COLOR_SUN \ No newline at end of file + detail_color = COLOR_SUN diff --git a/maps/ministation/outfits/medical.dm b/maps/ministation/outfits/medical.dm index 43211f92686..889d72e4d73 100644 --- a/maps/ministation/outfits/medical.dm +++ b/maps/ministation/outfits/medical.dm @@ -3,7 +3,7 @@ shoes = /obj/item/clothing/shoes/color/white pda_type = /obj/item/modular_computer/pda/medical pda_slot = slot_l_store_str - name = "Ministation - Job - Medical Doctor" + name = "Ministation - Job - Junior Doctor" uniform = /obj/item/clothing/under/medical hands = list(/obj/item/storage/firstaid/adv) r_pocket = /obj/item/flashlight/pen @@ -13,7 +13,14 @@ . = ..() BACKPACK_OVERRIDE_MEDICAL +/decl/hierarchy/outfit/job/ministation/doctor/head + name = "Ministation - Job - Head Doctor" + l_ear = /obj/item/radio/headset/heads/cmo + uniform = /obj/item/clothing/under/det/black + shoes = /obj/item/clothing/shoes/dress + r_pocket = /obj/item/chems/hypospray + /obj/item/card/id/ministation/doctor name = "identification card" desc = "A card issued to medical staff." - detail_color = COLOR_PALE_BLUE_GRAY \ No newline at end of file + detail_color = COLOR_PALE_BLUE_GRAY diff --git a/maps/ministation/outfits/science.dm b/maps/ministation/outfits/science.dm index 22c45d2da3b..96f3f4daeb1 100644 --- a/maps/ministation/outfits/science.dm +++ b/maps/ministation/outfits/science.dm @@ -2,11 +2,23 @@ l_ear = /obj/item/radio/headset/headset_sci shoes = /obj/item/clothing/shoes/color/white pda_type = /obj/item/modular_computer/pda/science - name = "Ministation - Job - Scientist" + name = "Ministation - Job - Researcher" uniform = /obj/item/clothing/under/color/white id_type = /obj/item/card/id/ministation/scientist /obj/item/card/id/ministation/scientist name = "identification card" desc = "A card issued to science staff." - detail_color = COLOR_PALE_PURPLE_GRAY \ No newline at end of file + detail_color = COLOR_PALE_PURPLE_GRAY + +/decl/hierarchy/outfit/job/ministation/scientist/head + name = "Tradeship - Job - Head Researcher" + l_ear = /obj/item/radio/headset/heads/rd + shoes = /obj/item/clothing/shoes/dress + pda_type = /obj/item/modular_computer/pda/science + id_type = /obj/item/card/id/ministation/scientist/head + +/obj/item/card/id/ministation/scientist/head + name = "identification card" + desc = "A card which represents knowledge and reasoning." + extra_details = list("goldstripe") \ No newline at end of file diff --git a/maps/ministation/outfits/security.dm b/maps/ministation/outfits/security.dm index b790a784097..474514ad922 100644 --- a/maps/ministation/outfits/security.dm +++ b/maps/ministation/outfits/security.dm @@ -3,8 +3,8 @@ decals = list("stripe" = COLOR_RED_LIGHT) /decl/hierarchy/outfit/job/ministation/security + l_ear = /obj/item/radio/headset/headset_sec glasses = /obj/item/clothing/glasses/sunglasses/sechud - l_ear = /obj/item/radio/headset/ministation_headset_sec gloves = /obj/item/clothing/gloves/thick shoes = /obj/item/clothing/shoes/jackboots backpack_contents = list(/obj/item/handcuffs = 1) @@ -15,16 +15,9 @@ id_type = /obj/item/card/id/ministation/security pda_type = /obj/item/modular_computer/pda/security -/obj/item/encryptionkey/ministation_headset_sec - name = "security radio encryption key" - icon_state = "srv_cypherkey" - can_decrypt = list(access_security) - -/obj/item/radio/headset/ministation_headset_sec - name = "security radio headset" - desc = "This is used by your elite security force." - icon = 'maps/ministation/icons/headset_security.dmi' - encryption_keys = list(/obj/item/encryptionkey/ministation_headset_sec) +/decl/hierarchy/outfit/job/ministation/security/head + l_ear = /obj/item/radio/headset/heads/hos + name = "Ministation - Job - Head of Security" /decl/hierarchy/outfit/job/ministation/security/Initialize() . = ..() @@ -42,7 +35,7 @@ name = "Ministation - Job - Detective" head = /obj/item/clothing/head/det glasses = /obj/item/clothing/glasses/sunglasses/sechud - l_ear = /obj/item/radio/headset/ministation_headset_sec + l_ear = /obj/item/radio/headset/headset_sec uniform = /obj/item/clothing/under/det suit = /obj/item/clothing/suit/storage/det_trench l_pocket = /obj/item/flame/lighter/zippo diff --git a/maps/ministation/space.dmm b/maps/ministation/space.dmm index 8035ee94e44..cf719610920 100644 --- a/maps/ministation/space.dmm +++ b/maps/ministation/space.dmm @@ -106,7 +106,8 @@ "au" = ( /obj/machinery/airlock_sensor{ id_tag = "shuttle3_sensor"; - pixel_y = -20 + pixel_y = -20; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; @@ -238,13 +239,15 @@ /area/shuttle/escape_shuttle) "aJ" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = -30 + pixel_y = -29; + dir = 1 }, /turf/simulated/floor/shuttle/blue, /area/shuttle/escape_shuttle) "aK" = ( /obj/machinery/status_display{ - pixel_y = -30 + pixel_y = -30; + dir = 1 }, /turf/simulated/floor/shuttle/blue, /area/shuttle/escape_shuttle) @@ -257,7 +260,7 @@ /area/shuttle/escape_shuttle) "aN" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 30 + pixel_y = 29 }, /turf/simulated/floor/shuttle/yellow, /area/shuttle/escape_shuttle) @@ -359,7 +362,8 @@ "hM" = ( /obj/machinery/airlock_sensor{ id_tag = "shuttle2_sensor"; - pixel_y = -20 + pixel_y = -20; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; @@ -373,7 +377,8 @@ "qu" = ( /obj/machinery/airlock_sensor{ id_tag = "shuttle1_sensor"; - pixel_y = -20 + pixel_y = -20; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; @@ -404,7 +409,7 @@ "Kt" = ( /obj/structure/window/borosilicate_reinforced, /obj/structure/showcase{ - desc = "It's actually a yinglet inside the box piloting the shuttle but don't tell anyone."; + desc = "It's actually a possum inside the box piloting the shuttle but don't tell anyone."; icon_state = "message_server_o_off"; name = "auto-pilot system" }, @@ -433,6 +438,10 @@ }, /turf/simulated/floor/shuttle/blue, /area/shuttle/escape_shuttle) +"Pe" = ( +/obj/abstract/level_data_spawner/admin_level, +/turf/space, +/area/space) "Qd" = ( /obj/machinery/atmospherics/pipe/manifold{ dir = 8 @@ -453,10 +462,6 @@ /obj/effect/step_trigger/teleporter/random, /turf/space/transit/north, /area/space) -"YY" = ( -/obj/abstract/level_data_spawner/admin_level, -/turf/space, -/area/space) (1,1,1) = {" UO @@ -715,7 +720,7 @@ aa aa aa aa -aa +Pe aa "} (3,1,1) = {" @@ -844,7 +849,7 @@ aa aa aa aa -YY +aa aa aa "} @@ -2006,10 +2011,10 @@ ab ab ac ac -ac Mu -KH ac +ac +KH ab ab tC @@ -2136,10 +2141,10 @@ tC ab ab ab -ae -ab ab ae +ae +ab ab ab tC diff --git a/maps/modpack_testing/blank.dmm b/maps/modpack_testing/blank.dmm index 6d50a5c258f..53af9def94a 100644 --- a/maps/modpack_testing/blank.dmm +++ b/maps/modpack_testing/blank.dmm @@ -16,6 +16,10 @@ /obj/abstract/level_data_spawner/player, /turf/space, /area/space) +"X" = ( +/obj/abstract/landmark/latejoin/observer, +/turf/space, +/area/space) (1,1,1) = {" a @@ -60,7 +64,7 @@ a a a a -a +X a a a diff --git a/maps/modpack_testing/modpack_testing_define.dm b/maps/modpack_testing/modpack_testing_define.dm index edaf134b62d..f5b09decd1f 100644 --- a/maps/modpack_testing/modpack_testing_define.dm +++ b/maps/modpack_testing/modpack_testing_define.dm @@ -2,5 +2,5 @@ name = "Modpack Testing" full_name = "Modpack Testing District" path = "modpack_testing" - allowed_spawns = list() + allowed_latejoin_spawns = list() default_spawn = null diff --git a/maps/planets/test_planet/neutralia-1.dmm b/maps/planets/test_planet/neutralia-1.dmm index 3cb9eb6bfec..e26bb0a323a 100644 --- a/maps/planets/test_planet/neutralia-1.dmm +++ b/maps/planets/test_planet/neutralia-1.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/exterior/volcanic, +/turf/exterior/rock/volcanic, /area/exoplanet/underground/neutralia/bottom) "b" = ( /turf/unsimulated/mineral, @@ -10,7 +10,7 @@ /area/exoplanet/underground/neutralia/bottom) "d" = ( /obj/abstract/level_data_spawner/neutralia/bottom, -/turf/exterior/volcanic, +/turf/exterior/rock/volcanic, /area/exoplanet/underground/neutralia/bottom) (1,1,1) = {" diff --git a/maps/planets/test_planet/test_planet.dm b/maps/planets/test_planet/test_planet.dm index 09f87eaab30..b9557cf13a6 100644 --- a/maps/planets/test_planet/test_planet.dm +++ b/maps/planets/test_planet/test_planet.dm @@ -142,7 +142,7 @@ name = "neutralia abyssal depths" level_id = "neutralia_abyssal_depths" base_area = /area/exoplanet/underground/neutralia/bottom - base_turf = /turf/exterior/volcanic + base_turf = /turf/exterior/rock/volcanic /obj/abstract/level_data_spawner/neutralia/sky level_data_type = /datum/level_data/planetoid/neutralia/sky diff --git a/maps/planets_testing/planets_testing_define.dm b/maps/planets_testing/planets_testing_define.dm index ed547504cb4..c82359943fd 100644 --- a/maps/planets_testing/planets_testing_define.dm +++ b/maps/planets_testing/planets_testing_define.dm @@ -3,14 +3,19 @@ full_name = "Planets Testing" path = "planets_testing" overmap_ids = list(OVERMAP_ID_SPACE) - allowed_spawns = list() + allowed_latejoin_spawns = list() default_spawn = null +// Set the observer spawn to include every flag so that CI flag checks pass. +/decl/spawnpoint/observer + spawn_flags = (SPAWN_FLAG_GHOSTS_CAN_SPAWN | SPAWN_FLAG_JOBS_CAN_SPAWN | SPAWN_FLAG_PRISONERS_CAN_SPAWN | SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) + /datum/map/planet_testing/build_planets() report_progress("Instantiating planets...") //Spawn all templates once spawn_planet_templates(list_values(get_all_planet_templates())) - + // Place an observer landmark just to appease CI and on the off-chance that anyone ever wants to observer. + new /obj/abstract/landmark/latejoin/observer(locate(round(world.maxx/2), round(world.maxy/2), world.maxz)) report_progress("Finished instantiating planets.") diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm b/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm index 17e6dded4cf..ec5e6c448bc 100644 --- a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm +++ b/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm @@ -57,7 +57,7 @@ to_chat(user, SPAN_NOTICE("You pry out the data drive from \the [src].")) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) var/obj/item/stock_parts/computer/hard_drive/cluster/drive = new(get_turf(src)) - drive.origin_tech = "{'[TECH_DATA]':[rand(4,5)],'[TECH_ENGINEERING]':[rand(4,5)],'[TECH_EXOTIC_MATTER]':[rand(4,5)],'[TECH_COMBAT]':[rand(2,5)],'[TECH_ESOTERIC]':[rand(0,6)]}" + drive.origin_tech = @'{"[TECH_DATA]":[rand(4,5)],"[TECH_ENGINEERING]":[rand(4,5)],"[TECH_EXOTIC_MATTER]":[rand(4,5)],"[TECH_COMBAT]":[rand(2,5)],"[TECH_ESOTERIC]":[rand(0,6)]}' disk_looted = TRUE return TRUE . = ..() diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/farmbot.dmi b/maps/random_ruins/exoplanet_ruins/hydrobase/farmbot.dmi index ca1bea0e5f2..126d4a3b1d9 100644 Binary files a/maps/random_ruins/exoplanet_ruins/hydrobase/farmbot.dmi and b/maps/random_ruins/exoplanet_ruins/hydrobase/farmbot.dmi differ diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm index a5b3ed11b3c..453e7fb4ffb 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dm @@ -84,8 +84,7 @@ /mob/living/simple_animal/hostile/retaliate/goat/hydro name = "goat" desc = "An impressive goat, in size and coat. His horns look pretty serious!" - health = 100 - maxHealth = 100 + mob_default_max_health = 100 natural_weapon = /obj/item/natural_weapon/hooves/strong faction = "farmbots" @@ -99,8 +98,7 @@ speak = list("Initiating harvesting subrout-ine-ine.", "Connection timed out.", "Connection with master AI syst-tem-tem lost.", "Core systems override enab-...") emote_see = list("beeps repeatedly", "whirrs violently", "flashes its indicator lights", "emits a ping sound") faction = "farmbots" - health = 225 - maxHealth = 225 + mob_default_max_health = 225 malfunctioning = 0 /mob/living/simple_animal/hostile/retaliate/malf_drone/hydro/Initialize() @@ -109,7 +107,7 @@ projectiletype = /obj/item/projectile/beam/drone/weak /mob/living/simple_animal/hostile/retaliate/malf_drone/hydro/emp_act(severity) - health -= rand(5,10) * (severity + 1) + adjustFireLoss(rand(5,10) * (severity + 1)) disabled = rand(15, 30) malfunctioning = 1 hostile_drone = 1 diff --git a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm index fa0b90a26b3..308925e48de 100644 --- a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm +++ b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm @@ -155,7 +155,7 @@ /area/template_noop) "C" = ( /obj/structure/table/woodentable, -/obj/machinery/computer/atmoscontrol/laptop{ +/obj/machinery/computer/central_atmos/laptop{ desc = "A cheap, beat-up old laptop."; name = "old laptop" }, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index fcf66f38351..2bd7b80c00a 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -1661,8 +1661,8 @@ /area/map_template/colony/atmospherics) "dQ" = ( /obj/structure/closet/crate/freezer, -/obj/item/chems/ivbag/nanoblood, -/obj/item/chems/ivbag/nanoblood, +/obj/item/chems/ivbag/blood/nanoblood, +/obj/item/chems/ivbag/blood/nanoblood, /turf/simulated/floor/tiled/freezer, /area/map_template/colony/surgery) "dR" = ( @@ -3926,7 +3926,7 @@ dir = 4 }, /obj/structure/casino/roulette_chart{ - density = TRUE + density = 1 }, /turf/simulated/floor/wood/walnut, /area/map_template/colony/commons) @@ -4242,7 +4242,7 @@ /obj/machinery/reagent_temperature, /obj/item/chems/drinks/shaker, /obj/machinery/vending/boozeomat{ - density = FALSE; + density = 0; pixel_y = -32; req_access = list() }, @@ -4795,7 +4795,7 @@ dir = 4 }, /obj/structure/casino/roulette{ - density = TRUE + density = 1 }, /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 @@ -6331,7 +6331,6 @@ icon_state = "1-2" }, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "colmainblast"; name = "Entry Blast Door" }, @@ -6386,7 +6385,6 @@ icon_state = "1-2" }, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "colmainexit" }, /turf/simulated/floor/tiled/techfloor, @@ -6498,7 +6496,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "colmainblast"; name = "Entry Blast Door" }, @@ -7230,7 +7227,6 @@ dir = 8 }, /obj/machinery/door/blast/regular/open{ - icon_state = "pdoor0"; id_tag = "colmainexit" }, /turf/simulated/floor/tiled/techfloor, diff --git a/maps/tradeship/jobs/_goals.dm b/maps/tradeship/jobs/_goals.dm index bc7e9be65bc..c0c13ad937d 100644 --- a/maps/tradeship/jobs/_goals.dm +++ b/maps/tradeship/jobs/_goals.dm @@ -27,10 +27,10 @@ var/global/list/tradeship_paperwork_end_areas = list() paperwork_types = list(/obj/item/paperwork/tradeship) signatory_job_list = list(/datum/job/tradeship_captain, /datum/job/tradeship_first_mate) -/datum/goal/department/paperwork/tradeship/get_spawn_turfs() +/datum/goal/department/paperwork/tradeship/get_paper_spawn_turfs() return global.tradeship_paperwork_spawn_turfs -/datum/goal/department/paperwork/tradeship/get_end_areas() +/datum/goal/department/paperwork/tradeship/get_paper_end_areas() return global.tradeship_paperwork_end_areas /obj/item/paperwork/tradeship diff --git a/maps/tradeship/jobs/civilian.dm b/maps/tradeship/jobs/civilian.dm index ef5e54bfd27..01802f673c8 100644 --- a/maps/tradeship/jobs/civilian.dm +++ b/maps/tradeship/jobs/civilian.dm @@ -16,7 +16,7 @@ event_categories = list(ASSIGNMENT_GARDENER, ASSIGNMENT_JANITOR) /datum/job/tradeship_deckhand/get_access() - if(config.assistant_maint) + if(get_config_value(/decl/config/toggle/assistant_maint)) return list(access_maint_tunnels) else return list() diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index 5aee0bdb2b1..3cb07038328 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -29,7 +29,7 @@ not_random_selectable = 1 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/tradeship_captain/equip(var/mob/living/carbon/human/H) +/datum/job/tradeship_captain/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship diff --git a/maps/tradeship/jobs/synthetics.dm b/maps/tradeship/jobs/synthetics.dm index 21cbc2cb15c..9e0664ea8f0 100644 --- a/maps/tradeship/jobs/synthetics.dm +++ b/maps/tradeship/jobs/synthetics.dm @@ -22,7 +22,7 @@ if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/tradeship_robot/equip(var/mob/living/carbon/human/H) +/datum/job/tradeship_robot/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) return !!H /datum/job/tradeship_robot/New() diff --git a/maps/tradeship/outfits/engineering.dm b/maps/tradeship/outfits/engineering.dm index b67ff40b074..db7f074405b 100644 --- a/maps/tradeship/outfits/engineering.dm +++ b/maps/tradeship/outfits/engineering.dm @@ -1,13 +1,13 @@ /decl/hierarchy/outfit/job/tradeship/hand/engine name = "Tradeship - Job - Junior Engineer" head = /obj/item/clothing/head/hardhat - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL id_type = /obj/item/card/id/tradeship/engineering shoes = /obj/item/clothing/shoes/workboots hands = list(/obj/item/wrench) belt = /obj/item/storage/belt/utility/full r_pocket = /obj/item/radio l_ear = /obj/item/radio/headset/headset_eng + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR /obj/item/card/id/tradeship/engineering name = "identification card" @@ -26,7 +26,7 @@ belt = /obj/item/storage/belt/utility/full id_type = /obj/item/card/id/tradeship/engineering/head r_pocket = /obj/item/radio - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL + outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL | OUTFIT_HAS_VITALS_SENSOR l_ear = /obj/item/radio/headset/heads/ce /obj/item/card/id/tradeship/engineering/head diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index cd0610257f3..ce95540085e 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -4,13 +4,10 @@ /area/space) "ab" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, @@ -31,7 +28,7 @@ /area/ship/trade/undercomms) "ad" = ( /obj/structure/door/wood{ - name = "matriarch's quarters" + name = "captain's quarters" }, /obj/structure/cable{ icon_state = "4-8" @@ -56,13 +53,10 @@ /area/ship/trade/loading_bay) "ah" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, @@ -72,13 +66,10 @@ /area/space) "aj" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, @@ -134,7 +125,8 @@ dir = 9 }, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /obj/structure/cable{ icon_state = "1-4" @@ -151,13 +143,10 @@ /area/space) "at" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, @@ -203,7 +192,7 @@ /obj/machinery/button/access/interior{ dir = 1; id_tag = "lower_cargo"; - pixel_y = -18 + pixel_y = -22 }, /turf/simulated/floor/tiled/steel_grid, /area/ship/trade/loading_bay) @@ -445,7 +434,8 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_y = -20 + pixel_y = -20; + dir = 1 }, /obj/structure/cable{ icon_state = "4-8" @@ -465,13 +455,10 @@ /area/ship/trade/fore_port_underside_maint) "aV" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -487,39 +474,30 @@ /area/ship/trade/livestock) "aX" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, /area/ship/trade/loading_bay) "aY" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, /area/ship/trade/aft_port_underside_maint) "aZ" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor/autoset, /turf/simulated/floor/plating, @@ -564,7 +542,8 @@ /area/ship/trade/loading_bay) "bd" = ( /obj/machinery/button/access/exterior/cabled{ - id_tag = "lower_cargo" + id_tag = "lower_cargo"; + pixel_y = 24 }, /obj/structure/cable{ icon_state = "0-4" @@ -768,7 +747,7 @@ "bG" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/effect/floor_decal/corner/beige{ dir = 5 @@ -788,7 +767,7 @@ "bJ" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/structure/reagent_dispensers/watertank, /turf/simulated/floor, @@ -796,7 +775,7 @@ "bK" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/structure/reagent_dispensers/beerkeg, /obj/random/mre/sauce/crayon, @@ -1012,7 +991,7 @@ "cX" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/effect/floor_decal/corner/beige{ dir = 9 @@ -1039,7 +1018,7 @@ /obj/structure/window/basic, /obj/structure/curtain/open/bed{ icon_state = "closed"; - opacity = TRUE + opacity = 1 }, /obj/effect/floor_decal/corner/beige{ dir = 10 @@ -1316,7 +1295,7 @@ /obj/structure/window/basic, /obj/structure/curtain/open/bed{ icon_state = "closed"; - opacity = TRUE + opacity = 1 }, /turf/simulated/floor/plating, /area/ship/trade/loading_bay) @@ -1344,7 +1323,7 @@ /obj/item/chems/glass/rag, /obj/item/chems/glass/bucket, /obj/machinery/firealarm{ - pixel_y = 25 + pixel_y = 21 }, /obj/structure/closet, /turf/simulated/floor/tiled, @@ -1438,7 +1417,8 @@ name = "shank" }, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 32; + dir = 4 }, /turf/simulated/floor, /area/ship/trade/fore_port_underside_maint) @@ -1470,7 +1450,7 @@ }, /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/tiled/white, /area/ship/trade/livestock) @@ -1883,17 +1863,18 @@ id_tag = "xenovent"; name = "vent control"; pixel_x = 6; - pixel_y = -24 + pixel_y = -24; + dir = 1 }, /obj/structure/extinguisher_cabinet{ pixel_x = -8; - pixel_y = -28 + pixel_y = -29; + dir = 1 }, /turf/simulated/floor/tiled/white, /area/ship/trade/livestock) "LO" = ( /obj/structure/sign/warning/deathsposal{ - dir = 1; pixel_y = 32 }, /turf/simulated/floor, @@ -1902,7 +1883,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/undercomms) @@ -1918,7 +1899,8 @@ /area/ship/trade/livestock) "MI" = ( /obj/machinery/light_switch{ - pixel_x = 20 + pixel_x = 24; + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -2042,7 +2024,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -2068,7 +2050,7 @@ /area/ship/trade/loading_bay) "SS" = ( /obj/item/radio/intercom{ - pixel_y = 25 + pixel_y = 20 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor, diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index ee46758f064..8cfaa0d7f41 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -18,13 +18,10 @@ id_tag = "cargo_out" }, /obj/machinery/shield_diffuser, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/cargo/lower) @@ -36,16 +33,14 @@ dir = 1; id_tag = "cargo"; pixel_x = 24; - pixel_y = 11 + pixel_y = 11; + directional_offset = null }, /obj/machinery/shield_diffuser, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/cargo/lower) @@ -69,13 +64,10 @@ /area/ship/trade/escape_port) "ai" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -108,26 +100,20 @@ /turf/simulated/wall/r_wall, /area/ship/trade/cargo/lower) "am" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/airless, /area/ship/trade/crew/dorms1) "an" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -159,13 +145,10 @@ /area/ship/trade/escape_port) "at" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -264,13 +247,10 @@ /obj/machinery/door/airlock/external/bolted{ id_tag = "eva_in" }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/tiled/steel_ridged, /area/ship/trade/maintenance/eva) @@ -386,7 +366,8 @@ dir = 4; id_tag = "eva"; pixel_x = 12; - pixel_y = 24 + pixel_y = 24; + directional_offset = null }, /turf/simulated/floor/tiled/steel_ridged, /area/ship/trade/maintenance/eva) @@ -476,14 +457,16 @@ /obj/structure/table, /obj/machinery/button/blast_door{ id_tag = "anomvent"; - name = "emergency vent control" + name = "emergency vent control"; + directional_offset = null }, /turf/simulated/floor/tiled/white, /area/ship/trade/artifact_storage) "ba" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light_switch{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/machinery/power/apc{ dir = 1; @@ -578,7 +561,8 @@ /area/ship/trade/cargo/lower) "bi" = ( /obj/structure/sign/deck/second{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/structure/ladder, /obj/structure/cable{ @@ -601,7 +585,7 @@ }, /obj/machinery/light_switch{ pixel_x = 9; - pixel_y = 21 + pixel_y = 25 }, /obj/effect/floor_decal/corner/beige{ dir = 5 @@ -805,7 +789,8 @@ /obj/random/clothing, /obj/random/clothing, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/lino, /area/ship/trade/crew/dorms1) @@ -965,10 +950,6 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/light_switch{ - pixel_x = 9; - pixel_y = 21 - }, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -981,6 +962,10 @@ pixel_y = 22 }, /obj/random/gloves, +/obj/machinery/light_switch{ + pixel_x = 9; + pixel_y = 25 + }, /turf/simulated/floor/lino, /area/ship/trade/crew/dorms2) "cp" = ( @@ -1001,13 +986,10 @@ /area/ship/trade/crew/dorms2) "cr" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor, @@ -1100,7 +1082,8 @@ dir = 9 }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -24; + dir = 4 }, /obj/structure/railing/mapped{ dir = 4 @@ -1123,7 +1106,8 @@ /obj/item/bikehorn, /obj/item/storage/fancy/crayons, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/lino, /area/ship/trade/crew/dorms2) @@ -1188,19 +1172,18 @@ /area/ship/trade/cargo/lower) "cZ" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor, /area/ship/trade/science) "da" = ( -/obj/machinery/seed_storage/xenobotany, +/obj/machinery/seed_storage/xenobotany{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/ship/trade/science) "db" = ( @@ -1226,7 +1209,8 @@ dir = 9 }, /obj/structure/sign/deck/second{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) @@ -1438,7 +1422,8 @@ pixel_x = 11 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/ship/trade/science) @@ -1473,14 +1458,15 @@ }, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /turf/simulated/floor/tiled/dark, /area/ship/trade/drunk_tank) "dO" = ( /obj/machinery/botany/editor, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/white, /area/ship/trade/science) @@ -1663,18 +1649,15 @@ /obj/item/clothing/mask/breath, /obj/machinery/light_switch{ pixel_x = 9; - pixel_y = 21 + pixel_y = 25 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/eva) "er" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/eva) @@ -1795,7 +1778,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 24; + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -1839,7 +1823,7 @@ "eY" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -25 + pixel_y = -30 }, /obj/structure/reagent_dispensers/fueltank, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -1893,7 +1877,7 @@ }, /obj/machinery/alarm{ dir = 1; - pixel_y = -32 + pixel_y = -21 }, /obj/structure/cable{ icon_state = "0-4" @@ -1955,7 +1939,7 @@ /obj/structure/tank_rack/oxygen, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/eva) @@ -2006,7 +1990,8 @@ icon_state = "railing0" }, /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -20; + dir = 1 }, /turf/simulated/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) @@ -2015,7 +2000,7 @@ /obj/structure/railing/mapped, /obj/structure/closet/coffin, /obj/random/drinkbottle, -/obj/item/contraband/poster, +/obj/item/poster, /turf/simulated/floor/tiled/monotile, /area/ship/trade/cargo/lower) "it" = ( @@ -2028,7 +2013,8 @@ dir = 4 }, /obj/structure/sign/department/science_1{ - pixel_x = -30 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/tiled, /area/ship/trade/maintenance/lower) @@ -2048,6 +2034,10 @@ /obj/machinery/light{ dir = 1 }, +/obj/structure/sign/warning/caution{ + dir = 4; + pixel_x = -34 + }, /turf/simulated/floor/reinforced, /area/ship/trade/artifact_storage) "iS" = ( @@ -2069,7 +2059,7 @@ }, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /obj/abstract/landmark/latejoin/cryo, /obj/structure/cable{ @@ -2215,7 +2205,7 @@ }, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /obj/structure/cable{ icon_state = "4-8" @@ -2340,7 +2330,7 @@ /obj/machinery/fabricator, /obj/machinery/light_switch{ pixel_x = 9; - pixel_y = 21 + pixel_y = 25 }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) @@ -2476,7 +2466,8 @@ icon_state = "1-2" }, /obj/structure/sign/department/xenoflora{ - pixel_x = -30 + pixel_x = -32; + dir = 4 }, /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, @@ -2500,7 +2491,7 @@ "uX" = ( /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/lower) @@ -2529,7 +2520,8 @@ }, /obj/machinery/fabricator/robotics, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/white, /area/ship/trade/science/fabricaton) @@ -2591,7 +2583,8 @@ icon_state = "bulb1" }, /obj/structure/sign/poster{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/item/radio/intercom{ pixel_y = 22 @@ -2619,6 +2612,13 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, /area/ship/trade/maintenance/lower) +"yT" = ( +/obj/structure/sign/warning/caution{ + dir = 4; + pixel_x = -34 + }, +/turf/simulated/floor/reinforced, +/area/ship/trade/artifact_storage) "zb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -2638,7 +2638,6 @@ backwards = 8; dir = 9; forwards = 2; - icon_state = "conveyor1"; id_tag = "con"; movedir = 6 }, @@ -2685,10 +2684,12 @@ /obj/structure/bed/padded, /obj/item/bedsheet/mime, /obj/machinery/light_switch{ - pixel_y = -24 + pixel_y = -20; + dir = 1 }, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 32; + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/ship/trade/drunk_tank) @@ -2719,14 +2720,14 @@ /obj/structure/holostool, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /turf/simulated/floor/lino, /area/ship/trade/crew/dorms1) "De" = ( /obj/machinery/alarm{ dir = 1; - pixel_y = -32 + pixel_y = -21 }, /turf/simulated/floor/tiled/white, /area/ship/trade/science) @@ -2821,7 +2822,8 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) @@ -2941,7 +2943,7 @@ /obj/item/storage/briefcase, /obj/machinery/firealarm{ dir = 1; - pixel_y = -24 + pixel_y = -21 }, /turf/simulated/floor/lino, /area/ship/trade/crew/dorms2) @@ -2952,12 +2954,9 @@ /area/ship/trade/cargo/lower) "LA" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/cargo/lower) @@ -3086,7 +3085,8 @@ /obj/machinery/door/airlock/hatch/autoname/general, /obj/machinery/door/firedoor, /obj/structure/sign/warning/fall{ - pixel_x = 32 + pixel_x = 34; + dir = 8 }, /turf/simulated/floor/tiled, /area/ship/trade/cargo/lower) @@ -3098,10 +3098,12 @@ /turf/simulated/floor/tiled/white, /area/ship/trade/science/fabricaton) "Qg" = ( -/obj/effect/paint/brown, -/obj/structure/sign/warning/caution, -/turf/simulated/wall/r_wall, -/area/ship/trade/artifact_storage) +/obj/structure/sign/warning/caution{ + dir = 8; + pixel_x = 34 + }, +/turf/space, +/area/space) "QK" = ( /obj/item/stock_parts/console_screen, /obj/item/stock_parts/console_screen, @@ -3113,7 +3115,7 @@ /obj/structure/rack, /obj/machinery/power/apc{ name = "south bump"; - pixel_y = -24 + pixel_y = -22 }, /obj/structure/cable, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -3146,7 +3148,8 @@ /obj/machinery/button/blast_door{ id_tag = "rndshutters"; name = "Desk Shutters"; - pixel_x = -25 + pixel_x = -24; + dir = 4 }, /obj/machinery/computer/design_console{ dir = 4 @@ -3156,7 +3159,7 @@ "Sb" = ( /obj/machinery/alarm{ dir = 1; - pixel_y = -32 + pixel_y = -21 }, /obj/effect/decal/cleanable/vomit, /obj/structure/hygiene/toilet{ @@ -5565,9 +5568,9 @@ aa aa aa aa +Qg aa -aa -aa +Qg aa aa aa @@ -5647,9 +5650,9 @@ sY sY sY Va -Qg +Va ag -Qg +Va ca ca ca @@ -5731,7 +5734,7 @@ ah aP iQ lD -lD +yT sB HY Rs diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index d0bb5e0062a..ac26d8437ce 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -74,7 +74,7 @@ /obj/abstract/landmark/latejoin/cryo_captain, /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/wood, /area/ship/trade/command/captain) @@ -93,7 +93,7 @@ }, /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/tiled/monotile, /area/ship/trade/command/hallway) @@ -104,7 +104,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled/monotile, /area/ship/trade/command/hallway) @@ -115,9 +115,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/airlock/hatch/autoname/command, -/obj/structure/sign/warning/radioactive{ - pixel_x = -32 - }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/techmaint, /area/ship/trade/shieldbay) @@ -140,7 +137,8 @@ /obj/structure/disposalpipe/segment, /obj/machinery/power/apc{ dir = 8; - name = "Crew Deck APC" + name = "Crew Deck APC"; + pixel_x = -22 }, /obj/structure/cable, /turf/simulated/floor/plating, @@ -158,7 +156,8 @@ icon_state = "16-0" }, /obj/machinery/atm{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /turf/simulated/floor/tiled/monotile, /area/ship/trade/command/hallway) @@ -174,39 +173,30 @@ /area/ship/trade/command/hallway) "ao" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/ship/trade/command/bridge) "ap" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/command/hallway) "aq" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -236,13 +226,10 @@ /turf/simulated/floor/tiled/steel_ridged, /area/ship/trade/command/bridge) "av" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/crew/toilets) @@ -251,50 +238,38 @@ /area/ship/trade/command/fmate) "ax" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/ship/trade/crew/saloon) "ay" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/crew/medbay/chemistry) "az" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/ship/trade/crew/toilets) "aA" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled{ @@ -336,13 +311,10 @@ /area/ship/trade/crew/hallway/port) "aG" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -395,13 +367,10 @@ /area/ship/trade/shuttle/outgoing/general) "aM" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ dir = 4 @@ -467,13 +436,10 @@ /area/ship/trade/command/hallway) "aT" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/visible/red{ @@ -508,12 +474,9 @@ /area/ship/trade/command/captain) "aX" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; - id_tag = "engwindow"; - opacity = FALSE + id_tag = "engwindow" }, /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -543,7 +506,8 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/carpet, /area/ship/trade/command/fmate) @@ -577,7 +541,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/universal, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/maintenance/atmos) @@ -592,7 +556,7 @@ }, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /obj/machinery/computer/shuttle_control/explore/tradeship{ dir = 8 @@ -601,13 +565,10 @@ /area/ship/trade/dock) "bf" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -621,7 +582,7 @@ }, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /obj/machinery/light{ dir = 1; @@ -641,13 +602,10 @@ /area/ship/trade/shuttle/outgoing/general) "bj" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -664,7 +622,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled/monotile, /area/ship/trade/dock) @@ -691,7 +649,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/structure/handrail{ dir = 4 @@ -724,12 +682,9 @@ /turf/simulated/floor/tiled/monotile, /area/ship/trade/dock) "bs" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -790,7 +745,8 @@ dir = 4; id_tag = "tradeship_starboard_dock"; pixel_x = 12; - pixel_y = 24 + pixel_y = 24; + directional_offset = null }, /obj/machinery/shield_diffuser, /obj/structure/cable{ @@ -816,7 +772,8 @@ dir = 4 }, /obj/structure/closet/medical_wall/filled{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/steel_ridged, /area/ship/trade/shuttle/outgoing/general) @@ -856,12 +813,9 @@ /area/ship/trade/dock) "bA" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -869,7 +823,8 @@ "bB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/vacuum{ - dir = 4 + dir = 4; + pixel_x = -34 }, /turf/simulated/floor/tiled/monotile, /area/ship/trade/dock) @@ -893,12 +848,9 @@ /turf/simulated/floor/tiled/monotile, /area/ship/trade/dock) "bE" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -947,12 +899,12 @@ dir = 4; id_tag = "bee_star"; pixel_x = 16; - pixel_y = -26 + pixel_y = -26; + directional_offset = null }, /obj/structure/cable/orange{ icon_state = "4-8" }, -/obj/structure/sign/warning/docking_area, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/shuttle/outgoing/general) "bI" = ( @@ -960,7 +912,8 @@ dir = 8; id_tag = "tradeship_dock_port"; pixel_x = -12; - pixel_y = 24 + pixel_y = 24; + directional_offset = null }, /obj/machinery/door/airlock/external/bolted{ id_tag = "dock_port_out" @@ -1073,16 +1026,11 @@ dir = 8; id_tag = "tradeship_rescue_shuttle_pump_out_internal" }, -/obj/machinery/airlock_sensor{ - id_tag = "tradeship_rescue_shuttle_sensor"; - pixel_x = -22; - pixel_y = 20 - }, /obj/machinery/embedded_controller/radio/airlock/docking_port{ cycle_to_external_air = 1; dir = 4; id_tag = "tradeship_rescue_shuttle"; - pixel_x = -20; + pixel_x = -22; pixel_y = 32; tag_airpump = "tradeship_rescue_shuttle_pump"; tag_chamber_sensor = "tradeship_rescue_shuttle_sensor"; @@ -1092,6 +1040,12 @@ dir = 9 }, /obj/effect/shuttle_landmark/docking_arm_starboard/rescue, +/obj/machinery/airlock_sensor{ + id_tag = "tradeship_rescue_shuttle_sensor"; + pixel_x = -22; + pixel_y = 20; + dir = 4 + }, /turf/simulated/floor/tiled, /area/ship/trade/shuttle/rescue) "cd" = ( @@ -1104,18 +1058,16 @@ id_tag = "bee_star_pump" }, /obj/structure/closet/walllocker/suit{ - dir = 4 + dir = 4; + pixel_x = -32 }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/shuttle/outgoing/general) "cf" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -1140,10 +1092,12 @@ /turf/simulated/floor/plating, /area/ship/trade/shuttle/outgoing/engineering) "ct" = ( -/obj/structure/sign/warning/docking_area, -/obj/effect/paint/brown, -/turf/simulated/wall/r_wall, -/area/ship/trade/dock) +/obj/structure/sign/warning/docking_area{ + dir = 8; + pixel_x = 34 + }, +/turf/space, +/area/space) "cu" = ( /obj/machinery/door/airlock/hatch/autoname/general, /obj/machinery/door/firedoor, @@ -1225,7 +1179,8 @@ "cO" = ( /obj/machinery/power/apc{ dir = 1; - name = "Crew Areas APC" + name = "Crew Areas APC"; + pixel_y = 22 }, /obj/structure/cable{ icon_state = "0-4" @@ -1309,12 +1264,14 @@ /obj/structure/table, /obj/machinery/recharger, /obj/structure/sign/poster{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/item/trash/tray, /obj/item/circular_saw, /obj/machinery/newscaster{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/random/drinkbottle, /obj/random/drinkbottle, @@ -1384,7 +1341,7 @@ }, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled, /area/ship/trade/crew/saloon) @@ -1418,7 +1375,8 @@ pixel_y = 22 }, /obj/machinery/light_switch{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/structure/cable{ icon_state = "0-2"; @@ -1428,13 +1386,10 @@ /area/ship/trade/crew/medbay/chemistry) "dt" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/plating, /area/ship/trade/crew/toilets) @@ -1654,13 +1609,10 @@ /area/ship/trade/crew/medbay/chemistry) "dK" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -1703,7 +1655,8 @@ pixel_x = 22 }, /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -20; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -1750,7 +1703,8 @@ /area/ship/trade/crew/saloon) "dU" = ( /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 24; + dir = 8 }, /obj/effect/floor_decal/corner/beige{ dir = 6 @@ -1771,7 +1725,7 @@ "dW" = ( /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/reagentgrinder, /obj/machinery/light, @@ -1817,7 +1771,8 @@ "ed" = ( /obj/machinery/light_switch{ on = 1; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1888,13 +1843,10 @@ /area/ship/trade/maintenance/engine/port) "ey" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/plating, /area/ship/trade/crew/kitchen) @@ -2187,13 +2139,10 @@ /area/ship/trade/crew/medbay) "ff" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/structure/cable{ icon_state = "6-8" @@ -2234,7 +2183,7 @@ }, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/effect/floor_decal/corner/red/diagonal, /turf/simulated/floor/tiled, @@ -2245,7 +2194,8 @@ dir = 1 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 24; + dir = 8 }, /obj/effect/floor_decal/corner/red/diagonal, /turf/simulated/floor/tiled, @@ -2276,7 +2226,8 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 24; + dir = 8 }, /turf/simulated/open, /area/ship/trade/cargo) @@ -2288,12 +2239,12 @@ dir = 4 }, /obj/structure/iv_drip, -/obj/item/chems/ivbag/blood/AMinus, -/obj/item/chems/ivbag/blood/APlus, -/obj/item/chems/ivbag/blood/BMinus, -/obj/item/chems/ivbag/blood/BPlus, -/obj/item/chems/ivbag/blood/OMinus, -/obj/item/chems/ivbag/blood/OPlus, +/obj/item/chems/ivbag/blood/aminus, +/obj/item/chems/ivbag/blood/aplus, +/obj/item/chems/ivbag/blood/bminus, +/obj/item/chems/ivbag/blood/bplus, +/obj/item/chems/ivbag/blood/ominus, +/obj/item/chems/ivbag/blood/oplus, /obj/structure/emergency_dispenser/west, /turf/simulated/floor/tiled/white, /area/ship/trade/crew/medbay) @@ -2303,10 +2254,12 @@ dir = 1 }, /obj/structure/sign/warning/nosmoking_1{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/structure/sign/plaque/diploma/medical{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/item/storage/firstaid/adv, /obj/random/medical, @@ -2413,7 +2366,6 @@ /area/ship/trade/maintenance/engine/starboard) "fQ" = ( /obj/effect/floor_decal/industrial/warning, -/obj/structure/sign/warning/hot_exhaust, /obj/effect/paint/red, /turf/simulated/wall/r_wall, /area/ship/trade/maintenance/engine/port) @@ -2424,7 +2376,7 @@ "fU" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ dir = 6 @@ -2495,8 +2447,7 @@ icon_state = "warning" }, /obj/structure/railing/mapped{ - dir = 8; - icon_state = "railing0" + dir = 8 }, /turf/simulated/open, /area/ship/trade/cargo) @@ -2556,24 +2507,22 @@ /area/ship/trade/unused) "gh" = ( /obj/effect/floor_decal/industrial/warning, -/obj/structure/sign/warning/hot_exhaust, /obj/effect/paint/red, /turf/simulated/wall, /area/ship/trade/maintenance/engine/starboard) "gj" = ( /obj/effect/floor_decal/industrial/warning, -/obj/structure/sign/warning/hot_exhaust, /obj/effect/paint/red, /turf/simulated/wall/r_wall, /area/ship/trade/maintenance/engine/starboard) "gk" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" + }, +/obj/structure/sign/warning/hot_exhaust{ + pixel_y = 32 }, /turf/simulated/floor/airless, /area/ship/trade/maintenance/engine/port) @@ -2586,13 +2535,10 @@ /area/space) "gn" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ dir = 4 @@ -2621,7 +2567,8 @@ dir = 1 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 24; + dir = 8 }, /obj/structure/handrail{ dir = 8 @@ -2652,11 +2599,10 @@ /obj/structure/handrail{ dir = 8 }, +/obj/structure/emergency_dispenser/east, /obj/structure/railing/mapped{ - dir = 8; - icon_state = "railing0" + dir = 8 }, -/obj/structure/emergency_dispenser/east, /turf/simulated/open, /area/ship/trade/cargo) "gt" = ( @@ -2677,7 +2623,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/wood/yew, /area/ship/trade/unused) @@ -2739,18 +2685,19 @@ icon_state = "warning" }, /obj/structure/sign/deck/first{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/structure/railing/mapped{ - dir = 8; - icon_state = "railing0" + dir = 8 }, /turf/simulated/open, /area/ship/trade/cargo) "gI" = ( /obj/random/maintenance, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 32; + dir = 4 }, /turf/simulated/floor/wood/yew, /area/ship/trade/unused) @@ -2817,12 +2764,12 @@ icon_state = "warning" }, /obj/structure/railing/mapped{ - dir = 1; - icon_state = "railing0" + dir = 1 }, /obj/machinery/light/spot, /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -20; + dir = 1 }, /turf/simulated/open, /area/ship/trade/cargo) @@ -2843,7 +2790,8 @@ /obj/machinery/button/blast_door{ id_tag = "radaway"; name = "Radiation shields"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/power) @@ -2913,7 +2861,7 @@ dir = 8 }, /obj/machinery/firealarm{ - pixel_y = 24 + pixel_y = 21 }, /turf/simulated/floor/plating, /area/ship/trade/hidden) @@ -3090,7 +3038,7 @@ /obj/item/storage/backpack/dufflebag/syndie, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/structure/cable{ icon_state = "0-2"; @@ -3267,7 +3215,8 @@ dir = 5 }, /obj/structure/sign/warning/high_voltage{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/structure/table, /obj/item/toy/prize/powerloader, @@ -3275,17 +3224,18 @@ /obj/machinery/recharger, /obj/item/blueprints, /obj/structure/sign/poster{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/firealarm{ - pixel_y = 24 + pixel_y = 21 }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "ib" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/effect/floor_decal/corner/blue{ dir = 6 @@ -3487,7 +3437,7 @@ }, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/power) @@ -3585,7 +3535,9 @@ /obj/machinery/button/blast_door{ id_tag = "engwindow"; name = "Engine Observation"; - pixel_x = 6 + pixel_x = 6; + dir = 1; + directional_offset = null }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -3600,7 +3552,8 @@ /obj/machinery/button/blast_door{ id_tag = "scram"; name = "CORE SCRAM"; - pixel_y = -26 + pixel_y = -26; + dir = 1 }, /obj/machinery/computer/fusion/fuel_control{ dir = 1; @@ -3622,22 +3575,24 @@ /obj/effect/floor_decal/corner/yellow{ dir = 10 }, -/obj/structure/sign/warning/nosmoking_1{ - pixel_y = -32 - }, /obj/machinery/computer/fusion/gyrotron{ dir = 1; initial_id_tag = "main_drive" }, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 32; + dir = 4 + }, +/obj/structure/sign/warning/nosmoking_1{ + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "iE" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1; @@ -3692,11 +3647,8 @@ /area/ship/trade/maintenance/engine/aft) "iR" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; - id_tag = "engwindow"; - opacity = FALSE +/obj/machinery/door/blast/regular/open{ + id_tag = "engwindow" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3748,26 +3700,20 @@ icon_state = "map_vent_out"; use_power = 1 }, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/maintenance/atmos) "iW" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 @@ -3878,6 +3824,10 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/sign/warning/radioactive{ + pixel_y = -32; + dir = 1 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/maintenance/power) "jl" = ( @@ -3898,6 +3848,10 @@ /obj/machinery/power/smes/buildable/max_cap_in_out, /obj/structure/cable, /obj/effect/floor_decal/techfloor/orange, +/obj/structure/sign/warning/radioactive{ + pixel_y = -32; + dir = 1 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/maintenance/power) "jp" = ( @@ -3986,15 +3940,7 @@ /obj/machinery/door/window/northleft, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; - id_tag = "radaway"; - opacity = FALSE - }, -/obj/structure/sign/warning/radioactive{ - pixel_x = -32 - }, -/obj/structure/sign/warning/radioactive{ - pixel_x = 32 + id_tag = "radaway" }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/power) @@ -4077,7 +4023,7 @@ "jI" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/atmospherics/valve/shutoff, /obj/structure/window/borosilicate_reinforced{ @@ -4141,11 +4087,17 @@ }, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; - id_tag = "radaway"; - opacity = FALSE + id_tag = "radaway" }, /obj/machinery/meter/turf, +/obj/structure/sign/warning/radioactive{ + pixel_x = -32; + dir = 4 + }, +/obj/structure/sign/warning/radioactive{ + pixel_x = 32; + dir = 8 + }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/power) "jQ" = ( @@ -4480,7 +4432,8 @@ dir = 4; id_tag = "bee_star"; pixel_x = 16; - pixel_y = 26 + pixel_y = 26; + directional_offset = null }, /turf/space, /area/ship/trade/shuttle/outgoing/general) @@ -4518,11 +4471,19 @@ }, /obj/item/deck/tarot, /obj/machinery/button/blast_door{ - id_tag = "bee_shutters" + id_tag = "bee_shutters"; + directional_offset = null }, /obj/item/stack/medical/bruise_pack, /turf/simulated/floor/tiled, /area/ship/trade/shuttle/outgoing/general) +"lU" = ( +/obj/structure/sign/warning/docking_area{ + dir = 4; + pixel_x = -34 + }, +/turf/space, +/area/space) "lW" = ( /obj/structure/catwalk, /obj/structure/handrail{ @@ -4536,7 +4497,8 @@ /area/ship/trade/shuttle/outgoing/general) "lZ" = ( /obj/structure/sign/department/redcross{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /turf/simulated/floor/plating, /area/ship/trade/crew/hallway/starboard) @@ -4581,7 +4543,7 @@ }, /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled, /area/ship/trade/shuttle/outgoing/general) @@ -4659,7 +4621,7 @@ }, /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 @@ -4749,7 +4711,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/ship/trade/shuttle/outgoing/general) "oi" = ( /obj/machinery/vending/snack{ dir = 4 @@ -4837,7 +4799,7 @@ /area/ship/trade/shuttle/outgoing/general) "pb" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/portable_atmospherics/hydroponics, /turf/simulated/floor/tiled, @@ -4857,7 +4819,7 @@ "pt" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled/techmaint, /area/ship/trade/crew/hallway/port) @@ -4915,7 +4877,8 @@ }, /obj/machinery/biogenerator, /obj/machinery/light_switch{ - pixel_x = 22 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled, /area/ship/trade/garden) @@ -5034,26 +4997,20 @@ "rb" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/plating, /area/ship/trade/garden) "rp" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/plating, /area/ship/trade/command/fmate) @@ -5062,7 +5019,7 @@ /obj/effect/floor_decal/industrial/warning, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/engine/aft) @@ -5090,7 +5047,8 @@ icon_state = "0-8" }, /obj/machinery/newscaster{ - pixel_x = 30 + pixel_x = 32; + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/ship/trade/command/bridge) @@ -5154,7 +5112,7 @@ /area/ship/trade/maintenance/engine/aft) "sj" = ( /obj/machinery/alarm{ - pixel_y = 24 + pixel_y = 21 }, /obj/machinery/atmospherics/portables_connector{ dir = 1 @@ -5178,11 +5136,8 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/red, /obj/effect/paint/sun, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; - id_tag = "bee_shutters"; - opacity = FALSE +/obj/machinery/door/blast/regular/open{ + id_tag = "bee_shutters" }, /turf/simulated/floor/plating, /area/ship/trade/shuttle/outgoing/general) @@ -5196,13 +5151,13 @@ /turf/space, /area/ship/trade/shuttle/outgoing/general) "sz" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" + }, +/obj/structure/sign/warning/hot_exhaust{ + pixel_y = 32 }, /turf/simulated/floor/airless, /area/ship/trade/maintenance/engine/starboard) @@ -5215,7 +5170,8 @@ "sB" = ( /obj/effect/floor_decal/industrial/warning, /obj/structure/sign/warning/fall{ - pixel_x = -32 + pixel_x = -34; + dir = 4 }, /obj/structure/catwalk, /obj/structure/railing/mapped, @@ -5302,24 +5258,25 @@ }, /turf/simulated/floor/plating, /area/ship/trade/shuttle/outgoing/engineering) +"tG" = ( +/obj/abstract/ramp_sculptor/north, +/turf/exterior/wall, +/area/space) "tV" = ( /turf/space, /area/ship/trade/command/fmate) "tW" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/command/fmate) "uc" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/effect/floor_decal/industrial/outline/yellow, /obj/item/radio/intercom{ @@ -5349,13 +5306,10 @@ /turf/simulated/wall/titanium, /area/ship/trade/shuttle/outgoing/engineering) "ul" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/crew/medbay/chemistry) @@ -5365,7 +5319,7 @@ icon_state = "0-8" }, /obj/structure/sign/warning/radioactive{ - dir = 4; + dir = 8; pixel_x = 32 }, /turf/simulated/floor/plating, @@ -5405,7 +5359,7 @@ "vc" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/item/radio/intercom{ dir = 1; @@ -5433,13 +5387,10 @@ /turf/simulated/floor/airless, /area/ship/trade/maintenance/engine/starboard) "vL" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/structure/sign/warning/hot_exhaust{ pixel_y = 32 @@ -5468,9 +5419,7 @@ /obj/structure/table, /obj/random/smokes, /obj/item/ashtray/glass, -/obj/abstract/landmark{ - name = "Observer-Start" - }, +/obj/abstract/landmark/latejoin/observer, /obj/structure/cable{ icon_state = "1-2" }, @@ -5553,7 +5502,7 @@ /area/ship/trade/crew/wash) "xc" = ( /obj/machinery/firealarm{ - pixel_y = 24 + pixel_y = 21 }, /obj/structure/cable{ icon_state = "4-8" @@ -5580,7 +5529,7 @@ /obj/item/roller, /obj/item/storage/firstaid/adv, /obj/item/storage/pill_bottle/painkillers, -/obj/item/storage/pill_bottle/antitox, +/obj/item/storage/pill_bottle/antitoxins, /obj/item/storage/pill_bottle/antibiotics, /obj/item/storage/pill_bottle/burn_meds, /obj/item/scanner/health, @@ -5723,7 +5672,7 @@ /obj/structure/curtain/open/shower, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled/freezer, /area/ship/trade/crew/toilets) @@ -5734,13 +5683,10 @@ "zO" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/plating, /area/ship/trade/command/captain) @@ -5751,6 +5697,17 @@ }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/maintenance/atmos) +"zY" = ( +/obj/structure/lattice, +/obj/structure/handrail{ + dir = 4 + }, +/obj/structure/sign/warning/docking_area{ + dir = 4; + pixel_x = -34 + }, +/turf/space, +/area/space) "Ab" = ( /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 6 @@ -5858,7 +5815,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/tiled, /area/ship/trade/crew/kitchen) @@ -5890,7 +5847,8 @@ id_tag = "bee_port_pump" }, /obj/structure/closet/walllocker/suit{ - dir = 8 + dir = 8; + pixel_x = 32 }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/shuttle/outgoing/general) @@ -5908,11 +5866,8 @@ "BN" = ( /obj/effect/wallframe_spawn/reinforced/titanium, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; - id_tag = "bee_shutters"; - opacity = FALSE +/obj/machinery/door/blast/regular/open{ + id_tag = "bee_shutters" }, /obj/effect/paint/black, /turf/simulated/floor/plating, @@ -5930,7 +5885,8 @@ /obj/machinery/button/blast_door{ id_tag = "fmate"; pixel_x = 22; - pixel_y = -2 + pixel_y = -2; + dir = 8 }, /turf/simulated/floor/wood, /area/ship/trade/command/fmate) @@ -5952,7 +5908,7 @@ /obj/effect/floor_decal/corner/red/diagonal, /obj/machinery/vending/dinnerware, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled, /area/ship/trade/crew/kitchen) @@ -5966,6 +5922,10 @@ /obj/effect/paint/brown, /turf/simulated/wall/r_wall/hull, /area/ship/trade/crew/medbay/chemistry) +"Cg" = ( +/obj/abstract/ramp_sculptor/east, +/turf/exterior/wall, +/area/space) "Co" = ( /obj/effect/floor_decal/corner/red/diagonal, /obj/structure/cable{ @@ -5998,7 +5958,8 @@ /obj/item/toy/figure/captain, /obj/machinery/button/blast_door{ id_tag = "sensor"; - name = "Sensor Shroud" + name = "Sensor Shroud"; + directional_offset = null }, /obj/item/radio, /obj/random/drinkbottle, @@ -6107,7 +6068,8 @@ dir = 8; id_tag = "bee_port"; pixel_x = -16; - pixel_y = -26 + pixel_y = -26; + directional_offset = null }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/shuttle/outgoing/general) @@ -6165,7 +6127,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /obj/item/handcuffs, /obj/item/telebaton, @@ -6273,7 +6235,7 @@ /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/portable_atmospherics/powered/pump/filled, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/cargo) @@ -6303,12 +6265,9 @@ /area/ship/trade/crew/medbay/chemistry) "FD" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -6317,7 +6276,8 @@ /obj/structure/table, /obj/machinery/button/blast_door{ id_tag = "scraplock"; - name = "External Lockdown" + name = "External Lockdown"; + directional_offset = null }, /obj/random_multi/single_item/captains_spare_id, /obj/item/documents/tradehouse/account, @@ -6328,7 +6288,7 @@ "FT" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/hallway) @@ -6397,11 +6357,8 @@ /obj/effect/wallframe_spawn/reinforced/titanium, /obj/machinery/door/firedoor, /obj/effect/paint/sun, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; - id_tag = "bee_shutters"; - opacity = FALSE +/obj/machinery/door/blast/regular/open{ + id_tag = "bee_shutters" }, /turf/simulated/floor/plating, /area/ship/trade/shuttle/outgoing/general) @@ -6453,11 +6410,11 @@ /area/ship/trade/maintenance/atmos) "Hc" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/item/bedsheet/medical, /obj/structure/curtain/open/privacy, @@ -6519,7 +6476,7 @@ "Ic" = ( /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /obj/item/storage/medical_lolli_jar, /obj/structure/table, @@ -6536,14 +6493,11 @@ "Im" = ( /obj/structure/table, /obj/item/chems/food/monkeycube/wrapped, -/obj/structure/closet/medical_wall{ - name = "pill cabinet"; - pixel_y = -29 +/obj/structure/closet/secure_closet/medical_wall/pills{ + pixel_y = -32; + req_access = null; + dir = 1 }, -/obj/item/storage/pill_bottle/antibiotics, -/obj/item/storage/pill_bottle/painkillers, -/obj/item/storage/pill_bottle/antitox, -/obj/item/storage/pill_bottle/burn_meds, /turf/simulated/floor/tiled/white, /area/ship/trade/crew/medbay) "Is" = ( @@ -6555,7 +6509,7 @@ "Iw" = ( /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/plating, /area/ship/trade/crew/hallway/port) @@ -6581,7 +6535,7 @@ "IC" = ( /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/plating, /area/ship/trade/crew/hallway/starboard) @@ -6657,7 +6611,8 @@ icon_state = "bulb1" }, /obj/structure/sign/deck/first{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /obj/structure/handrail{ dir = 8 @@ -6669,7 +6624,8 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/kitchenspike, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/tiled, /area/ship/trade/crew/kitchen) @@ -6697,13 +6653,10 @@ "JI" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/power) @@ -6749,7 +6702,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -6761,7 +6714,7 @@ "Kd" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/structure/table, /obj/machinery/cell_charger, @@ -6783,7 +6736,8 @@ /area/ship/trade/command/captain) "Kl" = ( /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -24; + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/ship/trade/crew/hallway/port) @@ -6811,7 +6765,8 @@ /area/ship/trade/shuttle/outgoing/general) "KI" = ( /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -24; + dir = 4 }, /obj/structure/catwalk, /obj/structure/handrail{ @@ -6840,7 +6795,7 @@ "KZ" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/plating, /area/ship/trade/crew/hallway/starboard) @@ -6858,7 +6813,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -6923,7 +6878,7 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/freezer, /area/ship/trade/crew/wash) @@ -6994,7 +6949,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/ship/trade/shuttle/outgoing/general) "Nc" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -7018,7 +6973,7 @@ dir = 4 }, /obj/machinery/firealarm{ - pixel_y = 24 + pixel_y = 21 }, /turf/simulated/floor/tiled/freezer, /area/ship/trade/crew/wash) @@ -7049,7 +7004,8 @@ /obj/machinery/network/requests_console{ announcementConsole = 1; department = "Captain"; - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/item/radio/intercom{ dir = 4; @@ -7103,7 +7059,7 @@ pixel_x = -22 }, /obj/machinery/alarm{ - pixel_y = 24 + pixel_y = 21 }, /turf/simulated/floor/tiled/steel_ridged, /area/ship/trade/shuttle/outgoing/general) @@ -7123,7 +7079,7 @@ "Ob" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1; @@ -7175,25 +7131,19 @@ /obj/machinery/power/terminal, /turf/simulated/floor/plating, /area/ship/trade/maintenance/engine/aft) -"OD" = ( -/obj/structure/catwalk, -/obj/structure/railing/mapped{ - dir = 1 - }, -/obj/structure/railing/mapped{ - dir = 4 - }, -/turf/space, -/area/space) "OP" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/structure/table, /obj/machinery/reagent_temperature/cooler, /turf/simulated/floor/tiled/white, /area/ship/trade/crew/medbay/chemistry) +"OQ" = ( +/obj/abstract/ramp_sculptor/west, +/turf/exterior/wall, +/area/space) "Pa" = ( /obj/structure/cable{ icon_state = "0-4" @@ -7212,7 +7162,8 @@ }, /obj/structure/displaycase, /obj/machinery/newscaster{ - pixel_y = -30 + pixel_y = -32; + dir = 1 }, /turf/simulated/floor/carpet/blue, /area/ship/trade/command/captain) @@ -7235,7 +7186,7 @@ "PB" = ( /obj/machinery/alarm{ dir = 8; - pixel_x = 24 + pixel_x = 21 }, /obj/structure/cable{ icon_state = "1-2" @@ -7271,24 +7222,18 @@ /turf/simulated/floor/plating, /area/ship/trade/shieldbay) "PH" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/maintenance/power) "PU" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/item/mollusc/barnacle{ pixel_y = -11 @@ -7312,13 +7257,13 @@ /area/ship/trade/crew/hallway/starboard) "Ql" = ( /obj/structure/lattice, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" + }, +/obj/structure/sign/warning/hot_exhaust{ + pixel_y = 32 }, /turf/simulated/floor/airless, /area/ship/trade/maintenance/engine/starboard) @@ -7350,10 +7295,12 @@ pixel_y = -22 }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -24; + dir = 4 }, /obj/structure/closet/medical_wall/filled{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/item/stack/tape_roll/duct_tape, /obj/item/storage/firstaid/surgery, @@ -7369,7 +7316,8 @@ /obj/machinery/button/toggle/engine{ id_tag = "tradeship_engine_vent"; name = "engine vent control button"; - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/engine/aft) @@ -7406,7 +7354,7 @@ /obj/item/stool/padded, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /turf/simulated/floor/wood/yew, /area/ship/trade/unused) @@ -7422,13 +7370,10 @@ /turf/space, /area/ship/trade/shuttle/outgoing/general) "Rl" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/maintenance/atmos) @@ -7451,7 +7396,7 @@ /obj/machinery/merchant_pad, /obj/machinery/firealarm{ dir = 4; - pixel_x = 24 + pixel_x = 21 }, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/cargo) @@ -7494,25 +7439,24 @@ icon_state = "bulb1" }, /obj/machinery/newscaster{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /turf/simulated/floor/tiled, /area/ship/trade/garden) "Sg" = ( /obj/machinery/light, /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -20; + dir = 1 }, /turf/simulated/floor/tiled/techmaint, /area/ship/trade/shieldbay) "Si" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /turf/simulated/floor/airless, /area/ship/trade/crew/toilets) @@ -7525,16 +7469,6 @@ }, /turf/simulated/floor/plating, /area/ship/trade/shuttle/outgoing/general) -"Sk" = ( -/obj/structure/catwalk, -/obj/structure/railing/mapped{ - dir = 1 - }, -/obj/structure/railing/mapped{ - dir = 8 - }, -/turf/space, -/area/space) "Sr" = ( /turf/simulated/floor/plating, /area/ship/trade/maintenance/hallway) @@ -7555,7 +7489,7 @@ "SI" = ( /obj/machinery/alarm{ dir = 4; - pixel_x = -24 + pixel_x = -21 }, /obj/effect/floor_decal/steeldecal/steel_decals6, /obj/structure/sign/warning/radioactive{ @@ -7586,16 +7520,15 @@ }, /obj/machinery/power/apc{ dir = 1; - name = "Docking Area APC" + name = "Docking Area APC"; + pixel_y = 22 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = 27 - }, -/obj/structure/sign/warning/radioactive{ - pixel_y = 32 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/monotile, /area/ship/trade/command/hallway) @@ -7621,6 +7554,10 @@ /obj/effect/paint/sun, /turf/simulated/wall/titanium, /area/ship/trade/shuttle/outgoing/engineering) +"Tv" = ( +/obj/structure/lattice, +/turf/exterior/wall, +/area/space) "Tx" = ( /obj/structure/shuttle/engine/propulsion/burst/right, /turf/simulated/floor/airless, @@ -7654,7 +7591,8 @@ /area/ship/trade/command/bridge) "TR" = ( /obj/structure/sign/deck/first{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/ship/trade/crew/hallway/starboard) @@ -7666,13 +7604,10 @@ /area/ship/trade/garden) "Ue" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/structure/cable{ icon_state = "4-10" @@ -7698,7 +7633,8 @@ icon_state = "4-8" }, /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -20; + dir = 1 }, /turf/simulated/floor/tiled/dark, /area/ship/trade/command/bridge) @@ -7766,7 +7702,7 @@ /obj/structure/cable, /obj/machinery/power/apc{ name = "south bump"; - pixel_y = -24 + pixel_y = -22 }, /obj/item/chems/glass/bucket, /obj/structure/reagent_dispensers/watertank, @@ -7809,13 +7745,10 @@ /area/ship/trade/maintenance/engine/aft) "VW" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -7865,7 +7798,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = -24 + pixel_x = -21 }, /obj/machinery/light{ icon_state = "bulb1" @@ -7879,7 +7812,8 @@ /obj/machinery/cryopod/lifepod, /obj/machinery/door/window/southright, /obj/machinery/computer/cryopod{ - dir = 8 + dir = 8; + pixel_x = 24 }, /turf/simulated/floor/wood, /area/ship/trade/command/captain) @@ -7957,13 +7891,10 @@ /area/ship/trade/maintenance/hallway) "XG" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "scraplock" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/visible/red{ @@ -7981,11 +7912,8 @@ /area/ship/trade/cargo) "XX" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; - id_tag = "engwindow"; - opacity = FALSE +/obj/machinery/door/blast/regular/open{ + id_tag = "engwindow" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -8048,6 +7976,10 @@ dir = 8 }, /obj/structure/lattice, +/obj/structure/sign/warning/docking_area{ + dir = 8; + pixel_x = 34 + }, /turf/space, /area/space) "YE" = ( @@ -8129,7 +8061,7 @@ icon_state = "0-4" }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/maintenance/power) @@ -9834,7 +9766,7 @@ aa aa aa aa -Sk +WM gN qv Sj @@ -9934,9 +9866,9 @@ aa aa aa aa -aa -aa -aa +OQ +OQ +OQ xX aa aa @@ -10015,8 +9947,8 @@ aa aa aa aa -aa -aa +tG +eh eh eh pn @@ -10097,7 +10029,7 @@ aa aa aa aa -aa +tG eh ew ex @@ -10179,7 +10111,7 @@ aa aa aa aa -aa +tG eh ex ex @@ -10262,7 +10194,7 @@ aa aa aa aa -aa +eh ex ex fh @@ -10572,7 +10504,7 @@ aa aa aa aa -OD +Bi Tb CV Wb @@ -10739,7 +10671,7 @@ aa aa aa aa -aa +ct bA bI bA @@ -10907,7 +10839,7 @@ nZ bm bz cf -ct +Mw aq aq aq @@ -11891,7 +11823,7 @@ nZ bm bt cf -ct +Mw VW VW VW @@ -11973,7 +11905,7 @@ nZ Mw bu bA -Zv +zY cy cy cy @@ -12051,7 +11983,7 @@ aa aa aa aa -aa +lU bA bw bA @@ -12475,9 +12407,9 @@ aa aa aa aa -aa -aa -cy +eh +eh +Tv eN Gc fN @@ -12556,7 +12488,7 @@ aa aa aa aa -aa +tG eh eh eN @@ -12638,8 +12570,8 @@ aa aa aa aa -aa -aa +tG +eh ew eN eN @@ -12720,8 +12652,8 @@ aa aa aa aa -aa -aa +tG +eh eh eh eN @@ -12803,9 +12735,9 @@ aa aa aa aa -aa -aa -aa +Cg +Cg +Cg aa we we diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index e80dcc50448..cda8b435d76 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -5,13 +5,10 @@ "ab" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/bridge_unused) @@ -149,13 +146,10 @@ /area/ship/trade/maintenance/solars) "au" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plating, @@ -168,7 +162,8 @@ tag_airpump = "solars_pump"; tag_chamber_sensor = "solars_sensor"; tag_exterior_door = "solars_out"; - tag_interior_door = "solars_in" + tag_interior_door = "solars_in"; + pixel_x = 22 }, /obj/structure/cable{ icon_state = "1-2" @@ -304,13 +299,10 @@ "aN" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/comms) @@ -440,7 +432,8 @@ "bc" = ( /obj/machinery/door/firedoor, /obj/structure/sign/warning/fall{ - pixel_x = 32 + pixel_x = 34; + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -453,7 +446,8 @@ /area/space) "be" = ( /obj/machinery/light_switch{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -643,13 +637,10 @@ "jv" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/bridge_unused) @@ -699,12 +690,9 @@ /area/ship/trade/bridge_unused) "ng" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -727,7 +715,8 @@ "oq" = ( /obj/random/trash, /obj/machinery/power/apc{ - dir = 8 + dir = 8; + pixel_x = -22 }, /obj/structure/cable{ icon_state = "0-2" @@ -802,19 +791,17 @@ }, /obj/machinery/power/apc{ dir = 1; - name = "Communications APC" + name = "Communications APC"; + pixel_y = 22 }, /obj/structure/cable{ icon_state = "0-2" }, /obj/machinery/light_switch{ - pixel_x = 32 + pixel_x = 24; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, /obj/structure/window/reinforced{ dir = 8 }, @@ -836,7 +823,8 @@ "wc" = ( /obj/effect/floor_decal/steeldecal/steel_decals6, /obj/machinery/power/apc{ - dir = 1 + dir = 1; + pixel_y = 22 }, /obj/structure/cable{ icon_state = "0-2"; @@ -925,13 +913,10 @@ /turf/simulated/floor/bluegrid, /area/ship/trade/comms) "Db" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/airless, /area/ship/trade/bridge_unused) @@ -974,6 +959,12 @@ /obj/structure/tape_barricade/engineering, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/bridge_unused) +"EO" = ( +/obj/machinery/computer/message_monitor{ + dir = 1 + }, +/turf/simulated/floor/bluegrid, +/area/ship/trade/comms) "Fe" = ( /obj/structure/railing/mapped{ dir = 1 @@ -1035,7 +1026,8 @@ icon_state = "1-2" }, /obj/machinery/light_switch{ - pixel_x = 32 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/ship/trade/command/bridge_upper) @@ -1054,7 +1046,8 @@ dir = 8 }, /obj/structure/sign/warning/fall{ - pixel_x = -32 + pixel_x = -34; + dir = 4 }, /turf/simulated/floor/plating, /area/ship/trade/maintenance/solars) @@ -1099,12 +1092,9 @@ "PJ" = ( /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/command/bridge_upper) @@ -1112,13 +1102,10 @@ /turf/simulated/floor/tiled/monotile, /area/ship/trade/command/bridge_upper) "QK" = ( -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/airless, /area/ship/trade/comms) @@ -1157,12 +1144,9 @@ /area/ship/trade/comms) "SQ" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -1176,13 +1160,10 @@ "Tx" = ( /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; +/obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /turf/simulated/floor/plating, /area/ship/trade/comms) @@ -1197,9 +1178,7 @@ dir = 1; pixel_y = -32 }, -/obj/machinery/computer/message_monitor{ - dir = 4 - }, +/obj/machinery/commsrelay, /turf/simulated/floor/bluegrid, /area/ship/trade/comms) "UY" = ( @@ -1214,12 +1193,9 @@ /area/ship/trade/maintenance/solars) "Vp" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; - name = "External Blast Doors"; - opacity = FALSE + name = "External Blast Doors" }, /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/plating, @@ -1265,10 +1241,6 @@ /turf/simulated/floor/reinforced/airless, /area/space) "ZD" = ( -/obj/machinery/alarm{ - dir = 8; - pixel_x = 24 - }, /obj/structure/window/reinforced{ dir = 8 }, @@ -1276,6 +1248,10 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/comms) "ZT" = ( @@ -1293,7 +1269,8 @@ dir = 4 }, /obj/machinery/light_switch{ - pixel_x = 32 + pixel_x = 24; + dir = 8 }, /obj/structure/lattice, /turf/simulated/open, @@ -4275,7 +4252,7 @@ Su Su Su Su -Su +EO ng ax ax diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index a08e00d84e2..69c64093b78 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -1,5 +1,9 @@ #if !defined(USING_MAP_DATUM) + #ifdef UNIT_TEST + #include "../../code/unit_tests/offset_tests.dm" + #endif + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/mundane.dm" diff --git a/maps/tradeship/tradeship_spawnpoints.dm b/maps/tradeship/tradeship_spawnpoints.dm index 9a93e28df93..054216b46fe 100644 --- a/maps/tradeship/tradeship_spawnpoints.dm +++ b/maps/tradeship/tradeship_spawnpoints.dm @@ -1,38 +1,29 @@ -var/global/list/latejoin_cryo_two = list() -var/global/list/latejoin_cryo_captain = list() -/obj/abstract/landmark/latejoin/cryo_two/add_loc() - global.latejoin_cryo_two |= get_turf(src) - -/obj/abstract/landmark/latejoin/cryo_captain/add_loc() - global.latejoin_cryo_captain |= get_turf(src) - /datum/map/tradeship - allowed_spawns = list( + allowed_latejoin_spawns = list( /decl/spawnpoint/cryo, /decl/spawnpoint/cryo/two, /decl/spawnpoint/cyborg, - /decl/spawnpoint/cryo/captain ) default_spawn = /decl/spawnpoint/cryo /decl/spawnpoint/cryo name = "Port Cryogenic Storage" - msg = "has completed revival in the port cryogenics bay" + spawn_announcement = "has completed revival in the port cryogenics bay" disallow_job = list(/datum/job/tradeship_robot) /decl/spawnpoint/cryo/two name = "Starboard Cryogenic Storage" - msg = "has completed revival in the starboard cryogenics bay" + spawn_announcement = "has completed revival in the starboard cryogenics bay" + uid = "spawn_cryo_two" -/decl/spawnpoint/cryo/two/Initialize() - . = ..() - turfs = global.latejoin_cryo_two +/obj/abstract/landmark/latejoin/cryo_two + spawn_decl = /decl/spawnpoint/cryo/two /decl/spawnpoint/cryo/captain name = "Captain Compartment" - msg = "has completed revival in the captain compartment" + spawn_announcement = "has completed revival in the captain compartment" restrict_job = list(/datum/job/tradeship_captain) + uid = "spawn_cryo_captain" -/decl/spawnpoint/cryo/captain/Initialize() - . = ..() - turfs = global.latejoin_cryo_captain +/obj/abstract/landmark/latejoin/cryo_captain + spawn_decl = /decl/spawnpoint/cryo/captain diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 1133f421c16..461972f408e 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -68,12 +68,11 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable // second level maps from program friendly display names ("Picnic Area") to program string ids ("picnicarea") // as defined in holodeck_programs var/list/holodeck_restricted_programs = list() // as above... but EVIL! + var/list/holodeck_default_program = list() // map of program list string ids to default program string id + var/list/holodeck_off_program = list() // as above... but for being off i guess - var/allowed_spawns = list( - /decl/spawnpoint/arrivals, - /decl/spawnpoint/gateway, - /decl/spawnpoint/cryo, - /decl/spawnpoint/cyborg + var/allowed_latejoin_spawns = list( + /decl/spawnpoint/arrivals ) var/default_spawn = /decl/spawnpoint/arrivals @@ -185,12 +184,12 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/datum/job/J = default_job_type default_job_title = initial(J.title) - if(default_spawn && !(default_spawn in allowed_spawns)) + if(default_spawn && !(default_spawn in allowed_latejoin_spawns)) PRINT_STACK_TRACE("Map datum [type] has default spawn point [default_spawn] not in the allowed spawn list.") - for(var/spawn_type in allowed_spawns) - allowed_spawns -= spawn_type - allowed_spawns += GET_DECL(spawn_type) + for(var/spawn_type in allowed_latejoin_spawns) + allowed_latejoin_spawns -= spawn_type + allowed_latejoin_spawns += GET_DECL(spawn_type) if(!SSmapping.map_levels) SSmapping.map_levels = SSmapping.station_levels.Copy() diff --git a/maps/~mapsystem/maps_unit_testing.dm b/maps/~mapsystem/maps_unit_testing.dm index fe0f90121e7..025460d9724 100644 --- a/maps/~mapsystem/maps_unit_testing.dm +++ b/maps/~mapsystem/maps_unit_testing.dm @@ -38,5 +38,9 @@ var/list/area_purity_test_exempt_areas = list() + /// A list of disposals tags (sort_type var) that aren't expected to have outputs. + var/list/disconnected_disposals_tags = list() + /// A list of lists, of the format ((x, y, z, dir),). var/list/disconnected_wires_test_exempt_turfs = list() + diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm index 4a6b98cb20a..a0ccc54bb2d 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm @@ -292,7 +292,7 @@ /area/lar_maria/cells) "aV" = ( /obj/structure/bed/padded, -/obj/item/contraband/poster, +/obj/item/poster, /turf/simulated/floor/tiled, /area/lar_maria/cells) "aW" = ( @@ -318,7 +318,6 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/tiled, @@ -347,7 +346,6 @@ /obj/machinery/door/window/eastright, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/plating, @@ -363,7 +361,6 @@ /obj/machinery/door/window/westleft, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/plating, @@ -489,7 +486,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/tiled, @@ -511,7 +507,6 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/plating, @@ -676,7 +671,6 @@ /obj/abstract/landmark/corpse/lar_maria/test_subject, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/plating, @@ -1042,7 +1036,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/plating, @@ -1084,7 +1077,6 @@ /obj/effect/decal/cleanable/blood, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /turf/simulated/floor/plating, @@ -1104,7 +1096,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /turf/simulated/floor/plating, @@ -1125,7 +1116,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /turf/simulated/floor/plating, @@ -1262,7 +1252,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /turf/simulated/floor/plating, @@ -1280,7 +1269,6 @@ /obj/effect/decal/cleanable/blood, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /turf/simulated/floor/plating, @@ -1397,7 +1385,6 @@ /obj/effect/wallframe_spawn/reinforced, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /turf/simulated/floor/plating, @@ -2104,7 +2091,6 @@ /obj/effect/decal/cleanable/blood, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /obj/structure/cable{ @@ -2283,7 +2269,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /obj/structure/cable{ @@ -2319,7 +2304,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "CellsBD" }, /obj/structure/cable{ @@ -2485,7 +2469,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "VirAccessBD" }, /turf/simulated/floor/tiled, @@ -2529,7 +2512,7 @@ /area/lar_maria/cells) "gC" = ( /obj/structure/closet/crate, -/obj/item/contraband/poster, +/obj/item/poster, /obj/item/inflatable_duck, /turf/simulated/floor/plating, /area/lar_maria/cells) @@ -2628,7 +2611,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "VirAccessBD" }, /turf/simulated/floor/tiled, @@ -2806,12 +2788,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_ld_BD" }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_dock_BD" }, /turf/simulated/floor/plating, @@ -2863,7 +2843,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_dock_BD" }, /turf/simulated/floor/tiled, @@ -2909,7 +2888,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "VirAccessBD" }, /turf/simulated/floor/tiled, @@ -3031,7 +3009,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "VirAccessBD" }, /turf/simulated/floor/tiled, @@ -3058,7 +3035,7 @@ /area/lar_maria/cells) "hW" = ( /obj/structure/table/steel_reinforced, -/obj/item/contraband/poster, +/obj/item/poster, /turf/simulated/floor/plating, /area/lar_maria/cells) "hX" = ( @@ -3138,7 +3115,6 @@ }, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "VirAccessBD" }, /obj/structure/cable{ @@ -3297,7 +3273,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular/open{ dir = 2; - icon_state = "pdoor0"; id_tag = "VirAccessBD" }, /turf/simulated/floor/tiled, @@ -3433,7 +3408,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "Cells_dock_BD" }, /turf/simulated/floor/plating, diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm index 7e97ebf1f82..62b666d14e0 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm @@ -812,7 +812,7 @@ /area/lar_maria/library) "cs" = ( /obj/structure/bookcase, -/obj/item/book/manual/stasis, +/obj/item/book/fluff/stasis, /turf/simulated/floor/tiled, /area/lar_maria/library) "cu" = ( @@ -831,8 +831,8 @@ /area/lar_maria/library) "cy" = ( /obj/structure/bookcase, -/obj/item/book/manual/anomaly_spectroscopy, -/obj/item/book/manual/anomaly_testing, +/obj/item/book/fluff/anomaly_spectroscopy, +/obj/item/book/fluff/anomaly_testing, /turf/simulated/floor/tiled, /area/lar_maria/library) "cz" = ( @@ -1235,7 +1235,7 @@ /area/lar_maria/library) "dM" = ( /obj/structure/table, -/obj/machinery/faxmachine, +/obj/machinery/faxmachine/mapped, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/alarm{ dir = 8; diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm index 753bfa58244..59f75b91501 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria.dm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria.dm @@ -54,8 +54,7 @@ /mob/living/simple_animal/hostile/lar_maria/test_subject name = "test subject" desc = "Sick, filthy, angry and probably crazy human in an orange robe." - maxHealth = 40 - health = 40 + mob_default_max_health = 40 corpse = /obj/abstract/landmark/corpse/lar_maria/test_subject icon = 'mods/content/corporate/away_sites/lar_maria/lar_maria_test_subject.dmi' @@ -88,8 +87,7 @@ /mob/living/simple_animal/hostile/lar_maria/guard//angry guards armed with batons and shotguns. Still bite name = "security" desc = "Guard dressed at Zeng-Hu Pharmaceuticals uniform." - maxHealth = 60 - health = 60 + mob_default_max_health = 60 natural_weapon = /obj/item/baton weapon = /obj/item/baton corpse = /obj/abstract/landmark/corpse/lar_maria/zhp_guard @@ -124,8 +122,7 @@ name = "virologist" desc = "Virologist dressed at Zeng-Hu Pharmaceuticals uniform." icon = 'mods/content/corporate/away_sites/lar_maria/lar_maria_virologist_m.dmi' - maxHealth = 50 - health = 50 + mob_default_max_health = 50 corpse = /obj/abstract/landmark/corpse/lar_maria/virologist /obj/abstract/landmark/corpse/lar_maria/virologist diff --git a/mods/content/corporate/clothing/outfits.dm b/mods/content/corporate/clothing/outfits.dm index 9d21557b638..969e176164c 100644 --- a/mods/content/corporate/clothing/outfits.dm +++ b/mods/content/corporate/clothing/outfits.dm @@ -46,16 +46,15 @@ /decl/hierarchy/outfit/death_command name = "Spec Ops - Death commando" -/decl/hierarchy/outfit/death_command/equip(mob/living/carbon/human/H, rank, assignment, equip_adjustments) +/decl/hierarchy/outfit/death_command/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/deathsquad = GET_DECL(/decl/special_role/deathsquad) - deathsquad.equip(H) + deathsquad.equip_role(H) return 1 /decl/hierarchy/outfit/syndicate_command name = "Spec Ops - Syndicate commando" -/decl/hierarchy/outfit/syndicate_command/equip(mob/living/carbon/human/H, rank, assignment, equip_adjustments) +/decl/hierarchy/outfit/syndicate_command/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/commandos = GET_DECL(/decl/special_role/deathsquad/mercenary) - commandos.equip(H) + commandos.equip_role(H) return 1 - diff --git a/mods/content/corporate/clothing/rigs/ert.dm b/mods/content/corporate/clothing/rigs/ert.dm index 05ff41016fe..091a660e927 100644 --- a/mods/content/corporate/clothing/rigs/ert.dm +++ b/mods/content/corporate/clothing/rigs/ert.dm @@ -52,7 +52,6 @@ ) /obj/item/clothing/head/helmet/space/rig/ert - light_overlay = "helmet_light_dual" camera = /obj/machinery/camera/network/ert icon = 'mods/content/corporate/icons/rigs/commander/helmet.dmi' /obj/item/clothing/suit/space/rig/ert diff --git a/mods/content/corporate/datum/ai_laws.dm b/mods/content/corporate/datum/ai_laws.dm index 9029327ae00..380101d48cc 100644 --- a/mods/content/corporate/datum/ai_laws.dm +++ b/mods/content/corporate/datum/ai_laws.dm @@ -1,7 +1,7 @@ /obj/item/aiModule/nanotrasen // -- TLE name = "'Corporate Default' Core AI Module" desc = "A 'Corporate Default' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' laws = new/datum/ai_laws/nanotrasen /datum/ai_laws/nanotrasen @@ -18,7 +18,7 @@ /obj/item/aiModule/corp name = "\improper 'Corporate' core AI module" desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' laws = new/datum/ai_laws/corporate /datum/ai_laws/corporate @@ -51,5 +51,5 @@ /obj/item/aiModule/dais name = "\improper 'DAIS Experimental' core AI module" desc = "A 'DAIS Experimental' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':4}" + origin_tech = @'{"programming":4}' laws = new/datum/ai_laws/dais() diff --git a/mods/content/corporate/datum/antagonists/commando.dm b/mods/content/corporate/datum/antagonists/commando.dm index e99fa97cedd..c8069877986 100644 --- a/mods/content/corporate/datum/antagonists/commando.dm +++ b/mods/content/corporate/datum/antagonists/commando.dm @@ -29,14 +29,13 @@ ) /obj/item/encryptionkey/hacked - icon_state = "cypherkey" can_decrypt = list(access_hacked) - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' /obj/item/encryptionkey/hacked/Initialize(ml, material_key) . = ..() can_decrypt |= get_all_station_access() /obj/item/radio/headset/hacked - origin_tech = "{'esoteric':3}" + origin_tech = @'{"esoteric":3}' encryption_keys = list(/obj/item/encryptionkey/hacked) diff --git a/mods/content/corporate/datum/antagonists/deathsquad.dm b/mods/content/corporate/datum/antagonists/deathsquad.dm index 2a0950a48a7..6ead8bb5b28 100644 --- a/mods/content/corporate/datum/antagonists/deathsquad.dm +++ b/mods/content/corporate/datum/antagonists/deathsquad.dm @@ -48,7 +48,7 @@ l_pocket = /obj/item/pinpointer r_pocket = /obj/item/disk/nuclear -/decl/special_role/deathsquad/equip(var/mob/living/carbon/human/player) +/decl/special_role/deathsquad/equip_role(var/mob/living/carbon/human/player) if (player.mind == leader) default_outfit = /decl/hierarchy/outfit/commando/leader else diff --git a/mods/content/corporate/datum/loadout.dm b/mods/content/corporate/datum/loadout.dm index 5d33e0adf7f..096b799893c 100644 --- a/mods/content/corporate/datum/loadout.dm +++ b/mods/content/corporate/datum/loadout.dm @@ -20,7 +20,7 @@ /decl/loadout_option/suit/labcoat_corp name = "labcoat, corporate colors" path = /obj/item/clothing/suit/storage/toggle/labcoat/science - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corporate name = "corporate uniform selection" @@ -50,22 +50,22 @@ /decl/loadout_option/uniform/corp_exec name = "corporate colours, senior researcher" path = /obj/item/clothing/under/executive - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corp_overalls name = "corporate colours, coveralls" path = /obj/item/clothing/under/work - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corp_flight name = "corporate colours, flight suit" path = /obj/item/clothing/under/pilot - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corp_exec_jacket name = "corporate colours, liason suit" path = /obj/item/clothing/under/suit_jacket/corp - flags = GEAR_HAS_TYPE_SELECTION + loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/suit/nanotrasen_poncho name = "poncho, NanoTrasen" diff --git a/mods/content/corporate/datum/robolimbs.dm b/mods/content/corporate/datum/robolimbs.dm index 8f2e54ef0df..841249d2836 100644 --- a/mods/content/corporate/datum/robolimbs.dm +++ b/mods/content/corporate/datum/robolimbs.dm @@ -5,7 +5,7 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) /decl/bodytype/prosthetic/bishop/rook @@ -39,7 +39,7 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) /decl/bodytype/prosthetic/xion/econo @@ -49,7 +49,7 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) /decl/bodytype/prosthetic/wardtakahashi @@ -60,7 +60,7 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) /decl/bodytype/prosthetic/morpheus @@ -88,7 +88,7 @@ // todo: add synthflesh material? material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) /decl/bodytype/prosthetic/veymed/masculine @@ -116,7 +116,7 @@ bodytype_category = BODYTYPE_HUMANOID material = /decl/material/solid/metal/aluminium matter = list( - /decl/material/solid/plastic = MATTER_AMOUNT_SECONDARY + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) /decl/bodytype/prosthetic/nanotrasen @@ -124,7 +124,7 @@ desc = "This limb is made from a cheap polymer." icon_base = 'mods/content/corporate/icons/cyberlimbs/nanotrasen/nanotrasen_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/shellguard, shellguard) DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/nanotrasen, nanotrasen) diff --git a/mods/content/corporate/icons/lunchbox_dais.dmi b/mods/content/corporate/icons/lunchbox_dais.dmi new file mode 100644 index 00000000000..ce2477fef72 Binary files /dev/null and b/mods/content/corporate/icons/lunchbox_dais.dmi differ diff --git a/mods/content/corporate/icons/lunchbox_nanotrasen.dmi b/mods/content/corporate/icons/lunchbox_nanotrasen.dmi new file mode 100644 index 00000000000..1a315285862 Binary files /dev/null and b/mods/content/corporate/icons/lunchbox_nanotrasen.dmi differ diff --git a/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi b/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi index 4a9df55f933..e312d83b55b 100644 Binary files a/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi and b/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi differ diff --git a/mods/content/corporate/icons/rigs/commander/helmet.dmi b/mods/content/corporate/icons/rigs/commander/helmet.dmi index 99bad70b899..896195fe1a8 100644 Binary files a/mods/content/corporate/icons/rigs/commander/helmet.dmi and b/mods/content/corporate/icons/rigs/commander/helmet.dmi differ diff --git a/mods/content/corporate/icons/rigs/engineer/helmet.dmi b/mods/content/corporate/icons/rigs/engineer/helmet.dmi index e7559d0a6a4..0c63f505f2f 100644 Binary files a/mods/content/corporate/icons/rigs/engineer/helmet.dmi and b/mods/content/corporate/icons/rigs/engineer/helmet.dmi differ diff --git a/mods/content/corporate/icons/rigs/janitor/helmet.dmi b/mods/content/corporate/icons/rigs/janitor/helmet.dmi index ab136668772..1f3b3bdc7a6 100644 Binary files a/mods/content/corporate/icons/rigs/janitor/helmet.dmi and b/mods/content/corporate/icons/rigs/janitor/helmet.dmi differ diff --git a/mods/content/corporate/icons/rigs/medic/helmet.dmi b/mods/content/corporate/icons/rigs/medic/helmet.dmi index 2a8c3f0d258..9d3aa70b3cf 100644 Binary files a/mods/content/corporate/icons/rigs/medic/helmet.dmi and b/mods/content/corporate/icons/rigs/medic/helmet.dmi differ diff --git a/mods/content/corporate/icons/rigs/security/helmet.dmi b/mods/content/corporate/icons/rigs/security/helmet.dmi index f31f3f84cb0..df061882fbf 100644 Binary files a/mods/content/corporate/icons/rigs/security/helmet.dmi and b/mods/content/corporate/icons/rigs/security/helmet.dmi differ diff --git a/mods/content/corporate/items/clutter.dm b/mods/content/corporate/items/clutter.dm index f81ae0c829a..2a3f6e2772d 100644 --- a/mods/content/corporate/items/clutter.dm +++ b/mods/content/corporate/items/clutter.dm @@ -6,14 +6,12 @@ /obj/item/storage/lunchbox/dais name = "\improper DAIS brand lunchbox" - icon_state = "lunchbox_dais" - item_state = "toolbox_blue" + icon = 'mods/content/corporate/icons/lunchbox_dais.dmi' desc = "A little lunchbox. This one is branded with the Deimos Advanced Information Systems logo!" /obj/item/storage/lunchbox/nt name = "\improper NanoTrasen brand lunchbox" - icon_state = "lunchbox_nanotrasen" - item_state = "toolbox_blue" + icon = 'mods/content/corporate/icons/lunchbox_nanotrasen.dmi' desc = "A little lunchbox. This one is branded with the NanoTrasen logo!" /obj/item/storage/lunchbox/nt/filled diff --git a/mods/content/corporate/items/documents.dm b/mods/content/corporate/items/documents.dm index 13cd7e1ded3..d722d5c411a 100644 --- a/mods/content/corporate/items/documents.dm +++ b/mods/content/corporate/items/documents.dm @@ -4,107 +4,111 @@ description_antag = "A conglomerate of powerful corporations seems to be wanting to create weaponized xenobiological species. Probably as a form of WMD, by your best guess." icon_state = "docs_verified" -/obj/item/book/manual/nt_regs +/obj/item/book/fluff/nt_regs name = "Corporate Regulations" desc = "A set of corporate guidelines for employees of a megacorporation." icon_state = "booknanoregs" author = "Employee Materials" title = "Corporate Regulations" - url = "Corporate_Regulations" + fluff_text = "The book is empty..." /obj/item/book/union_charter name = "\improper Union Charter" + unique = TRUE title = "Union Charter of Workplace Rights" author = "Corporate Union" - dat = {"Corporate Union Charter of Workplace Rights - -

    0. Summary

    -
    -

    As a union representative, you are required to uphold the interests of contracted workers on your station or vessel. You are empowered to inspect workplaces and instigate cessation of contracted work when on green alert, with diminishing powers during a state of emergency. You do not have authority or jurisdiction over government or military workers, or any workers who are not card-carrying signatories to this Charter.

    -

    1. Introduction

    -

    This Charter of Rights sets out the rights and responsibilities of all workplace parties in the provision of decent and fair health, safety, compensation and rehabilitation systems and practices within affiliated workplaces. Regardless of jurisdiction, changes to occupational health and safety, compensation and rehabilitation law must not result in a diminution of the rights and entitlements of any worker.

    -

    This Charter does not apply to staff who are not signatory to the Solar Employee General Award, or are signatory to other workplace regulatory documents such as the internal protocols of your local legislative body. Union representatives must take care to ensure that their operations on mixed jurisdiction stations and vessels are restricted to those areas that have a union worker, contractor or labourer presence.

    -

    Workers must not be adversely affected by any employer moving between jurisdictions in relation to their OHS and workers compensation entitlements. Any proposed move between jurisdictions will only occur following genuine consultation and agreement with workers and their representatives and a process of public review, including public tribunal hearings.

    -

    Consistent with OHS and Worker Compensation Policy and interstellar standards, Solar law must ensure healthy and safe workplaces and a compensation and rehabilitation system which ensures that no worker is disadvantaged should they be injured at work.

    -

    All workers have the right to join a genuine trade union. Union organised workplaces are safer workplaces.

    -

    2. Security Levels

    -
    -

    On stations or vessels employing the standard Security Alert Level protocol, the following conditions apply:

    -
      -
    • On green alert, all particulars of this charter are considered valid and applicable.
    • -
    • Above green alert, union representatives are not permitted to conduct workplace inspections and are advised, but not required, to cease all union meetings or strike proceedings.
    • -
    • On red alert or above, this charter is suspended, and all union representatives and workers must follow directives from personnel authorized under red alert protocol.
    • -
    -

    3. Representation

    -
    -

    Every worker has the right to be represented on health, safety, compensation, rehabilitation and return to work issues, by their elected Union Representative and their union. Every worker has the right to elect health and safety representatives.

    -

    Unions have the right to:

    -
      -
    • Enter workplaces on health and safety issues;
    • -
    • Investigate breaches of health and safety laws;
    • -
    • Represent members and prospective members;
    • -
    • Initiate investigations and prosecutions for occupational health and safety breaches;
    • -
    • Initiate cessation of work in unsafe areas; and
    • -
    • Access all relevant information and reports.
    • -
    -

    Union Representatives have the right to:

    -
      -
    • Be democratically elected by a process determined by workers, in conjunction with their union;
    • -
    • Utilise legal rights and powers to represent workers on health and safety matters;
    • -
    • Inspect the workplace, within the agreed-upon confines previously noted;
    • -
    • Access relevant information and be informed of all incidents;
    • -
    • Be consulted by the employer before workplace changes occur that may affect health and safety;
    • -
    • Issue notices when breaches are detected;
    • -
    • Call in government inspectors;
    • -
    • Direct workers to cease work where there is a belief of immediate risk to health and safety;
    • -
    • Seek resolution of health and safety issues;
    • -
    • Perform all OHS activities on paid time and have adequate facilities;
    • -
    • Be assisted by any person at any time in the execution of union duties;
    • -
    • Be protected by law from discrimination, harassment, bullying, intimidation and prosecution;
    • -
    • Appeal any decision of a regulator or court regarding any health and safety, compensation or rehabilitation matter.
    • -
    -

    4. Workers

    -
    -

    Every worker has the right to: -

      -
    • A safe and healthy workplace;
    • -
    • Travel to and from work sites in safety and with appropriate protections;
    • -
    • Return home from work free of injury or illness;
    • -
    • Enjoy the highest level of protection, representation, compensation and rehabilitation, regardless of the jurisdiction within which they work;
    • -
    • Take collective action over any health and safety matter, including the right to cease unsafe or unhealthy work; and
    • -
    • Discuss, negotiate and be consulted and involved in all issues affecting their health, safety and welfare.
    • -
    -

    All workers (or prospective workers), including health and safety representatives, will be protected by law from discrimination, harassment, bullying or detriment to their employment because they have raised a health and safety issue, lodged a compensation claim or been involved in consultation on workplace health and safety matters.

    -

    4. Employer Responsibilities

    -
    -

    Persons who control, manage or own workplaces have an absolute duty of care without limitation to provide and maintain safe and healthy work environments. Employers will not shift jurisdictions to attempt to avoid their OHS and workers compensation responsibilities and obligations. Employers are subject to all the obligations and responsibilities contained within this Charter.

    -

    5. Compensation

    -
    -

    Following a physical or psychological injury, all workers have the right to a fair, just and equitable compensation system, which promotes the best medical and like support, the most effective rehabilitation for injured workers and facilitates a safe return to work that offers genuine job security. Workers' compensation standards are to:

    -
  • Be available to all members of the workforce;
  • -
  • Provide compensation for all injuries that arise from travel to, from or during work including and during recess breaks;
  • -
  • Be available upon the death of a worker and for dependants of that worker;
  • -
  • Be based on the 100% replacement of loss of income;
  • -
  • Provide total cost of medical rehabilitation and other related expenses;
  • -
  • Provide lump sum compensation for permanent disability;
  • -
  • Ensure common law rights;
  • -
  • Support rehabilitation and return to work;
  • -
  • Ensure that workers are entitled to timely and effective claim determination and dispute resolution processes;
  • -
  • Ensure the worker has access to the doctor of their choice; and
  • -
  • Not be eroded by companies seeking to self-insure in order to obtain lower OHS and worker's compensation entitlements for workers.
  • - -

    6. Rehabilitation

    -
    -

    All workers have the right to return to safe, suitable, meaningful and sustainable work, following the provision of quality rehabilitation services, commensurate to need. Rehabilitation will include the right to:

    -
      -
    • Union representation;
    • -
    • Fair, equitable, high quality, appropriate, effective and timely rehabilitation plans and services;
    • -
    • Consultation about all aspects of rehabilitation;
    • -
    • All documentation and information relating to their rehabilitation;
    • -
    • Privacy in the management of all records and information; and
    • -
    • Personal choice of medical provider and rehabilitation service, where facilities permit.
    • -
    - + dat = {" + + Corporate Union Charter of Workplace Rights + + +

    0. Summary

    +
    +

    As a union representative, you are required to uphold the interests of contracted workers on your station or vessel. You are empowered to inspect workplaces and instigate cessation of contracted work when on green alert, with diminishing powers during a state of emergency. You do not have authority or jurisdiction over government or military workers, or any workers who are not card-carrying signatories to this Charter.

    +

    1. Introduction

    +

    This Charter of Rights sets out the rights and responsibilities of all workplace parties in the provision of decent and fair health, safety, compensation and rehabilitation systems and practices within affiliated workplaces. Regardless of jurisdiction, changes to occupational health and safety, compensation and rehabilitation law must not result in a diminution of the rights and entitlements of any worker.

    +

    This Charter does not apply to staff who are not signatory to the Solar Employee General Award, or are signatory to other workplace regulatory documents such as the internal protocols of your local legislative body. Union representatives must take care to ensure that their operations on mixed jurisdiction stations and vessels are restricted to those areas that have a union worker, contractor or labourer presence.

    +

    Workers must not be adversely affected by any employer moving between jurisdictions in relation to their OHS and workers compensation entitlements. Any proposed move between jurisdictions will only occur following genuine consultation and agreement with workers and their representatives and a process of public review, including public tribunal hearings.

    +

    Consistent with OHS and Worker Compensation Policy and interstellar standards, Solar law must ensure healthy and safe workplaces and a compensation and rehabilitation system which ensures that no worker is disadvantaged should they be injured at work.

    +

    All workers have the right to join a genuine trade union. Union organised workplaces are safer workplaces.

    +

    2. Security Levels

    +
    +

    On stations or vessels employing the standard Security Alert Level protocol, the following conditions apply:

    +
      +
    • On green alert, all particulars of this charter are considered valid and applicable.
    • +
    • Above green alert, union representatives are not permitted to conduct workplace inspections and are advised, but not required, to cease all union meetings or strike proceedings.
    • +
    • On red alert or above, this charter is suspended, and all union representatives and workers must follow directives from personnel authorized under red alert protocol.
    • +
    +

    3. Representation

    +
    +

    Every worker has the right to be represented on health, safety, compensation, rehabilitation and return to work issues, by their elected Union Representative and their union. Every worker has the right to elect health and safety representatives.

    +

    Unions have the right to:

    +
      +
    • Enter workplaces on health and safety issues;
    • +
    • Investigate breaches of health and safety laws;
    • +
    • Represent members and prospective members;
    • +
    • Initiate investigations and prosecutions for occupational health and safety breaches;
    • +
    • Initiate cessation of work in unsafe areas; and
    • +
    • Access all relevant information and reports.
    • +
    +

    Union Representatives have the right to:

    +
      +
    • Be democratically elected by a process determined by workers, in conjunction with their union;
    • +
    • Utilise legal rights and powers to represent workers on health and safety matters;
    • +
    • Inspect the workplace, within the agreed-upon confines previously noted;
    • +
    • Access relevant information and be informed of all incidents;
    • +
    • Be consulted by the employer before workplace changes occur that may affect health and safety;
    • +
    • Issue notices when breaches are detected;
    • +
    • Call in government inspectors;
    • +
    • Direct workers to cease work where there is a belief of immediate risk to health and safety;
    • +
    • Seek resolution of health and safety issues;
    • +
    • Perform all OHS activities on paid time and have adequate facilities;
    • +
    • Be assisted by any person at any time in the execution of union duties;
    • +
    • Be protected by law from discrimination, harassment, bullying, intimidation and prosecution;
    • +
    • Appeal any decision of a regulator or court regarding any health and safety, compensation or rehabilitation matter.
    • +
    +

    4. Workers

    +
    +

    Every worker has the right to: +

      +
    • A safe and healthy workplace;
    • +
    • Travel to and from work sites in safety and with appropriate protections;
    • +
    • Return home from work free of injury or illness;
    • +
    • Enjoy the highest level of protection, representation, compensation and rehabilitation, regardless of the jurisdiction within which they work;
    • +
    • Take collective action over any health and safety matter, including the right to cease unsafe or unhealthy work; and
    • +
    • Discuss, negotiate and be consulted and involved in all issues affecting their health, safety and welfare.
    • +
    +

    All workers (or prospective workers), including health and safety representatives, will be protected by law from discrimination, harassment, bullying or detriment to their employment because they have raised a health and safety issue, lodged a compensation claim or been involved in consultation on workplace health and safety matters.

    +

    4. Employer Responsibilities

    +
    +

    Persons who control, manage or own workplaces have an absolute duty of care without limitation to provide and maintain safe and healthy work environments. Employers will not shift jurisdictions to attempt to avoid their OHS and workers compensation responsibilities and obligations. Employers are subject to all the obligations and responsibilities contained within this Charter.

    +

    5. Compensation

    +
    +

    Following a physical or psychological injury, all workers have the right to a fair, just and equitable compensation system, which promotes the best medical and like support, the most effective rehabilitation for injured workers and facilitates a safe return to work that offers genuine job security. Workers' compensation standards are to:

    +
  • Be available to all members of the workforce;
  • +
  • Provide compensation for all injuries that arise from travel to, from or during work including and during recess breaks;
  • +
  • Be available upon the death of a worker and for dependants of that worker;
  • +
  • Be based on the 100% replacement of loss of income;
  • +
  • Provide total cost of medical rehabilitation and other related expenses;
  • +
  • Provide lump sum compensation for permanent disability;
  • +
  • Ensure common law rights;
  • +
  • Support rehabilitation and return to work;
  • +
  • Ensure that workers are entitled to timely and effective claim determination and dispute resolution processes;
  • +
  • Ensure the worker has access to the doctor of their choice; and
  • +
  • Not be eroded by companies seeking to self-insure in order to obtain lower OHS and worker's compensation entitlements for workers.
  • + +

    6. Rehabilitation

    +
    +

    All workers have the right to return to safe, suitable, meaningful and sustainable work, following the provision of quality rehabilitation services, commensurate to need. Rehabilitation will include the right to:

    +
      +
    • Union representation;
    • +
    • Fair, equitable, high quality, appropriate, effective and timely rehabilitation plans and services;
    • +
    • Consultation about all aspects of rehabilitation;
    • +
    • All documentation and information relating to their rehabilitation;
    • +
    • Privacy in the management of all records and information; and
    • +
    • Personal choice of medical provider and rehabilitation service, where facilities permit.
    • +
    + "} /obj/item/folder/nt diff --git a/mods/content/corporate/items/wristcomp.dm b/mods/content/corporate/items/wristcomp.dm index 800b0962732..5f9cc48611d 100644 --- a/mods/content/corporate/items/wristcomp.dm +++ b/mods/content/corporate/items/wristcomp.dm @@ -8,7 +8,7 @@ color = COLOR_GUNMETAL light_color = LIGHT_COLOR_GREEN -/obj/item/modular_computer/pda/wrist/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) +/obj/item/modular_computer/pda/wrist/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) var/datum/extension/interactive/os/os = get_extension(src, /datum/extension/interactive/os) var/datum/extension/assembly/modular_computer/assembly = get_extension(src, /datum/extension/assembly) @@ -32,15 +32,7 @@ return attack_self(user) return ..() -/obj/item/modular_computer/pda/wrist/handle_mouse_drop(atom/over, mob/user) - if(ishuman(user) && loc == user && user.try_unequip(src)) - user.put_in_hands(src) - add_fingerprint(usr) - return TRUE - . = ..() - // wrist box // - /obj/item/storage/box/wrist name = "box of spare wrist computers" desc = "A box of spare wrist microcomputers." diff --git a/mods/content/generic_shuttles/tanker/tanker.dmm b/mods/content/generic_shuttles/tanker/tanker.dmm index 704b701c15b..02a3995e394 100644 --- a/mods/content/generic_shuttles/tanker/tanker.dmm +++ b/mods/content/generic_shuttles/tanker/tanker.dmm @@ -300,7 +300,7 @@ dir = 4 }, /obj/machinery/fabricator/pipe{ - anchored = TRUE + anchored = 1 }, /turf/simulated/floor/plating, /area/tanker) diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index 374733c1914..b65eb7f6c69 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -1973,7 +1973,6 @@ "gu" = ( /obj/machinery/door/blast/regular/open{ dir = 4; - icon_state = "pdoor0"; id_tag = "prototype_chamber_blast" }, /obj/machinery/door/firedoor, @@ -2584,7 +2583,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/unary/engine{ - anchored = FALSE + anchored = 0 }, /turf/unsimulated/beach/sand, /area/icarus/open) diff --git a/mods/content/government/away_sites/icarus/icarus.dm b/mods/content/government/away_sites/icarus/icarus.dm index c8beec7dc21..c05dc5a6c3a 100644 --- a/mods/content/government/away_sites/icarus/icarus.dm +++ b/mods/content/government/away_sites/icarus/icarus.dm @@ -74,7 +74,7 @@ icon = 'mods/content/government/away_sites/icarus/icarus_sprites.dmi' icon_state = "dead_personnel" w_class = ITEM_SIZE_LARGE//pile of bones - material = /decl/material/solid/bone + material = /decl/material/solid/organic/bone /obj/item/disk/icarus name = "black box backup disk" diff --git a/mods/content/government/datum/ai_laws.dm b/mods/content/government/datum/ai_laws.dm index 0452bdcaad5..c31bd6571cd 100644 --- a/mods/content/government/datum/ai_laws.dm +++ b/mods/content/government/datum/ai_laws.dm @@ -25,7 +25,7 @@ /obj/item/aiModule/solgov name = "'SCG Expeditionary' Core AI Module" desc = "An 'SCG Expeditionary' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' laws = new/datum/ai_laws/solgov /******************** SCG Aggressive ********************/ @@ -33,5 +33,5 @@ /obj/item/aiModule/solgov_aggressive name = "\improper 'Military' Core AI Module" desc = "A 'Military' Core AI Module: 'Reconfigures the AI's core laws.'." - origin_tech = "{'programming':3,'materials':4}" + origin_tech = @'{"programming":3,"materials":4}' laws = new/datum/ai_laws/solgov_aggressive diff --git a/mods/content/government/items/clutter.dm b/mods/content/government/items/clutter.dm index 525b3cde1f9..e74d2a66962 100644 --- a/mods/content/government/items/clutter.dm +++ b/mods/content/government/items/clutter.dm @@ -7,7 +7,7 @@ attack_verb = list("whipped") hitsound = 'sound/weapons/towelwhip.ogg' desc = "The iconic flag of the Sol Central Government, a symbol with many different meanings." - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic /obj/structure/banner_frame/solgov banner = /obj/item/banner/solgov diff --git a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dm b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dm index f1923319387..64e7aa4c84e 100644 --- a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dm +++ b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dm @@ -58,7 +58,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "docs_part" item_state = "paper" - material = /decl/material/solid/cardboard //#TODO: Replace with paper + material = /decl/material/solid/organic/paper /obj/item/ecletters/Initialize() . = ..() diff --git a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm index d5d69bcf176..274d444277f 100644 --- a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm +++ b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm @@ -16,12 +16,9 @@ /area/map_template/ecship/cockpit) "ae" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /obj/abstract/landmark/scorcher, @@ -223,12 +220,9 @@ /area/map_template/ecship/science) "aL" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor, @@ -1204,7 +1198,7 @@ dir = 10 }, /obj/machinery/smartfridge{ - density = FALSE + density = 0 }, /turf/simulated/floor/tiled/white/lowpressure, /area/map_template/ecship/science) @@ -1410,12 +1404,9 @@ /area/map_template/ecship/engine) "dd" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE }, /obj/machinery/door/firedoor, /turf/simulated/floor, @@ -1714,13 +1705,10 @@ /area/map_template/ecship/engine) "dJ" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/machinery/door/blast/regular{ - density = FALSE; - icon_state = "pdoor0"; +/obj/machinery/door/blast/regular/open{ id_tag = "scraplock"; name = "External Blast Doors"; - opacity = FALSE - }, +3 }, /obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "1-2" diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 6f4a1fe4f74..101ade1f339 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -101,8 +101,8 @@ var/global/datum/matchmaker/matchmaker = new() if(!M.current) //no extremely platonic relationships return FALSE - var/decl/special_role/special_role_data = ispath(M.assigned_special_role, /decl/special_role) && GET_DECL(M.assigned_special_role) - if(special_role_data && (special_role_data.flags & ANTAG_OVERRIDE_JOB)) + var/decl/special_role/special_role_data = GET_DECL(M.assigned_special_role) + if(istype(special_role_data) && (special_role_data.flags & ANTAG_OVERRIDE_JOB)) return FALSE return TRUE diff --git a/mods/content/mouse_highlights/mouse_highlight_client.dm b/mods/content/mouse_highlights/mouse_highlight_client.dm index 1dad1018cd6..adf07fbe5a9 100644 --- a/mods/content/mouse_highlights/mouse_highlight_client.dm +++ b/mods/content/mouse_highlights/mouse_highlight_client.dm @@ -11,7 +11,7 @@ /client/New() // Cache our callback as we will potentially be using it (10 / ticklag) times per second, - mouseover_callback = CALLBACK(src, .proc/refresh_mouseover_highlight_timer) + mouseover_callback = CALLBACK(src, PROC_REF(refresh_mouseover_highlight_timer)) . = ..() // This proc iterates constantly whenever something is being mouseover'd, so that it diff --git a/mods/content/psionics/datum/antagonists/foundation.dm b/mods/content/psionics/datum/antagonists/foundation.dm index c5f49c5d51a..edb83213e0a 100644 --- a/mods/content/psionics/datum/antagonists/foundation.dm +++ b/mods/content/psionics/datum/antagonists/foundation.dm @@ -25,7 +25,7 @@ default_outfit = /decl/hierarchy/outfit/foundation id_title = "Foundation Agent" -/decl/special_role/foundation/equip(var/mob/living/carbon/human/player) +/decl/special_role/foundation/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) player.set_psi_rank(PSI_REDACTION, 3, defer_update = TRUE) diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 9871aaf0af2..b7cb8f27c74 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -23,7 +23,7 @@ gloves = /obj/item/clothing/gloves/color/grey id_type = /obj/item/card/id/syndicate -/decl/special_role/paramount/equip(var/mob/living/carbon/human/player) +/decl/special_role/paramount/equip_role(var/mob/living/carbon/human/player) . = ..() if(.) player.set_psi_rank(PSI_REDACTION, 3, defer_update = TRUE) diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 4cbc86e54ad..119cfbc1c2e 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -13,7 +13,7 @@ required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) result_amount = 1 -/decl/chemical_reaction/synthesis/nullglass/get_reaction_flags(var/datum/reagents/holder) +/decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) var/weakref/donor_ref = LAZYACCESS(blood_data, "donor") var/mob/living/donor = donor_ref?.resolve() @@ -21,7 +21,7 @@ . = (istype(donor) && (donor.psi || (donor.mind && wizards.is_antagonist(donor.mind)))) /decl/chemical_reaction/synthesis/nullglass/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) - var/location = get_turf(holder.get_reaction_loc()) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(reaction_flags) for(var/i = 1, i <= created_volume, i++) new /obj/item/soulstone(location) diff --git a/mods/content/psionics/datum/codex.dm b/mods/content/psionics/datum/codex.dm index cac5a264042..94ffe0c9962 100644 --- a/mods/content/psionics/datum/codex.dm +++ b/mods/content/psionics/datum/codex.dm @@ -26,7 +26,7 @@ name = "Psionics" associated_strings = list("psychic powers") associated_paths = list( - /obj/item/book/manual/psionics, + /obj/item/book/fluff/psionics, /obj/item/clothing/head/helmet/space/psi_amp, /obj/item/clothing/head/helmet/space/psi_amp/lesser ) diff --git a/mods/content/psionics/datum/jobs.dm b/mods/content/psionics/datum/jobs.dm index c4002480487..6d56ca0f216 100644 --- a/mods/content/psionics/datum/jobs.dm +++ b/mods/content/psionics/datum/jobs.dm @@ -6,7 +6,7 @@ /datum/job/submap give_psionic_implant_on_join = FALSE -/datum/job/equip(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/equip_job(var/mob/living/carbon/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(psi_latency_chance && prob(psi_latency_chance)) H.set_psi_rank(pick(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS), 1, defer_update = TRUE) diff --git a/mods/content/psionics/items/literature.dm b/mods/content/psionics/items/literature.dm index 94befe6938d..84b3d235399 100644 --- a/mods/content/psionics/items/literature.dm +++ b/mods/content/psionics/items/literature.dm @@ -1,29 +1,11 @@ -/obj/item/book/manual/psionics +/obj/item/book/fluff/psionics name = "Psychonetics" icon_state = "foundation" author = "John Titor" title = "Psychonetics" - - dat = {" - - - - -

    Psychonetics

    - -

    This seems to be a dry, longwinded reference text for the form of strange mental powers called psionics. The author spends way too much time trying to advertise his cult, though.

    - -

    The general gist of things seems to be that sometime in the last decade or so, the first cases of 'spontaneous operancy' became known. People who spent a lot of time in deep space, or who studied certain esoteric fields of mathematics, became able to perform strange feats like levitating coins or removing headaches with nothing but their minds. The text goes on to explain that psionics are perfectly harmless, and that studies (no citations) have shown operants are no more likely to go mad and murder people than anyone else.

    - -

    A postscript by a group called the Cuchulain Foundation invites anyone who knows an operant, or thinks they might be one, to send them a message via comms and get enrolled in their training and registration program in orbit around Neptune. It's catered. The postscript adds hastily that you should never try to activate your own latencies with trauma or drugs, as the results are often lethal.

    - - - - "} + fluff_text = {" +

    Psychonetics

    +

    This seems to be a dry, longwinded reference text for the form of strange mental powers called psionics. The author spends way too much time trying to advertise his cult, though.

    +

    The general gist of things seems to be that sometime in the last decade or so, the first cases of 'spontaneous operancy' became known. People who spent a lot of time in deep space, or who studied certain esoteric fields of mathematics, became able to perform strange feats like levitating coins or removing headaches with nothing but their minds. The text goes on to explain that psionics are perfectly harmless, and that studies (no citations) have shown operants are no more likely to go mad and murder people than anyone else.

    +

    A postscript by a group called the Cuchulain Foundation invites anyone who knows an operant, or thinks they might be one, to send them a message via comms and get enrolled in their training and registration program in orbit around Neptune. It's catered. The postscript adds hastily that you should never try to activate your own latencies with trauma or drugs, as the results are often lethal.

    + "} diff --git a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm index c71ab4cfa9f..a1535398446 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm @@ -41,7 +41,7 @@ /datum/psi_complexus/proc/can_use(var/incapacitation_flags) return (owner.stat == CONSCIOUS && (!incapacitation_flags || !owner.incapacitated(incapacitation_flags)) && !suppressed && !stun && world.time >= next_power_use) -/datum/psi_complexus/proc/spend_power(var/value = 0, var/check_incapacitated) +/datum/psi_complexus/proc/spend_power(var/value = 0, var/check_incapacitated, var/backblast_on_failure = TRUE) . = FALSE if(isnull(check_incapacitated)) check_incapacitated = (INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT) @@ -52,7 +52,8 @@ ui.update_icon() . = TRUE else - backblast(abs(stamina - value)) + if(backblast_on_failure) + backblast(abs(stamina - value)) stamina = 0 . = FALSE ui.update_icon() diff --git a/mods/content/psionics/system/psionics/complexus/complexus_process.dm b/mods/content/psionics/system/psionics/complexus/complexus_process.dm index 8e7367813f0..94af375a292 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_process.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_process.dm @@ -106,7 +106,7 @@ else if(owner.stat == UNCONSCIOUS) stamina = min(max_stamina, stamina + rand(3,5)) - if(!owner.nervous_system_failure() && owner.stat == CONSCIOUS && stamina && !suppressed && get_rank(PSI_REDACTION) >= PSI_RANK_OPERANT) + if(!owner.nervous_system_failure() && owner.stat != DEAD && stamina && !suppressed && get_rank(PSI_REDACTION) >= PSI_RANK_OPERANT) attempt_regeneration() var/next_aura_size = max(0.1,((stamina/max_stamina)*min(3,rating))/5) @@ -159,6 +159,10 @@ else return + if(owner.stat != CONSCIOUS) + mend_prob = round(mend_prob * 0.65) + heal_rate = round(heal_rate * 0.65) + if(!heal_rate || stamina < heal_rate) return // Don't backblast from trying to heal ourselves thanks. @@ -184,6 +188,10 @@ if(BP_IS_PROSTHETIC(I) || BP_IS_CRYSTAL(I)) continue + // Autoredaction doesn't heal brain damage directly. + if(I.organ_tag == BP_BRAIN) + continue + if(I.damage > 0 && spend_power(heal_rate)) I.damage = max(I.damage - heal_rate, 0) if(prob(25)) @@ -196,12 +204,6 @@ if(BP_IS_PROSTHETIC(E)) continue - if(heal_internal && (E.status & ORGAN_BROKEN) && E.damage < (E.min_broken_damage * config.organ_health_multiplier)) // So we don't mend and autobreak. - if(spend_power(heal_rate)) - if(E.mend_fracture()) - to_chat(H, SPAN_NOTICE("Your autoredactive faculty coaxes together the shattered bones in your [E.name].")) - return - if(heal_bleeding) if((E.status & ORGAN_ARTERY_CUT) && spend_power(heal_rate)) @@ -215,7 +217,6 @@ return TRUE for(var/datum/wound/W in E.wounds) - if(W.bleeding() && spend_power(heal_rate)) to_chat(H, SPAN_NOTICE("Your autoredactive faculty knits together severed veins, stemming the bleeding from \a [W.desc] on your [E.name].")) W.bleed_timer = 0 @@ -240,8 +241,8 @@ // Heal everything left. if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss()) && spend_power(heal_rate)) - owner.adjustBruteLoss(-(heal_rate)) - owner.adjustFireLoss(-(heal_rate)) + owner.adjustBruteLoss(-(heal_rate), do_update_health = FALSE) + owner.adjustFireLoss(-(heal_rate), do_update_health = FALSE) owner.adjustOxyLoss(-(heal_rate)) if(prob(25)) to_chat(owner, SPAN_NOTICE("Your skin crawls as your autoredactive faculty heals your body.")) diff --git a/mods/content/psionics/system/psionics/equipment/psipower.dm b/mods/content/psionics/system/psionics/equipment/psipower.dm index d6bb3add998..7706f5fc465 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower.dm @@ -54,6 +54,6 @@ /obj/item/psychic_power/Process() if(istype(owner)) - owner.psi.spend_power(maintain_cost) + owner.psi.spend_power(maintain_cost, backblast_on_failure = FALSE) if((!owner || owner.do_psionics_check(maintain_cost, owner) || loc != owner || !(src in owner.get_held_items())) && !QDELETED(src)) qdel(src) diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index c4929c597b1..2fb94d15442 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -93,6 +93,10 @@ E.status &= ~ORGAN_BROKEN E.stage = 0 return TRUE + if(E.is_dislocated() && !E.is_parent_dislocated()) + to_chat(user, SPAN_NOTICE("You carefully guide the dislocated joint back into place and soothe the inflamed muscles.")) + E.undislocate(skip_pain = TRUE) + return TRUE for(var/datum/wound/W in E.wounds) if(W.bleeding()) @@ -107,7 +111,7 @@ if(redaction_rank >= PSI_RANK_GRANDMASTER) for(var/obj/item/organ/internal/I in E.internal_organs) - if(!BP_IS_PROSTHETIC(I) && !BP_IS_CRYSTAL(I) && I.damage > 0) + if(!BP_IS_PROSTHETIC(I) && !BP_IS_CRYSTAL(I) && I.damage > 0 && I.organ_tag != BP_BRAIN) to_chat(user, SPAN_NOTICE("You encourage the damaged tissue of \the [I] to repair itself.")) var/heal_rate = redaction_rank I.damage = max(0, I.damage - rand(heal_rate,heal_rate*2)) diff --git a/mods/content/psionics/system/psionics/interface/ui.dm b/mods/content/psionics/system/psionics/interface/ui.dm index 524f3d79e0c..a3f8a3317db 100644 --- a/mods/content/psionics/system/psionics/interface/ui.dm +++ b/mods/content/psionics/system/psionics/interface/ui.dm @@ -1,21 +1,13 @@ /obj/screen/psi icon = 'mods/content/psionics/icons/psi.dmi' - var/mob/living/owner var/hidden = TRUE -/obj/screen/psi/Initialize(var/ml, var/mob/_owner) +/obj/screen/psi/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) . = ..() - owner = _owner - forceMove(null) update_icon() -/obj/screen/psi/Destroy() - if(owner && owner.client) - owner.client.screen -= src - . = ..() - /obj/screen/psi/on_update_icon() if(hidden) - invisibility = 101 + set_invisibility(INVISIBILITY_ABSTRACT) else - invisibility = 0 \ No newline at end of file + set_invisibility(INVISIBILITY_NONE) \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/interface/ui_hub.dm b/mods/content/psionics/system/psionics/interface/ui_hub.dm index b72ce944be8..b9ff65b98d2 100644 --- a/mods/content/psionics/system/psionics/interface/ui_hub.dm +++ b/mods/content/psionics/system/psionics/interface/ui_hub.dm @@ -8,20 +8,19 @@ var/image/on_cooldown var/list/components -/obj/screen/psi/hub/Initialize() +/obj/screen/psi/hub/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) . = ..() on_cooldown = image(icon, "cooldown") components = list( - new /obj/screen/psi/armour(loc, owner), - new /obj/screen/psi/toggle_psi_menu(loc, owner, src) - ) + new /obj/screen/psi/armour(null, _owner), + new /obj/screen/psi/toggle_psi_menu(null, _owner, null, null, null, src) + ) START_PROCESSING(SSprocessing, src) /obj/screen/psi/hub/on_update_icon() - - if(!owner.psi) + var/mob/living/owner = owner_ref?.resolve() + if(!istype(owner) || !owner.psi) return - icon_state = owner.psi.suppressed ? "psi_suppressed" : "psi_active" if(world.time < owner.psi.next_power_use) overlays |= on_cooldown @@ -35,13 +34,13 @@ /obj/screen/psi/hub/Destroy() STOP_PROCESSING(SSprocessing, src) - owner = null for(var/thing in components) qdel(thing) components.Cut() . = ..() /obj/screen/psi/hub/Process() + var/mob/living/owner = owner_ref?.resolve() if(!istype(owner)) qdel(src) return @@ -50,7 +49,12 @@ maptext = "[round((owner.psi.stamina/owner.psi.max_stamina)*100)]%" update_icon() -/obj/screen/psi/hub/Click(var/location, var/control, var/params) +/obj/screen/psi/hub/handle_click(mob/user, params) + + var/mob/living/owner = owner_ref?.resolve() + if(!istype(owner) || !owner.psi) + return + var/list/click_params = params2list(params) if(click_params["shift"]) owner.show_psi_assay(owner) diff --git a/mods/content/psionics/system/psionics/interface/ui_toggles.dm b/mods/content/psionics/system/psionics/interface/ui_toggles.dm index 91882159eb3..62bba0cf9d9 100644 --- a/mods/content/psionics/system/psionics/interface/ui_toggles.dm +++ b/mods/content/psionics/system/psionics/interface/ui_toggles.dm @@ -5,11 +5,13 @@ /obj/screen/psi/armour/on_update_icon() ..() - if(invisibility == 0) + var/mob/living/owner = owner_ref.resolve() + if(istype(owner) && invisibility == 0) icon_state = owner?.psi.use_psi_armour ? "psiarmour_on" : "psiarmour_off" -/obj/screen/psi/armour/Click() - if(!owner?.psi) +/obj/screen/psi/armour/handle_click(mob/user, params) + var/mob/living/owner = owner_ref?.resolve() + if(!istype(owner) || !owner.psi) return owner.psi.use_psi_armour = !owner.psi.use_psi_armour if(owner.psi.use_psi_armour) @@ -26,11 +28,11 @@ icon_state = "arrow_left" var/obj/screen/psi/hub/controller -/obj/screen/psi/toggle_psi_menu/Initialize(mapload, var/mob/_owner, var/obj/screen/psi/hub/_controller) - . = ..(mapload, _owner) +/obj/screen/psi/toggle_psi_menu/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, obj/screen/psi/hub/_controller) + . = ..() controller = _controller -/obj/screen/psi/toggle_psi_menu/Click() +/obj/screen/psi/toggle_psi_menu/handle_click(mob/user, params) var/set_hidden = !hidden for(var/thing in controller.components) var/obj/screen/psi/psi = thing diff --git a/mods/content/psionics/system/psionics/mob/mob_interactions.dm b/mods/content/psionics/system/psionics/mob/mob_interactions.dm index f19c6043d43..7480f2ad4e7 100644 --- a/mods/content/psionics/system/psionics/mob/mob_interactions.dm +++ b/mods/content/psionics/system/psionics/mob/mob_interactions.dm @@ -1,7 +1,6 @@ -#define INVOKE_PSI_POWERS(holder, powers, target, return_on_invocation) \ +#define INVOKE_PSI_POWERS(holder, powers, target) \ if(holder && holder.psi && holder.psi.can_use()) { \ - for(var/thing in powers) { \ - var/decl/psionic_power/power = thing; \ + for(var/decl/psionic_power/power as anything in powers) { \ var/obj/item/result = power.invoke(holder, target); \ if(result) { \ power.handle_post_power(holder, target); \ @@ -10,28 +9,29 @@ LAZYADD(holder.psi.manifested_items, result); \ holder.put_in_hands(result); \ } \ - return return_on_invocation; \ + . = TRUE; \ + break; \ } \ } \ } /mob/living/UnarmedAttack(var/atom/A, var/proximity) - . = ..() - if(. && psi) - INVOKE_PSI_POWERS(src, psi.get_melee_powers(SSpsi.faculties_by_intent[a_intent]), A, FALSE) + if(!stat && psi) + INVOKE_PSI_POWERS(src, psi.get_melee_powers(SSpsi.faculties_by_intent[a_intent]), A) + return . || ..() /mob/living/RangedAttack(var/atom/A, var/params) if(psi) - INVOKE_PSI_POWERS(src, psi.get_ranged_powers(SSpsi.faculties_by_intent[a_intent]), A, TRUE) - . = ..() + INVOKE_PSI_POWERS(src, psi.get_ranged_powers(SSpsi.faculties_by_intent[a_intent]), A) + return . || ..() /mob/living/proc/check_psi_grab(var/obj/item/grab/grab) if(psi && ismob(grab.affecting)) - INVOKE_PSI_POWERS(src, psi.get_grab_powers(SSpsi.faculties_by_intent[a_intent]), grab.affecting, FALSE) + INVOKE_PSI_POWERS(src, psi.get_grab_powers(SSpsi.faculties_by_intent[a_intent]), grab.affecting) /mob/living/attack_empty_hand() if(psi) - INVOKE_PSI_POWERS(src, psi.get_manifestations(), src, FALSE) - . = ..() + INVOKE_PSI_POWERS(src, psi.get_manifestations(), src) + return . || ..() #undef INVOKE_PSI_POWERS \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/null/material.dm b/mods/content/psionics/system/psionics/null/material.dm index a659a0f9089..dd30a34a4c0 100644 --- a/mods/content/psionics/system/psionics/null/material.dm +++ b/mods/content/psionics/system/psionics/null/material.dm @@ -23,9 +23,11 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "solid_nullglass" -/decl/material/nullglass/generate_recipes() + +/decl/material/nullglass/generate_recipes(stack_type, reinforce_material) . = ..() - . += new /datum/stack_recipe/tile/nullglass(src) + if(!reinforce_material && islist(.) && !ispath(stack_type)) + . += new /datum/stack_recipe/tile/nullglass(src) /obj/item/shard/nullglass material = MAT_NULLGLASS diff --git a/mods/content/shackles/_shackles.dme b/mods/content/shackles/_shackles.dme index d48f7fc6e17..8685bfedc69 100644 --- a/mods/content/shackles/_shackles.dme +++ b/mods/content/shackles/_shackles.dme @@ -3,6 +3,5 @@ // BEGIN_INCLUDE #include "laws_pref.dm" #include "mind.dm" -#include "posibrain.dm" #include "shackle_lawsets.dm" #endif \ No newline at end of file diff --git a/mods/content/shackles/laws_pref.dm b/mods/content/shackles/laws_pref.dm index 7fb0a89af22..77c3b8baffa 100644 --- a/mods/content/shackles/laws_pref.dm +++ b/mods/content/shackles/laws_pref.dm @@ -28,7 +28,8 @@ W.write("is_shackled", pref.is_shackled) /datum/category_item/player_setup_item/law_pref/sanitize_character() - if(!istype(pref.laws)) pref.laws = list() + if(!istype(pref.laws)) + pref.laws = list() var/decl/bodytype/mob_bodytype = pref.get_bodytype_decl() if(!mob_bodytype?.can_be_shackled) @@ -68,6 +69,7 @@ . = jointext(.,null) /datum/category_item/player_setup_item/law_pref/OnTopic(href, href_list, user) + if(href_list["toggle_shackle"]) pref.is_shackled = !pref.is_shackled return TOPIC_REFRESH @@ -106,7 +108,3 @@ /decl/bodytype var/can_be_shackled - -/decl/bodytype/Initialize() - . = ..() - can_be_shackled = !!(BP_POSIBRAIN in has_organ) diff --git a/mods/content/shackles/posibrain.dm b/mods/content/shackles/posibrain.dm deleted file mode 100644 index 741b23fe40e..00000000000 --- a/mods/content/shackles/posibrain.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/item/organ/internal/proc/handle_shackled(var/given_lawset) - return - -/obj/item/organ/internal/posibrain/handle_shackled(var/given_lawset) - ..() - update_icon() - -/obj/item/organ/internal/posibrain/examine(mob/user) - . = ..() - if(owner?.mind?.shackle) - . += SPAN_WARNING("It is clamped in a set of metal straps with a complex digital lock.") - -/obj/item/organ/internal/posibrain/on_update_icon() - . = ..() - if(owner?.mind?.shackle) - add_overlay("posibrain-shackles") diff --git a/mods/content/xenobiology/circuit.dm b/mods/content/xenobiology/circuit.dm index 81e12500a02..2ec922fceb3 100644 --- a/mods/content/xenobiology/circuit.dm +++ b/mods/content/xenobiology/circuit.dm @@ -30,7 +30,7 @@ set_pin_data(IC_OUTPUT, 2, T.is_adult) set_pin_data(IC_OUTPUT, 3, T.nutrition/T.get_max_nutrition()) set_pin_data(IC_OUTPUT, 4, T.powerlevel) - set_pin_data(IC_OUTPUT, 5, round(T.health/T.maxHealth,0.01)*100) + set_pin_data(IC_OUTPUT, 5, T.get_health_percent(0.001)) set_pin_data(IC_OUTPUT, 6, slime_data.descendants?.Copy()) set_pin_data(IC_OUTPUT, 7, T.mutation_chance) set_pin_data(IC_OUTPUT, 8, T.cores) diff --git a/mods/content/xenobiology/colours/colour_yellow.dm b/mods/content/xenobiology/colours/colour_yellow.dm index 69b14cf8615..e19a5477099 100644 --- a/mods/content/xenobiology/colours/colour_yellow.dm +++ b/mods/content/xenobiology/colours/colour_yellow.dm @@ -17,7 +17,7 @@ /decl/slime_colour/yellow/Initialize() . = ..() - LAZYSET(reaction_procs, /decl/material/liquid/water, /decl/slime_colour/yellow/proc/try_water_reaction) + LAZYSET(reaction_procs, /decl/material/liquid/water, TYPE_PROC_REF(/decl/slime_colour/yellow, try_water_reaction)) /decl/slime_colour/yellow/handle_blood_reaction(var/datum/reagents/holder) var/location = get_turf(holder.get_reaction_loc()) diff --git a/mods/content/xenobiology/food.dm b/mods/content/xenobiology/food.dm index 27933822fb8..03240b71d78 100644 --- a/mods/content/xenobiology/food.dm +++ b/mods/content/xenobiology/food.dm @@ -65,7 +65,7 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ed1169" - center_of_mass = @"{'x':16,'y':11}" + center_of_mass = @'{"x":16,"y":11}' nutriment_amt = 3 bitesize = 5 donut_state = "jdonut" diff --git a/mods/content/xenobiology/mobs/critter_slime.dm b/mods/content/xenobiology/mobs/critter_slime.dm index 4210eed8fc8..16d870872f5 100644 --- a/mods/content/xenobiology/mobs/critter_slime.dm +++ b/mods/content/xenobiology/mobs/critter_slime.dm @@ -3,8 +3,7 @@ desc = "A lovable, domesticated slime." icon = 'mods/content/xenobiology/icons/slimes/slime_baby.dmi' speak_emote = list("chirps") - health = 100 - maxHealth = 100 + mob_default_max_health = 100 response_harm = "stamps on" emote_see = list("jiggles", "bounces in place") gene_damage = -1 @@ -25,7 +24,7 @@ SHOULD_CALL_PARENT(FALSE) icon = get_slime_icon() icon_state = (stat == DEAD ? "slime_dead" : "slime") - + /mob/living/simple_animal/slime/proc/get_slime_icon() var/decl/slime_colour/slime_data = GET_DECL(slime_type) return slime_data.baby_icon diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index d8bfbee4803..c335ffdc7ed 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -72,10 +72,10 @@ var/global/list/slime_pain_messages = list( var/protection = (1 - get_blocked_ratio(null, TOX, damage_flags = DAM_DISPERSED | DAM_BIO)) adjustCloneLoss((attacker.is_adult ? 10 : 5) * protection) adjustToxLoss(1 * protection) - if(health <= 0) + if(current_health <= 0) adjustToxLoss(1 * protection) if(prob(15) && client) handle_additional_slime_effects() . = 15 * protection - if(stat == DEAD || getCloneLoss() >= maxHealth) + if(stat == DEAD || getCloneLoss() >= get_max_health()) eaten_by_slime() diff --git a/mods/content/xenobiology/overrides.dm b/mods/content/xenobiology/overrides.dm index 671c77bbe7b..33659633bd3 100644 --- a/mods/content/xenobiology/overrides.dm +++ b/mods/content/xenobiology/overrides.dm @@ -38,3 +38,9 @@ /obj/item/gripper/cultivator/Initialize(ml, material_key) . = ..() can_hold |= /obj/item/slime_extract + +/mob/living/carbon/human/say_understands(var/mob/other,var/decl/language/speaking = null) + . = (!speaking && isslime(other)) || ..() + +/mob/living/brain/say_understands(var/mob/other,var/decl/language/speaking = null) + . = (!speaking && isslime(other)) || ..() diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index a0123babb3b..47c66c23309 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -1,3 +1,7 @@ +/decl/config/num/movement_slime + uid = "slime_delay" + desc = "Movement delay for slimes." + #define FEED_RESULT_INVALID -1 #define FEED_RESULT_DEAD 0 #define FEED_RESULT_VALID 1 @@ -8,8 +12,7 @@ icon_state = ICON_STATE_WORLD pass_flags = PASS_FLAG_TABLE speak_emote = list("chirps") - maxHealth = 150 - health = 150 + mob_default_max_health = 150 gender = NEUTER update_icon = 0 see_in_dark = 8 @@ -50,8 +53,10 @@ /mob/living/slime/get_digestion_product() return /decl/material/liquid/slimejelly -/mob/living/slime/adjustToxLoss(var/amount) - toxloss = clamp(toxloss + amount, 0, maxHealth) +/mob/living/slime/adjustToxLoss(var/amount, var/do_update_health = TRUE) + toxloss = clamp(toxloss + amount, 0, get_max_health()) + if(do_update_health) + update_health() /mob/living/slime/setToxLoss(var/amount) adjustToxLoss(amount-getToxLoss()) @@ -87,7 +92,7 @@ var/tally = ..() - var/health_deficiency = (maxHealth - health) + var/health_deficiency = (get_max_health() - current_health) if(health_deficiency >= 30) tally += (health_deficiency / 25) if (bodytemperature < 183.222) @@ -100,10 +105,10 @@ if(reagents.has_reagent(/decl/material/liquid/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow tally *= 5 - if(health <= 0) // if damaged, the slime moves twice as slow + if(current_health <= 0) // if damaged, the slime moves twice as slow tally *= 2 - return tally + config.slime_delay + return tally + get_config_value(/decl/config/num/movement_slime) /mob/living/slime/Bump(atom/movable/AM, yes) if ((!(yes) || now_pushing)) @@ -146,7 +151,7 @@ . = ..() statpanel("Status") - stat(null, "Health: [round((health / maxHealth) * 100)]%") + stat(null, "Health: [get_health_percent()]%") stat(null, "Intent: [a_intent]") if (client.statpanel == "Status") @@ -159,8 +164,8 @@ stat(null,"Power Level: [powerlevel]") -/mob/living/slime/adjustFireLoss(amount) - ..(-abs(amount)) // Heals them +/mob/living/slime/adjustFireLoss(amount, do_update_health = TRUE) + ..(-abs(amount), do_update_health) // Heals them /mob/living/slime/bullet_act(var/obj/item/projectile/Proj) var/datum/ai/slime/slime_ai = ai @@ -213,9 +218,9 @@ adjust_friendship(user, rand(2,3)) return TRUE - if(feeding_on) - var/prey = feeding_on - if(feeding_on == user) + var/prey = feeding_on?.resolve() + if(prey) + if(prey == user) if(prob(60)) visible_message(SPAN_DANGER("\The [user] fails to escape \the [src]!")) else @@ -223,12 +228,12 @@ set_feeding_on() else if(prob(30)) - visible_message(SPAN_DANGER("\The [user] attempts to wrestle \the [src] off \the [feeding_on]!")) + visible_message(SPAN_DANGER("\The [user] attempts to wrestle \the [src] off \the [prey]!")) else - visible_message(SPAN_DANGER("\The [user] manages to wrestle \the [src] off \the [feeding_on]!")) + visible_message(SPAN_DANGER("\The [user] manages to wrestle \the [src] off \the [prey]!")) set_feeding_on() - if(prey != feeding_on) + if(prey != feeding_on?.resolve()) playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) SET_STATUS_MAX(src, STAT_CONFUSE, 2) step_away(src, user) @@ -290,7 +295,7 @@ return FALSE /mob/living/slime/check_has_mouth() - return 0 + return FALSE /mob/living/slime/set_nutrition(amt) ..() @@ -335,6 +340,7 @@ /mob/living/slime/xenobio_scan_results() var/decl/slime_colour/slime_data = GET_DECL(slime_type) + . = list() . += "Slime scan result for \the [src]:" . += "[slime_data.name] [is_adult ? "adult" : "baby"] slime" . += "Nutrition:\t[nutrition]/[get_max_nutrition()]" @@ -343,7 +349,7 @@ else if (nutrition < get_hunger_nutrition()) . += "Warning:\tthe slime is hungry." . += "Electric charge strength:\t[powerlevel]" - . += "Health:\t[round((health * 100) / maxHealth)]%" + . += "Health:\t[get_health_percent()]%" var/list/mutations = slime_data.descendants?.Copy() if(!mutations.len) @@ -360,7 +366,7 @@ var/list/mutationTexts = list("[slime_data.name] ([100 - mutation_chance]%)") for(var/i in mutationChances) - mutationTexts += "[i] ([mutationChances[i]]%)" + mutationTexts += "[GET_DECL(i)] ([mutationChances[i]]%)" . += "Possible colours on splitting:\t[english_list(mutationTexts)]" diff --git a/mods/content/xenobiology/slime/feeding.dm b/mods/content/xenobiology/slime/feeding.dm index fd88d5c3caf..5fb8c6d1cdb 100644 --- a/mods/content/xenobiology/slime/feeding.dm +++ b/mods/content/xenobiology/slime/feeding.dm @@ -31,7 +31,7 @@ if(!silent) to_chat(src, SPAN_WARNING("\The [src] is dead.")) return FEED_RESULT_DEAD - if(M.getCloneLoss() >= M.maxHealth * 1.5) + if(M.getCloneLoss() >= M.get_max_health() * 1.5) if(!silent) to_chat(src, SPAN_WARNING("\The [M] is too degraded to feed upon.")) return FEED_RESULT_DEAD @@ -52,9 +52,9 @@ feeding_on = null if(victim) feeding_on = weakref(victim) - events_repository.register(/decl/observ/moved, src, src, /mob/living/slime/proc/check_feed_target_position) - events_repository.register(/decl/observ/moved, victim, src, /mob/living/slime/proc/check_feed_target_position) - events_repository.register(/decl/observ/destroyed, victim, src, /mob/living/slime/proc/check_feed_target_position) + events_repository.register(/decl/observ/moved, src, src, TYPE_PROC_REF(/mob/living/slime, check_feed_target_position)) + events_repository.register(/decl/observ/moved, victim, src, TYPE_PROC_REF(/mob/living/slime, check_feed_target_position)) + events_repository.register(/decl/observ/destroyed, victim, src, TYPE_PROC_REF(/mob/living/slime, check_feed_target_position)) var/datum/ai/slime/slime_ai = ai if(istype(slime_ai)) slime_ai.update_mood() @@ -102,8 +102,8 @@ gain_nutrition(drained) var/heal_amt = FLOOR(drained*0.5) if(heal_amt > 0) - adjustOxyLoss(-heal_amt) - adjustBruteLoss(-heal_amt) + adjustOxyLoss(-heal_amt, do_update_health = FALSE) + adjustBruteLoss(-heal_amt, do_update_health = FALSE) adjustCloneLoss(-heal_amt) if(ate_victim && feed_mob) diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index 67afacb3efb..872aaa57e99 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -8,7 +8,7 @@ throwforce = 0 throw_speed = 3 throw_range = 6 - origin_tech = "{'biotech':4}" + origin_tech = @'{"biotech":4}' atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/liquid/slimejelly var/slime_type = /decl/slime_colour/grey @@ -50,7 +50,7 @@ reagents.add_reagent(/decl/material/liquid/slimejelly, 30) /obj/item/slime_extract/on_reagent_change() - . = ..() + ..() if(reagents?.total_volume) var/decl/slime_colour/slime_data = GET_DECL(slime_type) slime_data.handle_reaction(reagents) @@ -67,7 +67,6 @@ name = "rune" icon = 'icons/obj/rune.dmi' icon_state = "golem" - unacidable = 1 layer = RUNE_LAYER /obj/effect/golemrune/Initialize() diff --git a/mods/content/xenobiology/slime/items_cell.dm b/mods/content/xenobiology/slime/items_cell.dm index f244b37d53a..417af572337 100644 --- a/mods/content/xenobiology/slime/items_cell.dm +++ b/mods/content/xenobiology/slime/items_cell.dm @@ -1,7 +1,7 @@ /obj/item/cell/slime name = "charged slime core" desc = "A yellow slime core that crackles with power." - origin_tech = "{'powerstorage':2,'biotech':4}" + origin_tech = @'{"powerstorage":2,"biotech":4}' icon = 'mods/content/xenobiology/icons/slimes/slime_extract_yellow.dmi' icon_state = ICON_STATE_WORLD maxcharge = 200 diff --git a/mods/content/xenobiology/slime/items_extract_enhancer.dm b/mods/content/xenobiology/slime/items_extract_enhancer.dm index 637d2d18fbe..1e3faf9d7d9 100644 --- a/mods/content/xenobiology/slime/items_extract_enhancer.dm +++ b/mods/content/xenobiology/slime/items_extract_enhancer.dm @@ -3,7 +3,7 @@ desc = "A potent chemical mix that will give a slime extract three uses." icon = 'icons/obj/items/chem/bottle.dmi' icon_state = "bottle17" - material = /decl/material/solid/plastic + material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW /obj/item/slime_extract_enhancer/afterattack(obj/target, mob/user , flag) diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index 623affe8304..86af051b3e8 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -1,55 +1,17 @@ -/mob/living/slime/Life() +/mob/living/slime/handle_environment(datum/gas_mixture/environment) . = ..() - if(. && stat != DEAD) - handle_turf_contents() - handle_local_conditions() - if(feeding_on) - slime_feed() - ingested.metabolize() - -/mob/living/slime/updatehealth() - . = ..() - if(stat != DEAD && health <= 0) - death() -/mob/living/slime/fluid_act(datum/reagents/fluids) - . = ..() - if(!QDELETED(src) && fluids?.total_volume >= FLUID_SHALLOW && stat == DEAD) - var/turf/T = get_turf(src) - if(T) - T.add_fluid(/decl/material/liquid/slimejelly, (is_adult ? rand(30, 40) : rand(10, 30))) - visible_message(SPAN_DANGER("\The [src] melts away...")) // Slimes are water soluble. - qdel(src) - -/mob/living/slime/proc/handle_local_conditions() - var/datum/gas_mixture/environment = loc?.return_air() - adjust_body_temperature(bodytemperature, (environment?.temperature || T0C), 1) + if(environment) + var/delta = abs(bodytemperature - environment.temperature) + var/change = (delta / (delta > 50 ? 5 : 10)) + if(bodytemperature > environment.temperature) + change = -(change) + bodytemperature += (min(environment.temperature, bodytemperature + change) - bodytemperature) if(bodytemperature <= die_temperature) adjustToxLoss(200) - death() else if(bodytemperature <= hurt_temperature) adjustToxLoss(30) - updatehealth() -/mob/living/slime/proc/adjust_body_temperature(current, loc_temp, boost) - var/delta = abs(current-loc_temp) - var/change = (delta / (delta > 50 ? 5 : 10)) * boost - if(current > loc_temp) - change = -(change) - bodytemperature += (min(loc_temp, current + change) - current) - -/mob/living/slime/handle_regular_status_updates() - . = ..() - if(stat != DEAD) - set_stat(CONSCIOUS) - if(prob(30)) - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - -/mob/living/slime/proc/handle_turf_contents() // If we're standing on top of a dead mob or small items, we can // ingest it (or just melt it a little if we're too small) // Also helps to keep our cell tidy! @@ -80,13 +42,51 @@ if(length(contents) != last_contents_length) queue_icon_update() +/mob/living/slime/handle_nutrition_and_hydration() + . = ..() + if(feeding_on) + slime_feed() + ingested.metabolize() + +/mob/living/slime/fluid_act(datum/reagents/fluids) + . = ..() + if(!QDELETED(src) && fluids?.total_volume >= FLUID_SHALLOW && stat == DEAD) + var/turf/T = get_turf(src) + if(T) + T.add_fluid(/decl/material/liquid/slimejelly, (is_adult ? rand(30, 40) : rand(10, 30))) + visible_message(SPAN_DANGER("\The [src] melts away...")) // Slimes are water soluble. + qdel(src) + /mob/living/slime/get_hunger_factor() return (0.1 + 0.05 * is_adult) /mob/living/slime/get_thirst_factor() return 0 +/mob/living/slime/fluid_act(datum/reagents/fluids) + . = ..() + if(stat == DEAD) + var/obj/effect/fluid/F = locate() in loc + if(F && F.reagents?.total_volume >= FLUID_SHALLOW) + F.reagents.add_reagent(/decl/material/liquid/slimejelly, (is_adult ? rand(30, 40) : rand(10, 30))) + visible_message(SPAN_DANGER("\The [src] melts away...")) // Slimes are water soluble. + qdel(src) + +/mob/living/slime/handle_living_non_stasis_processes() + . = ..() + set_stat(CONSCIOUS) + if(prob(30)) + adjustOxyLoss(-1, do_update_health = FALSE) + adjustToxLoss(-1, do_update_health = FALSE) + adjustFireLoss(-1, do_update_health = FALSE) + adjustCloneLoss(-1, do_update_health = FALSE) + adjustBruteLoss(-1) + /mob/living/slime/handle_nutrition_and_hydration() + . = ..() + if(feeding_on) + slime_feed() + ingested.metabolize() // Digest whatever we've got floating around in our goop. if(length(contents)) @@ -133,6 +133,9 @@ ..() +/mob/living/slime/get_satiated_nutrition() // Can't go above it + . = is_adult ? 1150 : 950 + /mob/living/slime/get_max_nutrition() // Can't go above it . = is_adult ? 1200 : 1000 diff --git a/mods/content/xenobiology/slime/powers.dm b/mods/content/xenobiology/slime/powers.dm index cac27ead4e2..a90c4b879f9 100644 --- a/mods/content/xenobiology/slime/powers.dm +++ b/mods/content/xenobiology/slime/powers.dm @@ -16,7 +16,7 @@ return is_adult = TRUE - maxHealth = 200 + mob_default_max_health = 200 amount_grown = 0 update_name() update_icon() diff --git a/mods/content/xenobiology/slime/slime_click.dm b/mods/content/xenobiology/slime/slime_click.dm index 052da49f80c..7107a79d7d1 100644 --- a/mods/content/xenobiology/slime/slime_click.dm +++ b/mods/content/xenobiology/slime/slime_click.dm @@ -4,25 +4,25 @@ /mob/living/slime/UnarmedAttack(var/atom/A, var/proximity) . = ..() - if(!.) + if(.) return // Eating if(feeding_on || (locate(/mob) in contents)) - return + return FALSE //should have already been set if we are attacking a mob, but it doesn't hurt and will cover attacking non-mobs too setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/mob/living/M = A if(!istype(M)) A.attack_generic(src, (is_adult ? rand(20,40) : rand(5,25)), "glomped") // Basic attack. - return + return TRUE if(a_intent == I_HELP) M.visible_message( \ SPAN_NOTICE("\The [src] gently pokes \the [M]."), \ SPAN_NOTICE("\The [src] gently pokes you.")) - return + return TRUE var/power = max(0, min(10, (powerlevel + rand(0, 3)))) if(a_intent == I_DISARM) @@ -44,10 +44,10 @@ SPAN_DANGER("\The [src] pounces at you!")) if(prob(40)) SET_STATUS_MAX(src, STAT_WEAK, (power * 0.5)) - return + return TRUE if(a_intent == I_GRAB && slime_attach(M)) - return + return TRUE if(a_intent == I_HURT) if(prob(15) && !M.lying) @@ -57,3 +57,5 @@ SET_STATUS_MAX(M, STAT_WEAK, (power * 0.5)) else A.attack_generic(src, (is_adult ? rand(20,40) : rand(5,25)), "glomped") + return TRUE + return FALSE diff --git a/mods/content/xenobiology/slime/slime_hud.dm b/mods/content/xenobiology/slime/slime_hud.dm index f81edf4e3fd..5bc0d0917f0 100644 --- a/mods/content/xenobiology/slime/slime_hud.dm +++ b/mods/content/xenobiology/slime/slime_hud.dm @@ -1,11 +1,5 @@ /datum/hud/slime/FinalizeInstantiation() - src.adding = list() + action_intent = new /obj/screen/intent(null, mymob) + src.adding = list(action_intent) - var/obj/screen/using - - using = new /obj/screen/intent() - src.adding += using - action_intent = using - - mymob.client.screen = list() - mymob.client.screen += src.adding + ..() diff --git a/mods/content/xenobiology/slime/slime_surgery.dm b/mods/content/xenobiology/slime/slime_surgery.dm index 77e5735ae64..b63388aaf91 100644 --- a/mods/content/xenobiology/slime/slime_surgery.dm +++ b/mods/content/xenobiology/slime/slime_surgery.dm @@ -41,15 +41,18 @@ /decl/surgery_step/slime/cut_flesh/begin_step(mob/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \ "You start cutting through [target]'s flesh with \the [tool].") + ..() /decl/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message("[user] cuts through [target]'s flesh with \the [tool].", \ "You cut through [target]'s flesh with \the [tool], revealing its silky innards.") target.core_removal_stage = 1 + ..() /decl/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ "Your hand slips, tearing [target]'s flesh with \the [tool]!") + ..() ////////////////////////////////////////////////////////////////// // slime innards cutting surgery step @@ -67,15 +70,18 @@ /decl/surgery_step/slime/cut_innards/begin_step(mob/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \ "You start cutting [target]'s silky innards apart with \the [tool].") + ..() /decl/surgery_step/slime/cut_innards/end_step(mob/living/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message("[user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \ "You cut [target]'s innards apart with \the [tool], exposing the cores.") target.core_removal_stage = 2 + ..() /decl/surgery_step/slime/cut_innards/fail_step(mob/living/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips, tearing [target]'s innards with \the [tool]!", \ "Your hand slips, tearing [target]'s innards with \the [tool]!") + ..() ////////////////////////////////////////////////////////////////// // slime core removal surgery step @@ -97,6 +103,7 @@ user.visible_message( SPAN_NOTICE("\The [user] starts cutting out one of \the [target]'s cores with \the [tool]."), \ SPAN_NOTICE("You start cutting out one of \the [target]'s cores with \the [tool].")) + ..() /decl/surgery_step/slime/saw_core/end_step(mob/living/user, mob/living/slime/target, target_zone, obj/item/tool) if(target.cores <= 0) @@ -108,8 +115,10 @@ SPAN_NOTICE("\The [user] cuts \the [core] out of \the [target] with \the [tool]."), \ SPAN_NOTICE("You cut \the [core] out of \the [target] with \the [tool]. It looks like there are [target.cores] core\s left.")) target.update_icon() + ..() /decl/surgery_step/slime/saw_core/fail_step(mob/living/user, mob/living/slime/target, target_zone, obj/item/tool) user.visible_message( SPAN_DANGER("\The [user]'s hand slips, failing to extract the slime core."), \ SPAN_DANGER("Your hand slips, causing you to miss the core!")) + ..() diff --git a/mods/content/xenobiology/slime/slime_update_icon.dm b/mods/content/xenobiology/slime/slime_update_icon.dm index 485f834b3b0..4e99fe88ceb 100644 --- a/mods/content/xenobiology/slime/slime_update_icon.dm +++ b/mods/content/xenobiology/slime/slime_update_icon.dm @@ -5,13 +5,9 @@ icon_state = initial(icon_state) if(stat == DEAD) icon_state = "[icon_state]-[cores ? "dead" : "nocore"]" - layer = initial(layer) else if(feeding_on) - var/mob/feed_mob = feeding_on.resolve() icon_state = "[icon_state]-eat" - layer = feed_mob.layer + 0.5 - else - layer = initial(layer) + reset_layer() ..() @@ -28,3 +24,10 @@ //MA.add_filter("slime_mask", 1, list("alpha", render_source="slime_\ref[src]", flags=MASK_INVERSE)) LAZYADD(new_underlays, MA) underlays = new_underlays + +/mob/living/slime/get_base_layer() + if(stat != DEAD && feeding_on) + var/atom/feed_mob = feeding_on.resolve() + if(istype(feed_mob)) + return max(ABOVE_HUMAN_LAYER, feed_mob.layer + 0.5) + return ..() diff --git a/mods/mobs/borers/datum/antagonist.dm b/mods/mobs/borers/datum/antagonist.dm index 2d2c31a1645..b8b0c7feb4d 100644 --- a/mods/mobs/borers/datum/antagonist.dm +++ b/mods/mobs/borers/datum/antagonist.dm @@ -61,4 +61,4 @@ spawn_announcement_sound = global.using_map.lifesign_spawn_sound /decl/special_role/borer/attempt_random_spawn() - if(config.aliens_allowed) ..() + if(get_config_value(/decl/config/toggle/aliens_allowed)) ..() diff --git a/mods/mobs/borers/datum/symbiote.dm b/mods/mobs/borers/datum/symbiote.dm index a0bc735a5e8..94b885087d1 100644 --- a/mods/mobs/borers/datum/symbiote.dm +++ b/mods/mobs/borers/datum/symbiote.dm @@ -29,7 +29,7 @@ var/global/list/symbiote_starting_points = list() /decl/hierarchy/outfit/job/symbiote_host name = "Job - Symbiote Host" -/datum/job/symbiote/post_equip_rank(var/mob/person, var/alt_title) +/datum/job/symbiote/post_equip_job_title(var/mob/person, var/alt_title) var/mob/living/simple_animal/borer/symbiote = person symbiote.SetName(symbiote.truename) @@ -87,7 +87,7 @@ var/global/list/symbiote_starting_points = list() if(length(global.symbiote_starting_points)) symbiote.forceMove(pick(global.symbiote_starting_points)) else - symbiote.forceMove(pick(global.latejoin_locations)) + symbiote.forceMove(get_random_spawn_turf(SPAWN_FLAG_JOBS_CAN_SPAWN)) if(H.mind) H.mind.transfer_to(symbiote) @@ -118,7 +118,7 @@ var/global/list/symbiote_starting_points = list() return /datum/job/symbiote/is_position_available() - . = ..() && length(find_valid_hosts(TRUE)) + . = ..() && length(find_valid_hosts(TRUE)) /obj/abstract/landmark/symbiote_start name = "Symbiote Start" diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 09b1cb38b0d..64dcbde158d 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -48,7 +48,7 @@ var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. /obj/item/holder/borer - origin_tech = "{'biotech':6}" + origin_tech = @'{"biotech":6}' /mob/living/simple_animal/borer/roundstart roundstart = TRUE @@ -81,24 +81,24 @@ /mob/living/simple_animal/borer/proc/set_borer_name() truename = "[borer_names[min(generation, borer_names.len)]] [random_id("borer[generation]", 1000, 9999)]" -/mob/living/simple_animal/borer/Life() +/mob/living/simple_animal/borer/handle_vision() + . = ..() + set_status(STAT_BLIND, host ? GET_STATUS(host, STAT_BLIND) : 0) + set_status(STAT_BLURRY, host ? GET_STATUS(host, STAT_BLURRY) : 0) +/mob/living/simple_animal/borer/handle_disabilities() + . = ..() sdisabilities = 0 if(host) - set_status(STAT_BLIND, GET_STATUS(host, STAT_BLIND)) - set_status(STAT_BLURRY, GET_STATUS(host, STAT_BLURRY)) if(host.sdisabilities & BLINDED) sdisabilities |= BLINDED if(host.sdisabilities & DEAFENED) sdisabilities |= DEAFENED - else - set_status(STAT_BLIND, 0) - set_status(STAT_BLURRY, 0) +/mob/living/simple_animal/borer/handle_living_non_stasis_processes() . = ..() - if(!.) - return FALSE - + if(!. || !host || host.stat) + return if(host) if(!stat && !host.stat) @@ -117,27 +117,21 @@ else to_chat(src, SPAN_NOTICE("You shake off your lethargy as the sugar leaves your host's blood.")) docile = 0 - if(chemicals < 250 && host.nutrition >= (neutered ? 200 : 50)) host.nutrition-- chemicals++ - if(controlling) - if(neutered) host.release_control() return - if(docile) to_chat(host, SPAN_NOTICE("You are feeling far too docile to continue controlling your host...")) host.release_control() return - if(prob(5)) host.adjustBrainLoss(0.1) - - if(prob(host.getBrainLoss()/20)) - INVOKE_ASYNC(host, /mob/proc/say, "*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") + if(prob(host.getBrainLoss()/20)) + INVOKE_ASYNC(host, TYPE_PROC_REF(/mob, say), "*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") /mob/living/simple_animal/borer/Stat() . = ..() @@ -209,7 +203,7 @@ if(istype(borer_hud)) for(var/obj/thing in borer_hud.borer_hud_elements) thing.color = COLOR_BORER_RED - addtimer(CALLBACK(src, /mob/living/simple_animal/borer/proc/reset_ui_callback), amt) + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/simple_animal/borer, reset_ui_callback)), amt) #undef COLOR_BORER_RED /mob/living/simple_animal/borer/proc/leave_host() @@ -217,8 +211,8 @@ var/datum/hud/borer/borer_hud = hud_used if(istype(borer_hud)) for(var/obj/thing in borer_hud.borer_hud_elements) - thing.alpha = 0 - thing.invisibility = INVISIBILITY_MAXIMUM + thing.alpha = 0 + thing.set_invisibility(INVISIBILITY_ABSTRACT) if(!host) return diff --git a/mods/mobs/borers/mob/borer/borer_attacks.dm b/mods/mobs/borers/mob/borer/borer_attacks.dm index 90061a001e2..138b2f34958 100644 --- a/mods/mobs/borers/mob/borer/borer_attacks.dm +++ b/mods/mobs/borers/mob/borer/borer_attacks.dm @@ -1,40 +1,44 @@ /mob/living/simple_animal/borer/UnarmedAttack(atom/A, proximity) + . = ..() + if(.) + return + if(!isliving(A) || a_intent != I_GRAB) - return ..() + return FALSE if(host || !can_use_borer_ability(requires_host_value = FALSE, check_last_special = FALSE)) - return + return FALSE var/mob/living/M = A if(M.has_brain_worms()) to_chat(src, SPAN_WARNING("You cannot take a host who already has a passenger!")) - return + return TRUE //TODO generalize borers to enter any mob. Until then, return early. if(!ishuman(M)) to_chat(src, SPAN_WARNING("This creature is not sufficiently intelligent to host you.")) - return + return TRUE // end TODO var/mob/living/carbon/human/H = M var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, BP_HEAD) if(!E) to_chat(src, SPAN_WARNING("\The [H] does not have a head!")) - return + return TRUE if(!H.should_have_organ(BP_BRAIN)) to_chat(src, SPAN_WARNING("\The [H] does not seem to have a brain cavity to enter.")) - return + return TRUE if(H.check_head_coverage()) to_chat(src, SPAN_WARNING("You cannot get through that host's protective gear.")) - return + return TRUE to_chat(M, SPAN_WARNING("Something slimy begins probing at the opening of your ear canal...")) to_chat(src, SPAN_NOTICE("You slither up [M] and begin probing at their ear canal...")) set_ability_cooldown(5 SECONDS) if(!do_after(src, 3 SECONDS, M)) - return + return TRUE to_chat(src, SPAN_NOTICE("You wiggle into \the [M]'s ear.")) if(M.stat == CONSCIOUS) @@ -48,7 +52,7 @@ if(istype(borer_hud)) for(var/obj/thing in borer_hud.borer_hud_elements) thing.alpha = 255 - thing.invisibility = 0 + thing.set_invisibility(INVISIBILITY_NONE) //Update their traitor status. if(host.mind && !neutered) @@ -61,3 +65,4 @@ replace_brain() else if(E) // If they're in normally, implant removal can get them out. LAZYDISTINCTADD(E.implants, src) + return TRUE diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index 8bf393d507a..301d96256e0 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -14,10 +14,10 @@ . = ..() /datum/hud/borer/FinalizeInstantiation() - hud_intent_selector = new - adding = list(hud_intent_selector) - hud_inject_chemicals = new - hud_leave_host = new + hud_intent_selector = new(null, mymob) + adding += hud_intent_selector + hud_inject_chemicals = new(null, mymob) + hud_leave_host = new(null, mymob) borer_hud_elements = list( hud_inject_chemicals, hud_leave_host @@ -25,7 +25,7 @@ if(isborer(mymob)) var/mob/living/simple_animal/borer/borer = mymob if(!borer.neutered) - hud_toggle_control = new + hud_toggle_control = new(null, mymob) borer_hud_elements += hud_toggle_control adding += borer_hud_elements if(mymob) @@ -33,9 +33,8 @@ if(istype(borer) && borer.host) for(var/obj/thing in borer_hud_elements) thing.alpha = 255 - thing.invisibility = 0 - if(mymob.client) - mymob.client.screen |= adding + thing.set_invisibility(INVISIBILITY_NONE) + ..() /mob/living/simple_animal/borer hud_type = /datum/hud/borer @@ -52,10 +51,8 @@ alpha = 0 invisibility = INVISIBILITY_MAXIMUM -/obj/screen/borer/Click(location, control, params) - if(!isborer(usr)) - return FALSE - if(usr.stat == DEAD) +/obj/screen/borer/handle_click(mob/user, params) + if(!isborer(user)) return FALSE var/mob/living/simple_animal/borer/worm = usr if(!worm.host) @@ -67,12 +64,12 @@ icon_state = "seize_control" screen_loc = "LEFT+3,TOP-1" -/obj/screen/borer/toggle_host_control/Click(location, control, params) +/obj/screen/borer/toggle_host_control/handle_click(mob/user, params) . = ..() if(!.) return FALSE - var/mob/living/simple_animal/borer/worm = usr + var/mob/living/simple_animal/borer/worm = user if(!worm.can_use_borer_ability()) return @@ -124,12 +121,12 @@ icon_state = "inject_chemicals" screen_loc = "LEFT+2,TOP-1" -/obj/screen/borer/inject_chemicals/Click(location, control, params) +/obj/screen/borer/inject_chemicals/handle_click(mob/user, params) . = ..() if(!.) return FALSE - var/mob/living/simple_animal/borer/worm = usr + var/mob/living/simple_animal/borer/worm = user if(!worm.can_use_borer_ability()) return @@ -151,12 +148,12 @@ icon_state = "leave_host" screen_loc = "LEFT+1,TOP-1" -/obj/screen/borer/leave_host/Click(location, control, params) +/obj/screen/borer/leave_host/handle_click(mob/user, params) . = ..() if(!.) return FALSE - var/mob/living/simple_animal/borer/worm = usr + var/mob/living/simple_animal/borer/worm = user if(!worm.can_use_borer_ability()) return diff --git a/mods/mobs/dionaea/_dionaea.dme b/mods/mobs/dionaea/_dionaea.dme index 41aa2a72fb7..a43670132b3 100644 --- a/mods/mobs/dionaea/_dionaea.dme +++ b/mods/mobs/dionaea/_dionaea.dme @@ -20,7 +20,6 @@ #include "mob\nymph_emotes.dm" #include "mob\nymph_gestalting.dm" #include "mob\nymph_holder.dm" -#include "mob\nymph_inventory.dm" #include "mob\nymph_life.dm" #include "mob\nymph_ui.dm" #include "mob\nymph_update_icons.dm" diff --git a/mods/mobs/dionaea/datums/seed.dm b/mods/mobs/dionaea/datums/seed.dm index 5244715c2e5..4d0937897ac 100644 --- a/mods/mobs/dionaea/datums/seed.dm +++ b/mods/mobs/dionaea/datums/seed.dm @@ -25,3 +25,7 @@ /decl/hierarchy/supply_pack/hydroponics/exoticseeds/Initialize() contains[/obj/item/seeds/diona] = 2 . = ..() + +/obj/structure/closet/crate/hydroponics/exotic/WillContain() + . = ..() + .[/obj/item/seeds/diona] = 2 \ No newline at end of file diff --git a/mods/mobs/dionaea/icons/lunchbox_nymph.dmi b/mods/mobs/dionaea/icons/lunchbox_nymph.dmi new file mode 100644 index 00000000000..500f939b9eb Binary files /dev/null and b/mods/mobs/dionaea/icons/lunchbox_nymph.dmi differ diff --git a/mods/mobs/dionaea/icons/ui.dmi b/mods/mobs/dionaea/icons/ui.dmi index 55b53bed9f0..f4cd523bc52 100644 Binary files a/mods/mobs/dionaea/icons/ui.dmi and b/mods/mobs/dionaea/icons/ui.dmi differ diff --git a/mods/mobs/dionaea/items/lunchbox.dm b/mods/mobs/dionaea/items/lunchbox.dm index b1e906a69c3..7be30a9b699 100644 --- a/mods/mobs/dionaea/items/lunchbox.dm +++ b/mods/mobs/dionaea/items/lunchbox.dm @@ -1,7 +1,6 @@ /obj/item/storage/lunchbox/nymph name = "\improper Diona nymph lunchbox" - icon_state = "lunchbox_dionanymph" - item_state = "toolbox_yellow" + icon = 'mods/mobs/dionaea/icons/lunchbox_nymph.dmi' desc = "A little lunchbox. This one is an adorable Diona nymph on the side!" /obj/item/storage/lunchbox/nymph/filled diff --git a/mods/mobs/dionaea/items/roast.dm b/mods/mobs/dionaea/items/roast.dm index 3df2242a39a..793bfe223bb 100644 --- a/mods/mobs/dionaea/items/roast.dm +++ b/mods/mobs/dionaea/items/roast.dm @@ -4,7 +4,7 @@ icon_state = "dionaroast" trash = /obj/item/trash/plate filling_color = "#75754b" - center_of_mass = @"{'x':16,'y':7}" + center_of_mass = @'{"x":16,"y":7}' nutriment_desc = list("a chorus of flavor" = 6) nutriment_amt = 6 bitesize = 2 diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 63fede80c71..714fe5d7def 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -3,21 +3,13 @@ #define DIONA_SCREEN_LOC_INTENT "RIGHT-2,BOTTOM:5" #define DIONA_SCREEN_LOC_HEALTH ui_alien_health -/datum/extension/hattable/diona_nymph/wear_hat(mob/wearer, obj/item/clothing/head/new_hat) - var/mob/living/carbon/alien/diona/doona = wearer - if(istype(doona) && (!doona.holding_item || doona.holding_item != new_hat)) - . = ..() - if(.) - hat?.screen_loc = DIONA_SCREEN_LOC_HAT - /mob/living/carbon/alien/diona name = "diona nymph" desc = "It's a little skittery critter. Chirp." icon = 'mods/mobs/dionaea/icons/nymph.dmi' icon_state = ICON_STATE_WORLD death_msg = "expires with a pitiful chirrup..." - health = 60 - maxHealth = 60 + mob_default_max_health = 60 available_maneuvers = list(/decl/maneuver/leap) status_flags = NO_ANTAG @@ -34,31 +26,19 @@ holder_type = /obj/item/holder/diona possession_candidate = 1 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE hud_type = /datum/hud/diona_nymph ai = /datum/ai/nymph z_flags = ZMM_MANGLE_PLANES - var/obj/item/holding_item var/tmp/flower_color var/tmp/last_glow /mob/living/carbon/alien/diona/get_jump_distance() return 3 -/mob/living/carbon/alien/diona/Login() - . = ..() - if(client) - if(holding_item) - holding_item.screen_loc = DIONA_SCREEN_LOC_HELD - client.screen |= holding_item - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable?.hat) - hattable.hat.screen_loc = DIONA_SCREEN_LOC_HAT - client.screen |= hattable.hat - /mob/living/carbon/alien/diona/sterile name = "sterile nymph" @@ -70,21 +50,32 @@ set_extension(src, /datum/extension/base_icon_state, icon_state) add_language(/decl/language/diona) add_language(/decl/language/human/common, 0) - set_extension(src, /datum/extension/hattable/diona_nymph, list(0, -8)) - + add_inventory_slot(new /datum/inventory_slot/head/simple) + add_held_item_slot(new /datum/inventory_slot/gripper/mouth/nymph) if(prob(flower_chance)) flower_color = get_random_colour(1) update_icon() . = ..(mapload) -/mob/living/carbon/alien/diona/show_examined_worn_held_items(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/carbon/alien/diona/get_dexterity(var/silent) + return (DEXTERITY_EQUIP_ITEM|DEXTERITY_HOLD_ITEM) + +/mob/living/carbon/alien/diona/get_bodytype() + return GET_DECL(/decl/bodytype/diona) + +/decl/bodytype/diona + name = "nymph" + bodytype_flag = 0 + bodytype_category = "diona nymph body" + +/decl/bodytype/diona/Initialize() + equip_adjust = list( + slot_head_str = list( + "[NORTH]" = list(0, -8), + "[SOUTH]" = list(0, -8), + "[EAST]" = list(0, -8), + "[WEST]" = list(0, -8) + ) + ) . = ..() - if(holding_item) - to_chat(user, SPAN_NOTICE("It is holding [html_icon(holding_item)] \a [holding_item].")) - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable?.hat) - to_chat(user, SPAN_NOTICE("It is wearing [html_icon(hattable.hat)] \a [hattable.hat].")) - -/mob/living/carbon/alien/diona/get_dexterity(var/silent = FALSE) - return DEXTERITY_NONE diff --git a/mods/mobs/dionaea/mob/gestalt/gestalt_attacks.dm b/mods/mobs/dionaea/mob/gestalt/gestalt_attacks.dm index 7fc8cf70600..edf94c76307 100644 --- a/mods/mobs/dionaea/mob/gestalt/gestalt_attacks.dm +++ b/mods/mobs/dionaea/mob/gestalt/gestalt_attacks.dm @@ -1,6 +1,6 @@ /obj/structure/diona_gestalt/attackby(var/obj/item/thing, var/mob/user) . = ..() - if(thing.force) + if(thing.force) shed_atom(forcefully = TRUE) /obj/structure/diona_gestalt/hitby() @@ -20,4 +20,4 @@ shed_atom(forcefully = TRUE) /obj/structure/diona_gestalt/proc/handle_member_click(var/mob/living/carbon/alien/diona/clicker) - return + return FALSE diff --git a/mods/mobs/dionaea/mob/nymph_attacks.dm b/mods/mobs/dionaea/mob/nymph_attacks.dm index 35b301bda6e..ec4cbbfdcc6 100644 --- a/mods/mobs/dionaea/mob/nymph_attacks.dm +++ b/mods/mobs/dionaea/mob/nymph_attacks.dm @@ -1,7 +1,9 @@ /mob/living/carbon/alien/diona/UnarmedAttack(var/atom/A) - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(incapacitated()) + return ..() + setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(istype(loc, /obj/structure/diona_gestalt)) var/obj/structure/diona_gestalt/gestalt = loc return gestalt.handle_member_click(src, A) @@ -28,64 +30,47 @@ qdel(pile) S.forceMove(get_turf(G)) G.visible_message(SPAN_NOTICE("\A [S] falls out!")) - return + return TRUE // End superhacky stuff. - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - if(hattable?.wear_hat(src, A)) - return - - if((a_intent == I_DISARM || a_intent == I_HELP) && can_collect(A)) - collect(A) - return - if(ismob(A)) if(src != A && !gestalt_with(A)) visible_message(SPAN_NOTICE("\The [src] butts its head into \the [A].")) - return - - . = ..() - -/mob/living/carbon/alien/diona/RangedAttack(atom/A, var/params) - if((a_intent == I_HURT || a_intent == I_GRAB) && holding_item) - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message(SPAN_DANGER("\The [src] spits \a [holding_item] at \the [A]!")) - var/atom/movable/temp = holding_item - try_unequip(holding_item) - if(temp) - temp.throw_at(A, 10, rand(3,5), src) return TRUE - . = ..() + return ..() /mob/living/carbon/alien/diona/proc/handle_tray_interaction(var/obj/machinery/portable_atmospherics/hydroponics/tray) if(incapacitated()) - return + return FALSE - if(!tray.seed && istype(holding_item, /obj/item/seeds)) - var/atom/movable/temp = holding_item - try_unequip(temp) - if(temp) - tray.plant_seed(src, temp) - return + if(!tray.seed) + var/obj/item/seeds/seeds = get_active_hand() + if(istype(seeds)) + if(try_unequip(seeds)) + tray.plant_seed(src, seeds) + return TRUE + return FALSE if(tray.dead) if(tray.remove_dead(src, silent = TRUE)) reagents.add_reagent(/decl/material/liquid/nutriment/glucose, rand(10,20)) visible_message(SPAN_NOTICE("\The [src] chews up the dead plant, clearing \the [tray] out."), SPAN_NOTICE("You devour the dead plant, clearing \the [tray].")) - return + return TRUE + return FALSE if(tray.harvest) if(tray.harvest(src)) visible_message(SPAN_NOTICE("\The [src] harvests from \the [tray]."), SPAN_NOTICE("You harvest the contents of \the [tray].")) - return + return TRUE + return FALSE if(tray.weedlevel || tray.pestlevel) reagents.add_reagent(/decl/material/liquid/nutriment/glucose, (tray.weedlevel + tray.pestlevel)) tray.weedlevel = 0 tray.pestlevel = 0 visible_message(SPAN_NOTICE("\The [src] begins rooting through \the [tray], ripping out pests and weeds, and eating them noisily."),SPAN_NOTICE("You begin rooting through \the [tray], ripping out pests and weeds, and eating them noisily.")) - return + return TRUE if(tray.nutrilevel < 10) var/nutrition_cost = (10-tray.nutrilevel) * 5 @@ -95,7 +80,7 @@ adjust_nutrition(-((10-tray.nutrilevel) * 5)) else to_chat(src, SPAN_NOTICE("You haven't eaten enough to refill \the [tray]'s nutrients.")) - return + return TRUE if(tray.waterlevel < 100) var/nutrition_cost = FLOOR((100-tray.nutrilevel)/10) * 5 @@ -104,6 +89,7 @@ tray.waterlevel = 100 else to_chat(src, SPAN_NOTICE("You haven't eaten enough to refill \the [tray]'s water.")) - return + return TRUE visible_message(SPAN_NOTICE("\The [src] rolls around in \the [tray] for a bit."),SPAN_NOTICE("You roll around in \the [tray] for a bit.")) + return TRUE diff --git a/mods/mobs/dionaea/mob/nymph_death.dm b/mods/mobs/dionaea/mob/nymph_death.dm index b2c6c519217..b1bdc4ec30f 100644 --- a/mods/mobs/dionaea/mob/nymph_death.dm +++ b/mods/mobs/dionaea/mob/nymph_death.dm @@ -2,6 +2,4 @@ var/obj/structure/diona_gestalt/gestalt = loc if(istype(gestalt)) gestalt.shed_atom(src, TRUE, FALSE) - if(holding_item) - try_unequip(holding_item) return ..(gibbed,death_msg) diff --git a/mods/mobs/dionaea/mob/nymph_holder.dm b/mods/mobs/dionaea/mob/nymph_holder.dm index 0ac27fa04c0..1a06eb0d14b 100644 --- a/mods/mobs/dionaea/mob/nymph_holder.dm +++ b/mods/mobs/dionaea/mob/nymph_holder.dm @@ -1,5 +1,5 @@ /obj/item/holder/diona - origin_tech = "{'magnets':3,'biotech':5}" + origin_tech = @'{"magnets":3,"biotech":5}' slot_flags = SLOT_HEAD | SLOT_OVER_BODY | SLOT_HOLSTER armor = list( ARMOR_BIO = ARMOR_BIO_RESISTANT, diff --git a/mods/mobs/dionaea/mob/nymph_inventory.dm b/mods/mobs/dionaea/mob/nymph_inventory.dm deleted file mode 100644 index 9f443cc8aff..00000000000 --- a/mods/mobs/dionaea/mob/nymph_inventory.dm +++ /dev/null @@ -1,63 +0,0 @@ -/mob/living/carbon/alien/diona/drop_from_inventory(var/obj/item/dropping_item) - . = ..() - if(dropping_item == holding_item) - holding_item = null - -/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. Use mouth. - if(can_collect(W)) - collect(W) - return TRUE - W.forceMove(get_turf(src)) - return TRUE - -/mob/living/carbon/alien/diona/proc/can_collect(var/obj/item/collecting) - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - return (!holding_item && \ - istype(collecting) && \ - collecting != hattable?.hat && \ - collecting.loc != src && \ - !collecting.anchored && \ - collecting.simulated && \ - collecting.w_class <= can_pull_size \ - ) - -/mob/living/carbon/alien/diona/proc/collect(var/obj/item/collecting) - collecting.forceMove(src) - holding_item = collecting - visible_message(SPAN_NOTICE("\The [src] engulfs \the [holding_item].")) - - // This means dionaea can hoover up beakers as a kind of impromptu chem disposal - // technique, so long as they're okay with the reagents reacting inside them. - if(holding_item.reagents && holding_item.reagents.total_volume) - holding_item.reagents.trans_to_mob(src, holding_item.reagents.total_volume, CHEM_INGEST) - - // It also means they can do the old school cartoon schtick of eating an entire sandwich - // and spitting up an empty plate. Ptooie. - if(istype(holding_item, /obj/item/chems/food)) - var/obj/item/chems/food/food = holding_item - holding_item = null - if(food.trash) - holding_item = new food.trash(src) - qdel(food) - - if(!QDELETED(holding_item)) - holding_item.equipped(src) - holding_item.screen_loc = DIONA_SCREEN_LOC_HELD - -/mob/living/carbon/alien/diona/verb/drop_item_verb() - set name = "Drop Held Item" - set desc = "Drop the item you are currently holding inside." - set category = "IC" - set src = usr - drop_item() - -/mob/living/carbon/alien/diona/drop_item() - var/item = holding_item - if(item && try_unequip(item)) - visible_message(SPAN_NOTICE("\The [src] regurgitates \the [item].")) - return TRUE - . = ..() - -// Makes it so that the held item's screen_loc isn't unset. -/mob/living/carbon/alien/diona/item_should_have_screen_presence(obj/item/item, slot) - return (item == holding_item) || ..() \ No newline at end of file diff --git a/mods/mobs/dionaea/mob/nymph_life.dm b/mods/mobs/dionaea/mob/nymph_life.dm index d39dbadbd3b..4a13f9e580c 100644 --- a/mods/mobs/dionaea/mob/nymph_life.dm +++ b/mods/mobs/dionaea/mob/nymph_life.dm @@ -3,7 +3,7 @@ ..() - if(health <= 0 || stat == DEAD) + if(stat == DEAD) return var/turf/checking = get_turf(src) @@ -25,11 +25,18 @@ set_nutrition(clamp(nutrition + FLOOR(radiation/100) + light_amount, 0, 500)) if(radiation >= 50 || light_amount > 2) //if there's enough light, heal + var/update_health = FALSE if(getBruteLoss()) - adjustBruteLoss(-1) + update_health = TRUE + adjustBruteLoss(-1, do_update_health = FALSE) if(getFireLoss()) - adjustFireLoss(-1) + update_health = TRUE + adjustFireLoss(-1, do_update_health = FALSE) if(getToxLoss()) - adjustToxLoss(-1) + update_health = TRUE + adjustToxLoss(-1, do_update_health = FALSE) if(getOxyLoss()) - adjustOxyLoss(-1) + update_health = TRUE + adjustOxyLoss(-1, do_update_health = FALSE) + if(update_health) + update_health() \ No newline at end of file diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index 248a637f219..3d51b45a1c2 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,5 +1,5 @@ /obj/screen/intent/diona_nymph - icon_state = "intent_devour" + icon_state = "intent_harm" screen_loc = DIONA_SCREEN_LOC_INTENT /obj/screen/intent/diona_nymph/on_update_icon() @@ -10,26 +10,7 @@ intent = I_DISARM icon_state = "intent_help" -/obj/screen/diona_hat - name = "equipped hat" - screen_loc = DIONA_SCREEN_LOC_HAT - icon_state = "hat" - -/obj/screen/diona_hat/Click() - var/datum/extension/hattable/hattable = get_extension(usr, /datum/extension/hattable) - hattable?.drop_hat(usr) - -/obj/screen/diona_held - name = "held item" - screen_loc = DIONA_SCREEN_LOC_HELD - icon_state = "held" - -/obj/screen/diona_held/Click() - var/mob/living/carbon/alien/diona/chirp = usr - if(istype(chirp) && chirp.holding_item) chirp.try_unequip(chirp.holding_item) - /datum/hud/diona_nymph - var/obj/screen/diona_hat/hat var/obj/screen/diona_held/held /datum/hud/diona_nymph/get_ui_style() @@ -42,39 +23,17 @@ return 255 /datum/hud/diona_nymph/FinalizeInstantiation() - var/ui_style = get_ui_style() var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - src.adding = list() + action_intent = new /obj/screen/intent/diona_nymph(null, mymob, ui_style, ui_color, ui_alpha) + mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha) src.other = list() + src.adding = list(mymob.healths, action_intent) + ..() - hat = new - hat.icon = ui_style - hat.color = ui_color - hat.alpha = ui_alpha - adding += hat - - held = new - held.icon = ui_style - held.color = ui_color - held.alpha = ui_alpha - adding += held - - action_intent = new /obj/screen/intent/diona_nymph() - action_intent.icon = ui_style - action_intent.color = ui_color - action_intent.alpha = ui_alpha - adding += action_intent - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.color = ui_color - mymob.healths.alpha = ui_alpha - mymob.healths.icon_state = "health0" - mymob.healths.SetName("health") - mymob.healths.screen_loc = DIONA_SCREEN_LOC_HEALTH - - mymob.client.screen = list(mymob.healths) - mymob.client.screen += src.adding + src.other +/obj/screen/diona_health + icon_state = "health0" + name = "health" + screen_loc = DIONA_SCREEN_LOC_HEALTH diff --git a/mods/mobs/dionaea/mob/nymph_update_icons.dm b/mods/mobs/dionaea/mob/nymph_update_icons.dm index 096d7a155f8..2f53e9309aa 100644 --- a/mods/mobs/dionaea/mob/nymph_update_icons.dm +++ b/mods/mobs/dionaea/mob/nymph_update_icons.dm @@ -6,7 +6,6 @@ else if(lying || stat == UNCONSCIOUS) icon_state += "-sleeping" else - add_overlay(emissive_overlay(icon = icon, icon_state = "[icon_state]-eyes")) z_flags |= ZMM_MANGLE_PLANES if(flower_color) @@ -15,8 +14,3 @@ I.color = flower_color flower.overlays += I add_overlay(flower) - - var/datum/extension/hattable/hattable = get_extension(src, /datum/extension/hattable) - var/image/I = hattable?.get_hat_overlay(src) - if(I) - add_overlay(I) diff --git a/mods/species/ascent/datum/antagonist.dm b/mods/species/ascent/datum/antagonist.dm index 1c135c50d63..caa5c48f1fd 100644 --- a/mods/species/ascent/datum/antagonist.dm +++ b/mods/species/ascent/datum/antagonist.dm @@ -7,7 +7,6 @@ and remove anything that might threaten your progeny." welcome_text = "You are an alate of the Ascent, tasked with ridding this sector of whatever your matriarch directs you to, \ preparing it for the foundation of a new fortress-nest. Obey your gyne and bring prosperity to your nest-lineage." - leader_welcome_text antaghud_indicator = "hudhunter" antag_indicator = "hudhunter" hard_cap = 10 @@ -35,7 +34,7 @@ H.real_name = ascent_culture.get_random_name(H, H.gender) H.name = H.real_name -/decl/special_role/hunter/equip(var/mob/living/carbon/human/player) +/decl/special_role/hunter/equip_role(var/mob/living/carbon/human/player) if(player?.species.get_root_species_name(player) == SPECIES_MANTID_GYNE) rig_type = /obj/item/rig/mantid/gyne else diff --git a/mods/species/ascent/datum/species.dm b/mods/species/ascent/datum/species.dm index a9db8e2c5a9..2f1fac6c318 100644 --- a/mods/species/ascent/datum/species.dm +++ b/mods/species/ascent/datum/species.dm @@ -72,16 +72,6 @@ species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_MINOR_CUT spawn_flags = SPECIES_IS_RESTRICTED - heat_discomfort_strings = list( - "You feel brittle and overheated.", - "Your overheated carapace flexes uneasily.", - "Overheated ichor trickles from your eyes." - ) - cold_discomfort_strings = list( - "Frost forms along your carapace.", - "You hear a faint crackle of ice as you shift your freezing body.", - "Your movements become sluggish under the weight of the chilly conditions." - ) unarmed_attacks = list( /decl/natural_attack/claws/strong/gloves, /decl/natural_attack/bite/sharp diff --git a/mods/species/ascent/datum/species_bodytypes.dm b/mods/species/ascent/datum/species_bodytypes.dm index ba1062e138f..3dc80d67394 100644 --- a/mods/species/ascent/datum/species_bodytypes.dm +++ b/mods/species/ascent/datum/species_bodytypes.dm @@ -31,6 +31,17 @@ ) limb_mapping = list(BP_CHEST = list(BP_CHEST, BP_M_HAND)) + heat_discomfort_strings = list( + "You feel brittle and overheated.", + "Your overheated carapace flexes uneasily.", + "Overheated ichor trickles from your eyes." + ) + cold_discomfort_strings = list( + "Frost forms along your carapace.", + "You hear a faint crackle of ice as you shift your freezing body.", + "Your movements become sluggish under the weight of the chilly conditions." + ) + /decl/bodytype/crystalline/mantid/alate name = "alate" bodytype_category = BODYTYPE_MANTID_SMALL @@ -64,10 +75,10 @@ /decl/bodytype/crystalline/mantid/gyne/Initialize() equip_adjust = list( BP_L_HAND = list( - "[NORTH]" = list("x" = -4, "y" = 12), - "[EAST]" = list("x" = -4, "y" = 12), - "[SOUTH]" = list("x" = -4, "y" = 12), - "[WEST]" = list("x" = -4, "y" = 12) + "[NORTH]" = list(-4, 12), + "[EAST]" = list(-4, 12), + "[SOUTH]" = list(-4, 12), + "[WEST]" = list(-4, 12) ) ) . = ..() diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index da38119bfa8..0908b3f816d 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -57,7 +57,7 @@ return INITIALIZE_HINT_QDEL if(decays) - addtimer(CALLBACK(src, /obj/effect/razorweb/proc/decay), 15 MINUTES) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/effect/razorweb, decay)), 15 MINUTES) web = image(icon = icon, icon_state = "razorweb") gleam = emissive_overlay(icon = icon, icon_state = "razorweb-gleam") @@ -117,9 +117,11 @@ add_fingerprint(user) return M -/obj/effect/razorweb/Crossed(var/mob/living/L) - . = ..() - entangle(L) +/obj/effect/razorweb/Crossed(var/atom/movable/AM) + ..() + if(!isliving(AM)) + return + entangle(AM) /obj/effect/razorweb/proc/entangle(var/mob/living/L, var/silent) diff --git a/mods/species/ascent/icons/ui.dmi b/mods/species/ascent/icons/ui.dmi index b85f1deeb96..57aec186fed 100644 Binary files a/mods/species/ascent/icons/ui.dmi and b/mods/species/ascent/icons/ui.dmi differ diff --git a/mods/species/ascent/items/clothing.dm b/mods/species/ascent/items/clothing.dm index 42f162c4829..44ab3515cb1 100644 --- a/mods/species/ascent/items/clothing.dm +++ b/mods/species/ascent/items/clothing.dm @@ -1,13 +1,13 @@ /decl/hierarchy/outfit/job/ascent - name = "Ascent - Gyne" - mask = /obj/item/clothing/mask/gas/ascent - uniform = /obj/item/clothing/under/ascent - id_type = /obj/item/card/id/ascent - shoes = /obj/item/clothing/shoes/magboots/ascent - l_ear = null - pda_type = null - pda_slot = 0 - flags = 0 + name = "Ascent - Gyne" + mask = /obj/item/clothing/mask/gas/ascent + uniform = /obj/item/clothing/under/ascent + id_type = /obj/item/card/id/ascent + shoes = /obj/item/clothing/shoes/magboots/ascent + l_ear = null + pda_type = null + pda_slot = 0 + outfit_flags = 0 /decl/hierarchy/outfit/job/ascent/attendant name = "Ascent - Attendant" diff --git a/mods/species/ascent/items/guns.dm b/mods/species/ascent/items/guns.dm index 07e38ea6a9c..3ca058e0f93 100644 --- a/mods/species/ascent/items/guns.dm +++ b/mods/species/ascent/items/guns.dm @@ -42,6 +42,7 @@ /obj/item/gun/energy/particle/on_update_icon() . = ..() + var/obj/item/cell/power_supply = get_cell() var/datum/firemode/current_mode = firemodes[sel_mode] set_overlays(list( "[get_world_inventory_state()]-[istype(current_mode) ? current_mode.name : "lethal"]", diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index 3f5ad25c460..6b76ee444d3 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -44,8 +44,8 @@ return var/datum/extension/access_provider/owner_access = get_or_create_extension(owner, /datum/extension/access_provider) owner_access?.register_id(src) - owner?.set_id_info(id_card) - owner?.add_language(/decl/language/mantid/worldnet) + owner.set_id_info(id_card) + owner.add_language(/decl/language/mantid/worldnet) /obj/item/organ/internal/controller/do_uninstall(in_place, detach, ignore_children) if(owner) @@ -61,10 +61,10 @@ id_card = new id_card(src) . = ..() -/obj/item/organ/internal/controller/GetIdCards() +/obj/item/organ/internal/controller/GetIdCards(list/exceptions) . = ..() //Not using is_broken() because it should be able to function when CUT_AWAY is set - if(damage < min_broken_damage) + if(id_card && damage < min_broken_damage && !is_type_in_list(id_card, exceptions)) LAZYDISTINCTADD(., id_card) /obj/item/organ/internal/controller/GetAccess() diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index f4ee8cd4a8d..d4a99bb73bc 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -228,13 +228,14 @@ /obj/item/rig_module/maneuvering_jets ) -/obj/item/rig/mantid/mob_can_equip(var/mob/M, var/slot, ignore_equipped = FALSE) +/obj/item/rig/mantid/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() - if(. && slot == slot_back_str) - var/mob/living/carbon/human/H = M - if(!istype(H) || H.species.get_root_species_name(H) != mantid_caste) - to_chat(H, "Your species cannot wear \the [src].") - . = 0 + if(!. || slot != slot_back_str || !mantid_caste) + return + var/decl/species/my_species = user?.get_species() + if(my_species?.get_root_species_name(user) != mantid_caste) + to_chat(user, SPAN_WARNING("Your species cannot wear \the [src].")) + return FALSE /obj/item/clothing/head/helmet/space/rig/mantid light_color = "#00ffff" diff --git a/mods/species/ascent/machines/fabricator.dm b/mods/species/ascent/machines/fabricator.dm index 61e77d244b2..917180f0848 100644 --- a/mods/species/ascent/machines/fabricator.dm +++ b/mods/species/ascent/machines/fabricator.dm @@ -13,7 +13,7 @@ name = "circuitboard (ascent nanofabricator)" build_path = /obj/machinery/fabricator/ascent board_type = "machine" - origin_tech = "{'engineering':2,'programming':2}" + origin_tech = @'{"engineering":2,"programming":2}' req_components = list( /obj/item/stock_parts/matter_bin = 3, /obj/item/stock_parts/manipulator = 1) diff --git a/mods/species/ascent/machines/magnetotron.dm b/mods/species/ascent/machines/magnetotron.dm index 8c49a67d233..dc12dbb0ac6 100644 --- a/mods/species/ascent/machines/magnetotron.dm +++ b/mods/species/ascent/machines/magnetotron.dm @@ -66,7 +66,7 @@ name = "circuitboard (Ascent magnetotron)" build_path = /obj/machinery/ascent_magnetotron board_type = "machine" - origin_tech = "{'engineering':2,'magnets':4}" + origin_tech = @'{"engineering":2,"magnets":4}' req_components = list( /obj/item/stock_parts/matter_bin = 3, /obj/item/stock_parts/manipulator = 1 diff --git a/mods/species/ascent/mobs/bodyparts.dm b/mods/species/ascent/mobs/bodyparts.dm index c6a2748d392..3b04f648e38 100644 --- a/mods/species/ascent/mobs/bodyparts.dm +++ b/mods/species/ascent/mobs/bodyparts.dm @@ -20,7 +20,7 @@ . = ..() if(.) action.button_icon_state = "weave-web-[cooldown ? "off" : "on"]" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/external/groin/insectoid/mantid/attack_self(var/mob/user) . = ..() @@ -42,7 +42,7 @@ owner.visible_message(SPAN_WARNING("\The [owner] separates their jaws and begins to weave a web of crystalline filaments...")) cooldown = TRUE refresh_action_button() - addtimer(CALLBACK(src, .proc/reset_cooldown), web_weave_time) + addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), web_weave_time) if(do_after(owner, web_weave_time) && length(existing_webs) < max_webs) playsound(user, 'mods/species/ascent/sounds/razorweb.ogg', 70, 0) owner.visible_message(SPAN_DANGER("\The [owner] completes a razorweb!")) @@ -64,7 +64,7 @@ . = ..() if(.) action.button_icon_state = "shot-web-[cooldown ? "off" : "on"]" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/external/head/insectoid/mantid/attack_self(var/mob/user) . = ..() @@ -81,7 +81,7 @@ owner.throw_mode_on() cooldown = TRUE refresh_action_button() - addtimer(CALLBACK(src, .proc/reset_cooldown), cooldown_time) + addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown_time) else qdel(web) diff --git a/mods/species/ascent/mobs/bodyparts_insectoid.dm b/mods/species/ascent/mobs/bodyparts_insectoid.dm index 752029e59a6..e9783d3dd5d 100644 --- a/mods/species/ascent/mobs/bodyparts_insectoid.dm +++ b/mods/species/ascent/mobs/bodyparts_insectoid.dm @@ -4,6 +4,7 @@ requires_organ_tag = BP_M_HAND ui_label = "M" ui_loc = "CENTER,BOTTOM+1:14" + covering_slot_flags = SLOT_HAND_LEFT|SLOT_HAND_RIGHT // todo: generalize? /obj/item/organ/external/hand/insectoid/midlimb name = "central grasper" @@ -21,12 +22,14 @@ requires_organ_tag = BP_L_HAND_UPPER ui_label = "UL" hand_sort_priority = 2 + covering_slot_flags = SLOT_HAND_LEFT /obj/item/organ/external/hand/insectoid/upper name = "left raptorial" - joint = "left upper wrist" - amputation_point = "left upper wrist" + joint = "upper left wrist" + amputation_point = "upper left shoulder" organ_tag = BP_L_HAND_UPPER + parent_organ = BP_CHEST gripper_type = /datum/inventory_slot/gripper/upper_left_hand /obj/item/organ/external/hand/insectoid/upper/get_manual_dexterity() @@ -38,12 +41,14 @@ requires_organ_tag = BP_R_HAND_UPPER ui_label = "UR" hand_sort_priority = 2 + covering_slot_flags = SLOT_HAND_RIGHT /obj/item/organ/external/hand/right/insectoid/upper name = "right raptorial" - joint = "right upper wrist" - amputation_point = "right upper wrist" + joint = "upper right wrist" + amputation_point = "upper right shoulder" organ_tag = BP_R_HAND_UPPER + parent_organ = BP_CHEST gripper_type = /datum/inventory_slot/gripper/upper_right_hand /obj/item/organ/external/hand/right/insectoid/upper/get_manual_dexterity() @@ -59,7 +64,7 @@ . = ..() if(.) action.button_icon_state = "egg-on" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/internal/egg_sac/insectoid/attack_self(var/mob/user) . = ..() diff --git a/mods/species/ascent/mobs/insectoid_egg.dm b/mods/species/ascent/mobs/insectoid_egg.dm index dad0583a7fe..6076c3dff4b 100644 --- a/mods/species/ascent/mobs/insectoid_egg.dm +++ b/mods/species/ascent/mobs/insectoid_egg.dm @@ -12,7 +12,7 @@ var/global/default_gyne name = "alien egg" desc = "A semi-translucent alien egg." health = 100 - maxhealth = 100 + max_health = 100 icon = 'mods/species/ascent/icons/egg.dmi' icon_state = "egg" @@ -27,7 +27,7 @@ var/global/default_gyne var/hatched = FALSE // Whether or not this egg has already hatched. material = /decl/material/solid/gemstone/crystal - + /obj/structure/insectoid_egg/Initialize() . = ..() START_PROCESSING(SSprocessing, src) @@ -76,11 +76,11 @@ var/global/default_gyne last_tick = world.time var/turf/T = get_turf(src) - + // Too high of temp will damage eggs. if(T.temperature > (max_temperature * 1.5)) health = max(0, health - 5) - + if(T.temperature < min_temperature || T.temperature > max_temperature) return @@ -102,9 +102,9 @@ var/global/default_gyne hatching = TRUE update_icon() visible_message(SPAN_NOTICE("\icon[src] \The [src] trembles and cracks as it begins to hatch.")) - addtimer(CALLBACK(src, .proc/finish_hatching), 2.5 SECONDS) - - + addtimer(CALLBACK(src, PROC_REF(finish_hatching)), 2.5 SECONDS) + + /obj/structure/insectoid_egg/proc/finish_hatching() hatched = TRUE hatching = FALSE diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index 1a4c737875d..2961ea4d14c 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -10,17 +10,16 @@ #define ANYMPH_TIME_MOLT 300 // How long to wait between molts. /mob/living/carbon/alien/ascent_nymph - name = SPECIES_MANTID_NYMPH + name = "mantid nymph" desc = "It's a little alien skittery critter. Hiss." icon = 'mods/species/ascent/icons/species/nymph.dmi' icon_state = ICON_STATE_WORLD death_msg = "expires with a pitiful hiss..." - health = 60 - maxHealth = 60 + mob_default_max_health = 60 available_maneuvers = list(/decl/maneuver/leap) only_species_language = 1 - voice_name = SPECIES_MANTID_NYMPH + voice_name = "mantid nymph" speak_emote = list("hisses", "chitters") universal_understand = FALSE universal_speak = FALSE @@ -30,10 +29,9 @@ holder_type = /obj/item/holder/ascent_nymph possession_candidate = 1 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_NO_CHEM_CHANGE hud_type = /datum/hud/ascent_nymph - var/obj/item/holding_item var/crystal_reserve = 1000 var/last_molt = 0 var/molt @@ -41,31 +39,15 @@ /mob/living/carbon/alien/ascent_nymph/get_jump_distance() return 3 -/mob/living/carbon/alien/ascent_nymph/Login() - . = ..() - if(client) - if(holding_item) - holding_item.screen_loc = ANYMPH_SCREEN_LOC_HELD - client.screen |= holding_item - /mob/living/carbon/alien/ascent_nymph/Initialize(var/mapload) update_icon() . = ..(mapload) + add_inventory_slot(new /datum/inventory_slot/head/simple) + add_held_item_slot(new /datum/inventory_slot/gripper/mouth/nymph/ascent) set_extension(src, /datum/extension/base_icon_state, icon_state) -/mob/living/carbon/alien/ascent_nymph/show_examined_worn_held_items(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - . = ..() - if(holding_item) - to_chat(user, SPAN_NOTICE("It is holding \icon[holding_item] \a [holding_item].")) - -/mob/living/carbon/alien/ascent_nymph/get_dexterity(var/silent = FALSE) - return DEXTERITY_NONE - -/mob/living/carbon/alien/ascent_nymph/death(gibbed) - if(holding_item) - try_unequip(holding_item) - - return ..(gibbed,death_msg) +/mob/living/carbon/alien/ascent_nymph/get_dexterity(var/silent) + return (DEXTERITY_EQUIP_ITEM|DEXTERITY_HOLD_ITEM) /mob/living/carbon/alien/ascent_nymph/on_update_icon() ..() diff --git a/mods/species/ascent/mobs/nymph/nymph_attacks.dm b/mods/species/ascent/mobs/nymph/nymph_attacks.dm index a570c01209a..e2003850e72 100644 --- a/mods/species/ascent/mobs/nymph/nymph_attacks.dm +++ b/mods/species/ascent/mobs/nymph/nymph_attacks.dm @@ -1,24 +1,11 @@ /mob/living/carbon/alien/ascent_nymph/UnarmedAttack(var/atom/A) - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - - if(a_intent == I_DISARM || a_intent == I_HELP) - if(can_collect(A)) - collect(A) - return - - if(ismob(A)) - visible_message(SPAN_NOTICE("\The [src] butts its head into \the [A].")) - return . = ..() + if(.) + return -/mob/living/carbon/alien/ascent_nymph/RangedAttack(atom/A, var/params) - if((a_intent == I_HURT || a_intent == I_GRAB) && holding_item) + if(ismob(A)) setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message(SPAN_DANGER("\The [src] spits \a [holding_item] at \the [A]!")) - var/atom/movable/temp = holding_item - try_unequip(holding_item) - if(temp) - temp.throw_at(A, 10, rand(3,5), src) + visible_message(SPAN_NOTICE("\The [src] butts its head into \the [A].")) return TRUE - . = ..() \ No newline at end of file + return FALSE diff --git a/mods/species/ascent/mobs/nymph/nymph_holder.dm b/mods/species/ascent/mobs/nymph/nymph_holder.dm index 4dbbc36a85a..ec430c06f8e 100644 --- a/mods/species/ascent/mobs/nymph/nymph_holder.dm +++ b/mods/species/ascent/mobs/nymph/nymph_holder.dm @@ -1,5 +1,5 @@ /obj/item/holder/ascent_nymph - origin_tech = "{'magnets':3,'biotech':5}" + origin_tech = @'{"magnets":3,"biotech":5}' slot_flags = SLOT_HEAD | SLOT_OVER_BODY | SLOT_HOLSTER armor = list( ARMOR_BIO = ARMOR_BIO_RESISTANT diff --git a/mods/species/ascent/mobs/nymph/nymph_inventory.dm b/mods/species/ascent/mobs/nymph/nymph_inventory.dm index 78c7adc3481..dc5220830fe 100644 --- a/mods/species/ascent/mobs/nymph/nymph_inventory.dm +++ b/mods/species/ascent/mobs/nymph/nymph_inventory.dm @@ -1,31 +1,3 @@ -/mob/living/carbon/alien/ascent_nymph/drop_from_inventory(var/obj/item/dropping_item) - . = ..() - if(dropping_item == holding_item) - holding_item = null - -/mob/living/carbon/alien/ascent_nymph/put_in_hands(var/obj/item/W) // No hands. Use mouth. - if(can_collect(W)) - collect(W) - else - W.forceMove(get_turf(src)) - return 1 - - -/mob/living/carbon/alien/ascent_nymph/hotkey_drop() - if(holding_item) - drop_item() - else - to_chat(usr, SPAN_WARNING("You have nothing to drop.")) - -/mob/living/carbon/alien/ascent_nymph/proc/can_collect(var/obj/item/collecting) - return (!holding_item && \ - istype(collecting) && \ - collecting.loc != src && \ - !collecting.anchored && \ - collecting.simulated && \ - collecting.w_class <= can_pull_size \ - ) - /mob/living/carbon/alien/ascent_nymph/proc/contains_crystals(var/obj/item/W) for(var/mat in W.matter) if(mat == /decl/material/solid/sand) @@ -37,51 +9,13 @@ else if(mat == /decl/material/solid/glass) . += W.matter[mat] -/mob/living/carbon/alien/ascent_nymph/proc/collect(var/obj/item/collecting) - collecting.forceMove(src) - holding_item = collecting - visible_message(SPAN_NOTICE("\The [src] engulfs \the [holding_item].")) - - // This means nymph can hoover up beakers as a kind of impromptu chem disposal - // technique, so long as they're okay with the reagents reacting inside them. - if(holding_item.reagents && holding_item.reagents.total_volume) - holding_item.reagents.trans_to_mob(src, holding_item.reagents.total_volume, CHEM_INGEST) - - // It also means they can do the old school cartoon schtick of eating an entire sandwich - // and spitting up an empty plate. Ptooie. - if(istype(holding_item, /obj/item/chems/food)) - var/obj/item/chems/food/food = holding_item - holding_item = null - if(food.trash) holding_item = new food.trash(src) - qdel(food) - - var/crystals = contains_crystals(collecting) - if(crystals) - if(crystal_reserve < ANYMPH_MAX_CRYSTALS) - crystal_reserve = min(ANYMPH_MAX_CRYSTALS, crystal_reserve + crystals) - qdel(collecting) - else - to_chat(src, SPAN_WARNING("You've already filled yourself with as much crystalline matter as you can!")) - return - - if(!QDELETED(holding_item)) - holding_item.equipped(src) - holding_item.screen_loc = ANYMPH_SCREEN_LOC_HELD - -/mob/living/carbon/alien/ascent_nymph/verb/drop_item_verb() - set name = "Drop Held Item" - set desc = "Drop the item you are currently holding inside." - set category = "IC" - set src = usr - drop_item() - -/mob/living/carbon/alien/ascent_nymph/drop_item() - var/item = holding_item - if(item && try_unequip(item)) - visible_message(SPAN_NOTICE("\The [src] regurgitates \the [item].")) - return TRUE +/datum/inventory_slot/gripper/mouth/nymph/ascent/equipped(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE, var/delete_old_item = TRUE) + var/mob/living/carbon/alien/ascent_nymph/nimp = user + var/crystals = istype(nimp) ? nimp.contains_crystals(prop) : 0 . = ..() - -// Makes it so that the held item's screen_loc isn't unset. -/mob/living/carbon/alien/ascent_nymph/item_should_have_screen_presence(obj/item/item, slot) - return (item == holding_item) || ..() \ No newline at end of file + if(. && crystals) + nimp.crystal_reserve = min(ANYMPH_MAX_CRYSTALS, nimp.crystal_reserve + crystals) + if(nimp.crystal_reserve >= ANYMPH_MAX_CRYSTALS) + to_chat(src, SPAN_WARNING("You've filled yourself with as much crystalline matter as you can!")) + if(!QDELETED(prop)) + qdel(prop) diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 298f9e627f6..cd1a17f31af 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -1,9 +1,28 @@ -/mob/living/carbon/alien/ascent_nymph/Life() +/mob/living/carbon/alien/ascent_nymph/handle_regular_hud_updates() . = ..() - if(stat == DEAD) + if(!.) return - + var/datum/hud/ascent_nymph/nymph_hud = hud_used + if(!istype(nymph_hud)) + return + if(nymph_hud.food) + switch(nutrition) + if(450 to INFINITY) nymph_hud.food.icon_state = "nutrition0" + if(350 to 450) nymph_hud.food.icon_state = "nutrition1" + if(250 to 350) nymph_hud.food.icon_state = "nutrition2" + if(150 to 250) nymph_hud.food.icon_state = "nutrition3" + else nymph_hud.food.icon_state = "nutrition4" + if(nymph_hud.drink) + switch(hydration) + if(450 to INFINITY) nymph_hud.drink.icon_state = "hydration0" + if(350 to 450) nymph_hud.drink.icon_state = "hydration1" + if(250 to 350) nymph_hud.drink.icon_state = "hydration2" + if(150 to 250) nymph_hud.drink.icon_state = "hydration3" + else nymph_hud.drink.icon_state = "hydration4" + +/mob/living/carbon/alien/ascent_nymph/handle_nutrition_and_hydration() + . = ..() // Generate some crystals over time. if(nutrition >= 300 && crystal_reserve < ANYMPH_MAX_CRYSTALS) crystal_reserve = min(ANYMPH_MAX_CRYSTALS, crystal_reserve + 15) @@ -16,31 +35,14 @@ adjust_nutrition(DEFAULT_HUNGER_FACTOR * -2) else adjust_nutrition(DEFAULT_HUNGER_FACTOR * -1) - if(hydration > 0) adjust_hydration(DEFAULT_THIRST_FACTOR * -1) - update_nymph_hud() - -/mob/living/carbon/alien/ascent_nymph/proc/update_nymph_hud() - // Update the HUD. - var/datum/hud/ascent_nymph/nymph_hud = hud_used - if(istype(nymph_hud)) - if(nymph_hud.food) - switch(nutrition) - if(450 to INFINITY) nymph_hud.food.icon_state = "nutrition0" - if(350 to 450) nymph_hud.food.icon_state = "nutrition1" - if(250 to 350) nymph_hud.food.icon_state = "nutrition2" - if(150 to 250) nymph_hud.food.icon_state = "nutrition3" - else nymph_hud.food.icon_state = "nutrition4" - - if(nymph_hud.drink) - switch(hydration) - if(450 to INFINITY) nymph_hud.drink.icon_state = "hydration0" - if(350 to 450) nymph_hud.drink.icon_state = "hydration1" - if(250 to 350) nymph_hud.drink.icon_state = "hydration2" - if(150 to 250) nymph_hud.drink.icon_state = "hydration3" - else nymph_hud.drink.icon_state = "hydration4" +/mob/living/carbon/alien/ascent_nymph/Stat() + . = ..() + if(client && statpanel("Status")) + stat("Nutrition", "[get_nutrition()]/[ANYMPH_NUTRITION_MOLT]") + stat("Crystal reserve", "[crystal_reserve]/[ANYMPH_CRYSTAL_MOLT]") /mob/living/carbon/alien/ascent_nymph/proc/can_molt() if(crystal_reserve < ANYMPH_CRYSTAL_MOLT) @@ -61,7 +63,7 @@ molt = min(molt + 1, 5) var/mob/living/carbon/alien/ascent_nymph/nymph = usr nymph.visible_message("\icon[nymph] [nymph] begins to shimmy and shake out of its old skin.") - if(molt == 5) + if(molt == 5) if(do_after(nymph, 10 SECONDS, nymph, FALSE)) var/mob/living/carbon/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) H.dna.lineage = nymph.dna.lineage @@ -74,7 +76,7 @@ else nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") return - + if(do_after(nymph, 5 SECONDS, nymph, FALSE)) var/matrix/M = matrix() M.Scale(1 + (molt / 10)) @@ -83,7 +85,7 @@ last_molt = world.time nutrition = max(0, nutrition - ANYMPH_NUTRITION_MOLT) crystal_reserve = max(0, crystal_reserve - ANYMPH_CRYSTAL_MOLT) - new/obj/item/ascent_molt(get_turf(src)) + new /obj/item/ascent_molt(get_turf(src)) else nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") \ No newline at end of file diff --git a/mods/species/ascent/mobs/nymph/nymph_ui.dm b/mods/species/ascent/mobs/nymph/nymph_ui.dm index 968405cc6bd..7de72b0a1d4 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -1,5 +1,5 @@ /obj/screen/intent/ascent_nymph - icon_state = "intent_devour" + icon_state = "intent_harm" screen_loc = ANYMPH_SCREEN_LOC_INTENT /obj/screen/intent/ascent_nymph/on_update_icon() @@ -10,27 +10,17 @@ intent = I_DISARM icon_state = "intent_help" -/obj/screen/ascent_nymph_held - name = "held item" - screen_loc = ANYMPH_SCREEN_LOC_HELD - icon_state = "held" - -/obj/screen/ascent_nymph_held/Click() - var/mob/living/carbon/alien/ascent_nymph/nymph = usr - if(istype(nymph) && nymph.holding_item) nymph.try_unequip(nymph.holding_item) - /obj/screen/ascent_nymph_molt name = "molt" icon = 'icons/obj/action_buttons/organs.dmi' screen_loc = ANYMPH_SCREEN_LOC_MOLT icon_state = "molt-on" -/obj/screen/ascent_nymph_molt/Click() - var/mob/living/carbon/alien/ascent_nymph/nymph = usr +/obj/screen/ascent_nymph_molt/handle_click(mob/user, params) + var/mob/living/carbon/alien/ascent_nymph/nymph = user if(istype(nymph)) nymph.molt() /datum/hud/ascent_nymph - var/obj/screen/ascent_nymph_held/held var/obj/screen/ascent_nymph_molt/molt var/obj/screen/food/food var/obj/screen/drink/drink @@ -45,53 +35,18 @@ return 255 /datum/hud/ascent_nymph/FinalizeInstantiation() - var/ui_style = get_ui_style() var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - - src.adding = list() + molt = new( null, mymob, ui_style, ui_color, ui_alpha) + food = new /obj/screen/food( null, mymob, ui_style, ui_color, ui_alpha) + drink = new /obj/screen/drink( null, mymob, ui_style, ui_color, ui_alpha) + action_intent = new /obj/screen/intent/ascent_nymph(null, mymob, ui_style, ui_color, ui_alpha) + mymob.healths = new /obj/screen/ascent_nymph_health(null, mymob, ui_style, ui_color, ui_alpha) src.other = list() + src.adding = list(mymob.healths, molt, food, drink, action_intent) + ..() - held = new - held.icon = ui_style - held.color = ui_color - held.alpha = ui_alpha - adding += held - - molt = new - molt.icon = ui_style - molt.color = ui_color - molt.alpha = ui_alpha - adding += molt - - food = new - food.icon = 'icons/mob/status_hunger.dmi' - food.SetName("nutrition") - food.icon_state = "nutrition1" - food.pixel_w = 8 - food.screen_loc = ui_nutrition_small - adding += food - - drink = new - drink.icon = 'icons/mob/status_hunger.dmi' - drink.icon_state = "hydration1" - drink.SetName("hydration") - drink.screen_loc = ui_nutrition_small - adding += drink - - action_intent = new /obj/screen/intent/ascent_nymph() - action_intent.icon = ui_style - action_intent.color = ui_color - action_intent.alpha = ui_alpha - adding += action_intent - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.color = ui_color - mymob.healths.alpha = ui_alpha - mymob.healths.SetName("health") - mymob.healths.screen_loc = ANYMPH_SCREEN_LOC_HEALTH - - mymob.client.screen = list(mymob.healths) - mymob.client.screen += src.adding + src.other \ No newline at end of file +/obj/screen/ascent_nymph_health + name = "health" + screen_loc = ANYMPH_SCREEN_LOC_HEALTH diff --git a/mods/species/bayliens/_bayliens.dme b/mods/species/bayliens/_bayliens.dme index 92ad697aac1..1e053ec6723 100644 --- a/mods/species/bayliens/_bayliens.dme +++ b/mods/species/bayliens/_bayliens.dme @@ -44,6 +44,7 @@ #include "tajaran\datum\language.dm" #include "tajaran\datum\species.dm" #include "tajaran\datum\species_bodytypes.dm" +#include "tajaran\machinery\suit_cycler.dm" #include "tritonian\_tritonian.dm" #include "tritonian\datum\species.dm" #include "tritonian\datum\species_bodytypes.dm" diff --git a/mods/species/bayliens/adherent/_adherent.dm b/mods/species/bayliens/adherent/_adherent.dm index e626999d154..a5b9572567d 100644 --- a/mods/species/bayliens/adherent/_adherent.dm +++ b/mods/species/bayliens/adherent/_adherent.dm @@ -6,5 +6,6 @@ #define BP_JETS "maneuvering jets" #define BP_COOLING_FINS "cooling fins" -/mob/living/carbon/human/adherent/Initialize(mapload) - . = ..(mapload, SPECIES_ADHERENT) +/mob/living/carbon/human/adherent/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + species_name = SPECIES_ADHERENT + . = ..() \ No newline at end of file diff --git a/mods/species/bayliens/adherent/datum/species.dm b/mods/species/bayliens/adherent/datum/species.dm index d378482d7cd..a0f8b934bd1 100644 --- a/mods/species/bayliens/adherent/datum/species.dm +++ b/mods/species/bayliens/adherent/datum/species.dm @@ -51,14 +51,6 @@ speech_sounds = list('mods/species/bayliens/adherent/sound/chime.ogg') speech_chance = 25 - cold_level_1 = SYNTH_COLD_LEVEL_1 - cold_level_2 = SYNTH_COLD_LEVEL_2 - cold_level_3 = SYNTH_COLD_LEVEL_3 - - heat_level_1 = SYNTH_HEAT_LEVEL_1 - heat_level_2 = SYNTH_HEAT_LEVEL_2 - heat_level_3 = SYNTH_HEAT_LEVEL_3 - species_flags = SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_MINOR_CUT spawn_flags = SPECIES_CAN_JOIN diff --git a/mods/species/bayliens/adherent/datum/species_bodytypes.dm b/mods/species/bayliens/adherent/datum/species_bodytypes.dm index aaf3e4badf8..10eb8741fb0 100644 --- a/mods/species/bayliens/adherent/datum/species_bodytypes.dm +++ b/mods/species/bayliens/adherent/datum/species_bodytypes.dm @@ -52,52 +52,52 @@ /decl/bodytype/crystalline/adherent/Initialize() equip_adjust = list( "[BP_L_HAND]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 0, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = 0, "y" = 14) + "[NORTH]" = list(0, 14), + "[EAST]" = list(0, 14), + "[SOUTH]" = list(0, 14), + "[WEST]" = list(0, 14) ), "[BP_R_HAND]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 0, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = 0, "y" = 14) + "[NORTH]" = list(0, 14), + "[EAST]" = list(0, 14), + "[SOUTH]" = list(0, 14), + "[WEST]" = list(0, 14) ), "[slot_back_str]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 0, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = 0, "y" = 14) + "[NORTH]" = list(0, 14), + "[EAST]" = list(0, 14), + "[SOUTH]" = list(0, 14), + "[WEST]" = list(0, 14) ), "[slot_belt_str]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 0, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = 0, "y" = 14) + "[NORTH]" = list(0, 14), + "[EAST]" = list(0, 14), + "[SOUTH]" = list(0, 14), + "[WEST]" = list(0, 14) ), "[slot_head_str]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 3, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = -3, "y" = 14) + "[NORTH]" = list( 0, 14), + "[EAST]" = list( 3, 14), + "[SOUTH]" = list( 0, 14), + "[WEST]" = list(-3, 14) ), "[slot_l_ear_str]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 0, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = 0, "y" = 14) + "[NORTH]" = list(0, 14), + "[EAST]" = list(0, 14), + "[SOUTH]" = list(0, 14), + "[WEST]" = list(0, 14) ), "[slot_r_ear_str]" = list( - "[NORTH]" = list("x" = 0, "y" = 14), - "[EAST]" = list("x" = 0, "y" = 14), - "[SOUTH]" = list("x" = 0, "y" = 14), - "[WEST]" = list("x" = 0, "y" = 14) + "[NORTH]" = list(0, 14), + "[EAST]" = list(0, 14), + "[SOUTH]" = list(0, 14), + "[WEST]" = list(0, 14) ) ) . = ..() diff --git a/mods/species/bayliens/adherent/organs/organs_internal.dm b/mods/species/bayliens/adherent/organs/organs_internal.dm index c5c93eef5e2..5f7bbe5eddd 100644 --- a/mods/species/bayliens/adherent/organs/organs_internal.dm +++ b/mods/species/bayliens/adherent/organs/organs_internal.dm @@ -14,7 +14,7 @@ . = ..() if(.) action.button_icon_state = "adherent-brain" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/internal/brain/adherent/attack_self(var/mob/user) . = ..() @@ -64,7 +64,7 @@ . = ..() if(.) action.button_icon_state = "[base_action_state]-[active ? "on" : "off"]" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/internal/powered/attack_self(var/mob/user) . = ..() @@ -120,7 +120,7 @@ /obj/item/organ/internal/eyes/adherent/Initialize() . = ..() - verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color + verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb /obj/item/organ/internal/cell/adherent name = "piezoelectric core" diff --git a/mods/species/bayliens/skrell/_skrell.dm b/mods/species/bayliens/skrell/_skrell.dm index 9676bd37e6f..a1fc8f067ff 100644 --- a/mods/species/bayliens/skrell/_skrell.dm +++ b/mods/species/bayliens/skrell/_skrell.dm @@ -1,5 +1,6 @@ #define SPECIES_SKRELL "Skrell" #define BODYTYPE_SKRELL "skrellian body" -/mob/living/carbon/human/skrell/Initialize(mapload) - . = ..(mapload, SPECIES_SKRELL) \ No newline at end of file +/mob/living/carbon/human/skrell/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + species_name = SPECIES_SKRELL + . = ..() \ No newline at end of file diff --git a/mods/species/bayliens/skrell/datum/blood.dm b/mods/species/bayliens/skrell/datum/blood.dm index 4c85f62e13f..ba0767a0f37 100644 --- a/mods/species/bayliens/skrell/datum/blood.dm +++ b/mods/species/bayliens/skrell/datum/blood.dm @@ -41,18 +41,18 @@ random_weighting = 4 /obj/item/chems/ivbag/blood/skrell_yplus - blood_type = "Y+" + label_text = "Y+" /obj/item/chems/ivbag/blood/skrell_yminus - blood_type = "Y-" + label_text = "Y-" /obj/item/chems/ivbag/blood/skrell_zplus - blood_type = "Z+" + label_text = "Z+" /obj/item/chems/ivbag/blood/skrell_zminus - blood_type = "Z-" + label_text = "Z-" /obj/item/chems/ivbag/blood/skrell_yzplus - blood_type = "YZ+" + label_text = "YZ+" /obj/item/chems/ivbag/blood/skrell_yzminus - blood_type = "YZ-" + label_text = "YZ-" /obj/item/chems/ivbag/blood/skrell_noplus - blood_type = "No+" + label_text = "No+" /obj/item/chems/ivbag/blood/skrell_nominus - blood_type = "No-" + label_text = "No-" diff --git a/mods/species/bayliens/skrell/datum/species.dm b/mods/species/bayliens/skrell/datum/species.dm index c3d7d37d38c..9885bf6b98d 100644 --- a/mods/species/bayliens/skrell/datum/species.dm +++ b/mods/species/bayliens/skrell/datum/species.dm @@ -21,7 +21,7 @@ interference in their customs and values." meat_type = /obj/item/chems/food/fish/octopus/skrell - bone_material = /decl/material/solid/bone/cartilage + bone_material = /decl/material/solid/organic/bone/cartilage available_pronouns = list( /decl/pronouns/skrell ) @@ -56,18 +56,6 @@ /decl/blood_type/skrell/noplus, /decl/blood_type/skrell/nominus ) - - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 130 //Default 120 - - heat_level_1 = 420 //Default 360 - Higher is better - heat_level_2 = 480 //Default 400 - heat_level_3 = 1100 //Default 1000 - - cold_discomfort_level = 292 //Higher than perhaps it should be, to avoid big speed reduction at normal room temp - heat_discomfort_level = 368 - appearance_descriptors = list( /datum/appearance_descriptor/height = 1, /datum/appearance_descriptor/build = 0.8, @@ -135,10 +123,10 @@ bloodDNA = list(blood_data["blood_DNA"] = blood_data["blood_type"]) else bloodDNA = list() - T.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints, bloodDNA, H.dir, 0, H.skin_colour + "25") // Coming (8c is the alpha value) + T.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints, bloodDNA, H.dir, 0, H.get_skin_colour() + "25") // Coming (8c is the alpha value) if(istype(old_loc, /turf/simulated)) var/turf/simulated/old_turf = old_loc - old_turf.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints, bloodDNA, 0, H.dir, H.skin_colour + "25") // Going (8c is the alpha value) + old_turf.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints, bloodDNA, 0, H.dir, H.get_skin_colour() + "25") // Going (8c is the alpha value) /decl/species/skrell/check_background() return TRUE diff --git a/mods/species/bayliens/skrell/datum/species_bodytype.dm b/mods/species/bayliens/skrell/datum/species_bodytype.dm index 7331059d594..2203188c040 100644 --- a/mods/species/bayliens/skrell/datum/species_bodytype.dm +++ b/mods/species/bayliens/skrell/datum/species_bodytype.dm @@ -24,3 +24,12 @@ BP_EYES = /obj/item/organ/internal/eyes/skrell ) default_h_style = /decl/sprite_accessory/hair/skrell/short + + cold_level_1 = 280 //Default 260 - Lower is better + cold_level_2 = 220 //Default 200 + cold_level_3 = 130 //Default 120 + heat_level_1 = 420 //Default 360 - Higher is better + heat_level_2 = 480 //Default 400 + heat_level_3 = 1100 //Default 1000 + cold_discomfort_level = 292 //Higher than perhaps it should be, to avoid big speed reduction at normal room temp + heat_discomfort_level = 368 diff --git a/mods/species/bayliens/skrell/gear/gear.dm b/mods/species/bayliens/skrell/gear/gear.dm index 5ad58d02639..40788b67b9b 100644 --- a/mods/species/bayliens/skrell/gear/gear.dm +++ b/mods/species/bayliens/skrell/gear/gear.dm @@ -79,7 +79,6 @@ slowdown_held = 1 slowdown_worn = 1 removable_components = FALSE - cell = /obj/item/cell/hyper capacitor = /obj/item/stock_parts/capacitor/adv load_type = /obj/item/magnetic_ammo/skrell loaded = /obj/item/magnetic_ammo/skrell @@ -95,7 +94,6 @@ item_state = "skrell_carbine" slot_flags = SLOT_BACK|SLOT_LOWER_BODY desc = "The Vuu'Xqu*ix T-3, known as 'VT-3' by SolGov. Rarely seen out in the wild by anyone outside of a Skrellian SDTF." - accepts_cell_type = /obj/item/cell/high self_recharge = 1 projectile_type=/obj/item/projectile/beam/pulse/skrell/single charge_cost=120 @@ -110,6 +108,9 @@ list(mode_name="light", projectile_type=/obj/item/projectile/beam/pulse/skrell, charge_cost=40, burst=3, burst_delay=2) ) +/obj/item/gun/energy/pulse_rifle/skrell/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) + return ..(/obj/item/cell/high, /obj/item/cell, power_supply_extension_type, charge_value) + /obj/item/projectile/beam/pulse/skrell icon_state = "pu_laser" damage = 20 diff --git a/mods/species/bayliens/skrell/gear/gear_ears.dm b/mods/species/bayliens/skrell/gear/gear_ears.dm index eb4d74885d9..1bb0085d26e 100644 --- a/mods/species/bayliens/skrell/gear/gear_ears.dm +++ b/mods/species/bayliens/skrell/gear/gear_ears.dm @@ -2,9 +2,9 @@ name = "skrell tentacle wear" desc = "Some stuff worn by skrell to adorn their head tentacles." -/obj/item/clothing/ears/skrell/mob_can_equip(mob/living/M, slot, disable_warning = 0, ignore_equipped = 0) +/obj/item/clothing/ears/skrell/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() - if(. && M?.get_bodytype()?.name != BODYTYPE_SKRELL) + if(. && user?.get_bodytype()?.name != BODYTYPE_SKRELL) return FALSE /obj/item/clothing/ears/skrell/band @@ -45,4 +45,4 @@ category = /decl/loadout_category/ears whitelisted = list(SPECIES_SKRELL) path = /obj/item/clothing/ears/skrell - flags = GEAR_HAS_COLOR_SELECTION | GEAR_HAS_SUBTYPE_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION | GEAR_HAS_SUBTYPE_SELECTION diff --git a/mods/species/bayliens/skrell/gear/gear_head.dm b/mods/species/bayliens/skrell/gear/gear_head.dm index a1ec74c8f5f..09275049bed 100644 --- a/mods/species/bayliens/skrell/gear/gear_head.dm +++ b/mods/species/bayliens/skrell/gear/gear_head.dm @@ -12,9 +12,9 @@ ARMOR_RAD = ARMOR_RAD_SHIELDED ) -/obj/item/clothing/head/helmet/space/void/skrell/mob_can_equip(mob/living/M, slot, disable_warning = 0, force = 0, ignore_equipped = 0) +/obj/item/clothing/head/helmet/space/void/skrell/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() - if(. && M?.get_bodytype()?.name != BODYTYPE_SKRELL) + if(. && user?.get_bodytype()?.name != BODYTYPE_SKRELL) return FALSE /obj/item/clothing/head/helmet/space/void/skrell/black @@ -25,7 +25,7 @@ desc = "A helmet built for use by a Skrell. This one appears to be fairly standard and reliable." icon = 'mods/species/bayliens/skrell/icons/clothing/head/helmet_skrell.dmi' -/obj/item/clothing/head/helmet/skrell/mob_can_equip(mob/living/M, slot, disable_warning = 0, force = 0, ignore_equipped = 0) +/obj/item/clothing/head/helmet/skrell/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() - if(. && M?.get_bodytype()?.name != BODYTYPE_SKRELL) + if(. && user?.get_bodytype()?.name != BODYTYPE_SKRELL) return FALSE \ No newline at end of file diff --git a/mods/species/bayliens/skrell/gear/gear_mask.dm b/mods/species/bayliens/skrell/gear/gear_mask.dm index 42f4313d967..ff81e9d3d68 100644 --- a/mods/species/bayliens/skrell/gear/gear_mask.dm +++ b/mods/species/bayliens/skrell/gear/gear_mask.dm @@ -10,7 +10,7 @@ flags_inv = 0 body_parts_covered = 0 -/obj/item/clothing/mask/gas/skrell/mob_can_equip(mob/living/M, slot, disable_warning = 0, ignore_equipped = FALSE) +/obj/item/clothing/mask/gas/skrell/mob_can_equip(mob/user, slot, disable_warning = FALSE, force = FALSE, ignore_equipped = FALSE) . = ..() - if(. && M?.get_bodytype()?.name != BODYTYPE_SKRELL) - return FALSE \ No newline at end of file + if(. && user?.get_bodytype()?.name != BODYTYPE_SKRELL) + return FALSE diff --git a/mods/species/bayliens/skrell/icons/body/hair.dmi b/mods/species/bayliens/skrell/icons/body/hair.dmi index f3d3cf7574e..9dad6dda88a 100644 Binary files a/mods/species/bayliens/skrell/icons/body/hair.dmi and b/mods/species/bayliens/skrell/icons/body/hair.dmi differ diff --git a/mods/species/bayliens/tajaran/_tajaran.dm b/mods/species/bayliens/tajaran/_tajaran.dm index 4c0b2a9ca43..78e6c821d4b 100644 --- a/mods/species/bayliens/tajaran/_tajaran.dm +++ b/mods/species/bayliens/tajaran/_tajaran.dm @@ -8,5 +8,5 @@ if(bodytype_equip_flags & BODY_FLAG_EXCLUDE) bodytype_equip_flags |= BODY_FLAG_FELINE -/mob/living/carbon/human/tajaran/Initialize(mapload) - . = ..(mapload, SPECIES_TAJARA) +/mob/living/carbon/human/tajaran/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + . = ..(species_name = SPECIES_TAJARA) diff --git a/mods/species/bayliens/tajaran/datum/accessory.dm b/mods/species/bayliens/tajaran/datum/accessory.dm index b85b331ddbc..d9f0ab3d3f6 100644 --- a/mods/species/bayliens/tajaran/datum/accessory.dm +++ b/mods/species/bayliens/tajaran/datum/accessory.dm @@ -4,7 +4,7 @@ icon_state = "hair_rattail" species_allowed = list(SPECIES_TAJARA) icon = 'mods/species/bayliens/tajaran/icons/hair.dmi' - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_hair_taj_rattail" /decl/sprite_accessory/hair/taj/straight @@ -132,7 +132,7 @@ icon_state = "facial_sideburns" species_allowed = list(SPECIES_TAJARA) icon = 'mods/species/bayliens/tajaran/icons/facial.dmi' - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_fhair_taj_sideburns" /decl/sprite_accessory/facial_hair/taj/mutton @@ -166,7 +166,7 @@ icon = 'mods/species/bayliens/tajaran/icons/markings.dmi' species_allowed = list(SPECIES_TAJARA) body_parts = list(BP_HEAD) - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_marking_taj_nose" /decl/sprite_accessory/marking/tajaran/ears diff --git a/mods/species/bayliens/tajaran/datum/blood.dm b/mods/species/bayliens/tajaran/datum/blood.dm index d57e1bcdfc6..29282ccbd58 100644 --- a/mods/species/bayliens/tajaran/datum/blood.dm +++ b/mods/species/bayliens/tajaran/datum/blood.dm @@ -41,18 +41,18 @@ random_weighting = 4 /obj/item/chems/ivbag/blood/feline_mplus - blood_type = "M+" + label_text = "M+" /obj/item/chems/ivbag/blood/feline_mminus - blood_type = "M-" + label_text = "M-" /obj/item/chems/ivbag/blood/feline_rplus - blood_type = "R+" + label_text = "R+" /obj/item/chems/ivbag/blood/feline_mminus - blood_type = "M-" + label_text = "M-" /obj/item/chems/ivbag/blood/feline_mrplus - blood_type = "MR+" + label_text = "MR+" /obj/item/chems/ivbag/blood/feline_mrminus - blood_type = "MR-" + label_text = "MR-" /obj/item/chems/ivbag/blood/feline_oplus - blood_type = "Of+" + label_text = "Of+" /obj/item/chems/ivbag/blood/feline_oplus - blood_type = "Of-" + label_text = "Of-" diff --git a/mods/species/bayliens/tajaran/datum/species.dm b/mods/species/bayliens/tajaran/datum/species.dm index 3732ac95872..5d78d437ebf 100644 --- a/mods/species/bayliens/tajaran/datum/species.dm +++ b/mods/species/bayliens/tajaran/datum/species.dm @@ -54,23 +54,6 @@ move_trail = /obj/effect/decal/cleanable/blood/tracks/paw - cold_level_1 = 200 - cold_level_2 = 140 - cold_level_3 = 80 - - heat_level_1 = 330 - heat_level_2 = 380 - heat_level_3 = 800 - - heat_discomfort_level = 294 - cold_discomfort_level = 230 - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - available_cultural_info = list( TAG_CULTURE = list( /decl/cultural_info/culture/tajaran, @@ -99,4 +82,4 @@ autohiss_exempt = list(LANGUAGE_TAJARA) /decl/species/tajaran/handle_additional_hair_loss(var/mob/living/carbon/human/H, var/defer_body_update = TRUE) - . = H && H.change_skin_color(rgb(189, 171, 143)) + . = H?.set_skin_colour(rgb(189, 171, 143)) diff --git a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm index 575a8c9bbfe..bc1579552a6 100644 --- a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm +++ b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm @@ -24,21 +24,36 @@ eye_low_light_vision_adjustment_speed = 0.3 override_limb_types = list( - BP_EYES = /obj/item/organ/internal/eyes, BP_TAIL = /obj/item/organ/external/tail/cat ) base_markings = list(/decl/sprite_accessory/marking/tajaran/ears = "#ae7d32") + cold_level_1 = 200 + cold_level_2 = 140 + cold_level_3 = 80 + + heat_level_1 = 330 + heat_level_2 = 380 + heat_level_3 = 800 + + heat_discomfort_level = 294 + cold_discomfort_level = 230 + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + /decl/bodytype/feline/Initialize() equip_adjust = list( - slot_glasses_str = list("[NORTH]" = list("x" = 0, "y" = 2), "[EAST]" = list("x" = 0, "y" = 2), "[SOUTH]" = list("x" = 0, "y" = 2), "[WEST]" = list("x" = 0, "y" = 2)), - slot_wear_mask_str = list("[NORTH]" = list("x" = 0, "y" = 2), "[EAST]" = list("x" = 0, "y" = 2), "[SOUTH]" = list("x" = 0, "y" = 2), "[WEST]" = list("x" = 0, "y" = 2)), - slot_head_str = list("[NORTH]" = list("x" = 0, "y" = 2), "[EAST]" = list("x" = 0, "y" = 2), "[SOUTH]" = list("x" = 0, "y" = 2), "[WEST]" = list("x" = 0, "y" = 2)) + slot_glasses_str = list("[NORTH]" = list(0, 2), "[EAST]" = list(0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(0, 2)), + slot_wear_mask_str = list("[NORTH]" = list(0, 2), "[EAST]" = list(0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(0, 2)), + slot_head_str = list("[NORTH]" = list(0, 2), "[EAST]" = list(0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(0, 2)) ) . = ..() /obj/item/organ/external/tail/cat - tail_animation = 'mods/species/bayliens/tajaran/icons/tail.dmi' - tail = "tajtail" + tail_icon = 'mods/species/bayliens/tajaran/icons/tail.dmi' + tail = "tajtail" tail_blend = ICON_MULTIPLY diff --git a/mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi new file mode 100644 index 00000000000..6b175ec87d6 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi new file mode 100644 index 00000000000..f9ce4604f3a Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi new file mode 100644 index 00000000000..34b9cedc5ab Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi new file mode 100644 index 00000000000..b0a597cfecf Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi new file mode 100644 index 00000000000..1565d9f8e89 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi new file mode 100644 index 00000000000..9265508d9b1 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi new file mode 100644 index 00000000000..235d2810121 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi new file mode 100644 index 00000000000..e2e0245516a Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi new file mode 100644 index 00000000000..d7828714306 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi new file mode 100644 index 00000000000..963ade3c684 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi new file mode 100644 index 00000000000..e50553d1005 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi new file mode 100644 index 00000000000..ad6ad32daa1 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi new file mode 100644 index 00000000000..1e95ce43f85 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi new file mode 100644 index 00000000000..902a9487ac6 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi new file mode 100644 index 00000000000..d7919da2414 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi new file mode 100644 index 00000000000..4ec38b440b5 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi b/mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi new file mode 100644 index 00000000000..17f0769a4d2 Binary files /dev/null and b/mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/facial.dmi b/mods/species/bayliens/tajaran/icons/facial.dmi index 40fc99054b3..befd9dc68b4 100644 Binary files a/mods/species/bayliens/tajaran/icons/facial.dmi and b/mods/species/bayliens/tajaran/icons/facial.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/hair.dmi b/mods/species/bayliens/tajaran/icons/hair.dmi index 240dbf58064..88380247713 100644 Binary files a/mods/species/bayliens/tajaran/icons/hair.dmi and b/mods/species/bayliens/tajaran/icons/hair.dmi differ diff --git a/mods/species/bayliens/tajaran/icons/tail.dmi b/mods/species/bayliens/tajaran/icons/tail.dmi index 5d0e5e2bf02..b2c2cc83bd0 100644 Binary files a/mods/species/bayliens/tajaran/icons/tail.dmi and b/mods/species/bayliens/tajaran/icons/tail.dmi differ diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm new file mode 100644 index 00000000000..8a705dad3fb --- /dev/null +++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm @@ -0,0 +1,71 @@ +/obj/machinery/suit_cycler/Initialize() + LAZYDISTINCTADD(available_bodytypes, BODYTYPE_FELINE) + . = ..() + +/obj/item/clothing/suit/space/void/merc/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi') + +/obj/item/clothing/suit/space/void/swat/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi') + +/obj/item/clothing/suit/space/void/engineering/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi') + +/obj/item/clothing/suit/space/void/mining/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi') + +/obj/item/clothing/suit/space/void/medical/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi') + +/obj/item/clothing/suit/space/void/security/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi') + +/obj/item/clothing/suit/space/void/atmos/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi') + +/obj/item/clothing/suit/space/void/engineering/alt/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi') + +/obj/item/clothing/suit/space/void/mining/alt/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi') + +/obj/item/clothing/suit/space/void/medical/alt/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi') + +/obj/item/clothing/suit/space/void/security/alt/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi') + +/obj/item/clothing/suit/space/void/atmos/alt/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi') + +/obj/item/clothing/suit/space/void/engineering/salvage/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi') + +/obj/item/clothing/suit/space/void/pilot/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi') + +/obj/item/clothing/suit/space/void/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi') + +/obj/item/clothing/suit/space/void/wizard/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi') + +/obj/item/clothing/suit/space/void/excavation/Initialize() + . = ..() + LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi') diff --git a/mods/species/bayliens/unathi/_lizard.dm b/mods/species/bayliens/unathi/_lizard.dm index 23cc3f59cff..fdbd758e8af 100644 --- a/mods/species/bayliens/unathi/_lizard.dm +++ b/mods/species/bayliens/unathi/_lizard.dm @@ -1,5 +1,6 @@ #define SPECIES_LIZARD "Unathi" #define LANGUAGE_LIZARD "Sinta'unathi" -/mob/living/carbon/human/lizard/Initialize(mapload) - . = ..(mapload, SPECIES_LIZARD) +/mob/living/carbon/human/lizard/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + species_name = SPECIES_LIZARD + . = ..() diff --git a/mods/species/bayliens/unathi/datum/blood.dm b/mods/species/bayliens/unathi/datum/blood.dm index 1406a0ce5d8..3934dba6199 100644 --- a/mods/species/bayliens/unathi/datum/blood.dm +++ b/mods/species/bayliens/unathi/datum/blood.dm @@ -41,18 +41,18 @@ random_weighting = 4 /obj/item/chems/ivbag/blood/reptile_splus - blood_type = "S+" + label_text = "S+" /obj/item/chems/ivbag/blood/reptile_sminus - blood_type = "S-" + label_text = "S-" /obj/item/chems/ivbag/blood/reptile_xplus - blood_type = "X+" + label_text = "X+" /obj/item/chems/ivbag/blood/reptile_xminus - blood_type = "X-" + label_text = "X-" /obj/item/chems/ivbag/blood/reptile_sxplus - blood_type = "SX+" + label_text = "SX+" /obj/item/chems/ivbag/blood/reptile_sxminus - blood_type = "SX-" + label_text = "SX-" /obj/item/chems/ivbag/blood/reptile_oplus - blood_type = "Or+" + label_text = "Or+" /obj/item/chems/ivbag/blood/reptile_ominus - blood_type = "Or-" + label_text = "Or-" diff --git a/mods/species/bayliens/unathi/datum/species.dm b/mods/species/bayliens/unathi/datum/species.dm index 75019ab364e..664bf3ee73b 100644 --- a/mods/species/bayliens/unathi/datum/species.dm +++ b/mods/species/bayliens/unathi/datum/species.dm @@ -14,7 +14,7 @@ /decl/species/unathi name = SPECIES_LIZARD name_plural = SPECIES_LIZARD - skin_material = /decl/material/solid/skin/lizard + skin_material = /decl/material/solid/organic/skin/lizard available_bodytypes = list( /decl/bodytype/lizard, @@ -44,14 +44,6 @@ description = "A heavily reptillian species. They prefer warmer temperatures than most species and \ their native tongue is a heavy hissing laungage." - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 130 //Default 120 - - heat_level_1 = 420 //Default 360 - Higher is better - heat_level_2 = 480 //Default 400 - heat_level_3 = 1100 //Default 1000 - spawn_flags = SPECIES_CAN_JOIN | SPECIES_NO_ROBOTIC_INTERNAL_ORGANS flesh_color = "#34af10" @@ -71,20 +63,6 @@ ) move_trail = /obj/effect/decal/cleanable/blood/tracks/claw - heat_discomfort_level = 320 - heat_discomfort_strings = list( - "You feel soothingly warm.", - "You feel the heat sink into your bones.", - "You feel warm enough to take a nap." - ) - - cold_discomfort_level = 292 - cold_discomfort_strings = list( - "You feel chilly.", - "You feel sluggish and cold.", - "Your scales bristle against the cold." - ) - breathing_sound = 'mods/species/bayliens/unathi/sound/lizard_breathing.ogg' appearance_descriptors = list( diff --git a/mods/species/bayliens/unathi/datum/species_bodytypes.dm b/mods/species/bayliens/unathi/datum/species_bodytypes.dm index ed5bef9bacc..7b2af8f5de2 100644 --- a/mods/species/bayliens/unathi/datum/species_bodytypes.dm +++ b/mods/species/bayliens/unathi/datum/species_bodytypes.dm @@ -27,6 +27,28 @@ default_h_style = /decl/sprite_accessory/hair/lizard/frills_long + cold_level_1 = 280 //Default 260 - Lower is better + cold_level_2 = 220 //Default 200 + cold_level_3 = 130 //Default 120 + + heat_level_1 = 420 //Default 360 - Higher is better + heat_level_2 = 480 //Default 400 + heat_level_3 = 1100 //Default 1000 + + heat_discomfort_level = 320 + heat_discomfort_strings = list( + "You feel soothingly warm.", + "You feel the heat sink into your bones.", + "You feel warm enough to take a nap." + ) + + cold_discomfort_level = 292 + cold_discomfort_strings = list( + "You feel chilly.", + "You feel sluggish and cold.", + "Your scales bristle against the cold." + ) + /decl/bodytype/lizard/masculine name = "masculine" icon_base = 'mods/species/bayliens/unathi/icons/body_male.dmi' @@ -35,5 +57,5 @@ uniform_state_modifier = null /obj/item/organ/external/tail/lizard - tail_animation = 'mods/species/bayliens/unathi/icons/tail.dmi' - tail = "sogtail" + tail_icon = 'mods/species/bayliens/unathi/icons/tail.dmi' + tail = "sogtail" diff --git a/mods/species/bayliens/unathi/datum/sprite_accessory.dm b/mods/species/bayliens/unathi/datum/sprite_accessory.dm index 4c90af7d4f8..f8a71288a66 100644 --- a/mods/species/bayliens/unathi/datum/sprite_accessory.dm +++ b/mods/species/bayliens/unathi/datum/sprite_accessory.dm @@ -3,7 +3,7 @@ icon = 'mods/species/bayliens/unathi/icons/hair.dmi' icon_state = "horns" species_allowed = list(SPECIES_LIZARD) - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY flags = VERY_SHORT uid = "acc_hair_una_horns" @@ -90,10 +90,10 @@ // FACIAL /decl/sprite_accessory/facial_hair/lizard name = "Lizard Horn Chin" - icon = 'mods/species/bayliens/unathi/icons/facial_hair.dmi' + icon = 'mods/species/bayliens/unathi/icons/facial.dmi' icon_state = "facial_chinhorns" species_allowed = list(SPECIES_LIZARD) - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_fhair_una_chinhorns" /decl/sprite_accessory/facial_hair/lizard/hornadorns diff --git a/mods/species/bayliens/unathi/icons/facial_hair.dmi b/mods/species/bayliens/unathi/icons/facial.dmi similarity index 62% rename from mods/species/bayliens/unathi/icons/facial_hair.dmi rename to mods/species/bayliens/unathi/icons/facial.dmi index b992eb874f3..11ac6ca7926 100644 Binary files a/mods/species/bayliens/unathi/icons/facial_hair.dmi and b/mods/species/bayliens/unathi/icons/facial.dmi differ diff --git a/mods/species/bayliens/unathi/icons/hair.dmi b/mods/species/bayliens/unathi/icons/hair.dmi index 6eac2a1c305..5422f582410 100644 Binary files a/mods/species/bayliens/unathi/icons/hair.dmi and b/mods/species/bayliens/unathi/icons/hair.dmi differ diff --git a/mods/species/bayliens/unathi/icons/tail.dmi b/mods/species/bayliens/unathi/icons/tail.dmi index 1f0b43285db..1b9f3c1599a 100644 Binary files a/mods/species/bayliens/unathi/icons/tail.dmi and b/mods/species/bayliens/unathi/icons/tail.dmi differ diff --git a/mods/species/bayliens/unathi/organs/organs_internal.dm b/mods/species/bayliens/unathi/organs/organs_internal.dm index 739fff2d887..1edd08ffc19 100644 --- a/mods/species/bayliens/unathi/organs/organs_internal.dm +++ b/mods/species/bayliens/unathi/organs/organs_internal.dm @@ -4,4 +4,4 @@ icon = 'mods/species/bayliens/unathi/icons/organs.dmi' /obj/item/organ/internal/brain/lizard - can_use_mmi = FALSE + can_use_brain_interface = FALSE diff --git a/mods/species/neoavians/datum/accessory.dm b/mods/species/neoavians/datum/accessory.dm index 7ae58e8078d..1ee748abae7 100644 --- a/mods/species/neoavians/datum/accessory.dm +++ b/mods/species/neoavians/datum/accessory.dm @@ -4,7 +4,7 @@ icon_state = "avian_default" icon = 'mods/species/neoavians/icons/hair.dmi' species_allowed = list(SPECIES_AVIAN) - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_hair_avian_plumage" /decl/sprite_accessory/hair/avian/mohawk @@ -45,7 +45,7 @@ /decl/sprite_accessory/hair/avian/alt name = "Avian Plumage Alt" icon_state = "avian_default_alt" - blend = ICON_ADD + color_blend = ICON_ADD uid = "acc_hair_avian_plumage_alt" /decl/sprite_accessory/hair/avian/alt/ears @@ -120,7 +120,7 @@ body_parts = list(BP_HEAD) icon = 'mods/species/neoavians/icons/markings.dmi' species_allowed = list(SPECIES_AVIAN) - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_marking_avian_beak" /decl/sprite_accessory/marking/avian/avian @@ -142,23 +142,23 @@ /decl/sprite_accessory/marking/avian/additive name = "Beak, Additive (Head)" icon_state = "beak-add" - blend = ICON_ADD + color_blend = ICON_ADD uid = "acc_marking_avian_beak_alt" /decl/sprite_accessory/marking/avian/resomi name = "Raptor Ears, Additive (Head)" icon_state = "ears-add" - blend = ICON_ADD + color_blend = ICON_ADD uid = "acc_marking_avian_raptorears_alt" /decl/sprite_accessory/marking/avian/wing_feathers/additive name = "Wing Feathers, Additive (Left)" icon_state = "wing_feathers-add" - blend = ICON_ADD + color_blend = ICON_ADD uid = "acc_marking_avian_wingfeathers_left_alt" /decl/sprite_accessory/marking/avian/wing_feathers/right/additive name = "Wing Feathers, Additive (Right)" icon_state = "wing_feathers-add" - blend = ICON_ADD + color_blend = ICON_ADD uid = "acc_marking_avian_wingfeathers_right_alt" diff --git a/mods/species/neoavians/datum/loadout.dm b/mods/species/neoavians/datum/loadout.dm index 6dc0064b31d..94a95479370 100644 --- a/mods/species/neoavians/datum/loadout.dm +++ b/mods/species/neoavians/datum/loadout.dm @@ -28,5 +28,5 @@ /decl/loadout_option/avian/shoes name = "footwraps" path = /obj/item/clothing/shoes/avian/footwraps - flags = GEAR_HAS_COLOR_SELECTION + loadout_flags = GEAR_HAS_COLOR_SELECTION slot = slot_shoes_str \ No newline at end of file diff --git a/mods/species/neoavians/datum/species.dm b/mods/species/neoavians/datum/species.dm index f16bf503d47..da30605c503 100644 --- a/mods/species/neoavians/datum/species.dm +++ b/mods/species/neoavians/datum/species.dm @@ -46,11 +46,6 @@ swap_flags = MONKEY|SIMPLE_ANIMAL push_flags = MONKEY|SIMPLE_ANIMAL - heat_discomfort_strings = list( - "Your feathers prickle in the heat.", - "You feel uncomfortably warm.", - ) - unarmed_attacks = list( /decl/natural_attack/bite/sharp, /decl/natural_attack/claws, @@ -71,7 +66,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/avian, slot_shoes_str) /decl/species/neoavian/get_holder_color(var/mob/living/carbon/human/H) - return H.skin_colour + return H.get_skin_colour() /decl/hierarchy/outfit/job/generic/assistant/avian name = "Job - Avian Assistant" diff --git a/mods/species/neoavians/datum/species_bodytypes.dm b/mods/species/neoavians/datum/species_bodytypes.dm index 3ce77c99416..112dcd1517e 100644 --- a/mods/species/neoavians/datum/species_bodytypes.dm +++ b/mods/species/neoavians/datum/species_bodytypes.dm @@ -1,27 +1,32 @@ /decl/bodytype/avian - name = "avian" - bodytype_category = BODYTYPE_AVIAN - icon_base = 'mods/species/neoavians/icons/body.dmi' - blood_overlays = 'mods/species/neoavians/icons/blood_avian.dmi' - limb_blend = ICON_MULTIPLY - bodytype_flag = BODY_FLAG_AVIAN - eye_icon = 'mods/species/neoavians/icons/eyes.dmi' - appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR - base_color = "#252525" - base_eye_color = "#f5c842" - mob_size = MOB_SIZE_SMALL - has_organ = list( - BP_STOMACH = /obj/item/organ/internal/stomach, - BP_HEART = /obj/item/organ/internal/heart, - BP_LUNGS = /obj/item/organ/internal/lungs, - BP_LIVER = /obj/item/organ/internal/liver, - BP_KIDNEYS = /obj/item/organ/internal/kidneys, - BP_BRAIN = /obj/item/organ/internal/brain, - BP_EYES = /obj/item/organ/internal/eyes + name = "avian" + bodytype_category = BODYTYPE_AVIAN + icon_base = 'mods/species/neoavians/icons/body.dmi' + blood_overlays = 'mods/species/neoavians/icons/blood_avian.dmi' + limb_blend = ICON_MULTIPLY + bodytype_flag = BODY_FLAG_AVIAN + eye_icon = 'mods/species/neoavians/icons/eyes.dmi' + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR + base_color = "#252525" + base_eye_color = "#f5c842" + mob_size = MOB_SIZE_SMALL + has_organ = list( + BP_STOMACH = /obj/item/organ/internal/stomach, + BP_HEART = /obj/item/organ/internal/heart, + BP_LUNGS = /obj/item/organ/internal/lungs, + BP_LIVER = /obj/item/organ/internal/liver, + BP_KIDNEYS = /obj/item/organ/internal/kidneys, + BP_BRAIN = /obj/item/organ/internal/brain, + BP_EYES = /obj/item/organ/internal/eyes + ) + override_limb_types = list(BP_TAIL = /obj/item/organ/external/tail/avian) + default_h_style = /decl/sprite_accessory/hair/avian + base_markings = list(/decl/sprite_accessory/marking/avian = "#454545") + + heat_discomfort_strings = list( + "Your feathers prickle in the heat.", + "You feel uncomfortably warm.", ) - override_limb_types = list(BP_TAIL = /obj/item/organ/external/tail/avian) - default_h_style = /decl/sprite_accessory/hair/avian - base_markings = list(/decl/sprite_accessory/marking/avian = "#454545") var/tail = "tail_avian" var/tail_icon = 'mods/species/neoavians/icons/tail.dmi' @@ -29,46 +34,45 @@ var/tail_hair var/tail_hair_blend var/tail_states - var/tail_animation /decl/bodytype/avian/raptor - name = "raptor" - icon_base = 'mods/species/neoavians/icons/body_raptor.dmi' - tail_icon = 'mods/species/neoavians/icons/tail.dmi' - tail = "tail_raptor" - tail_hair = "over" - tail_hair_blend = ICON_MULTIPLY + name = "raptor" + icon_base = 'mods/species/neoavians/icons/body_raptor.dmi' + tail_icon = 'mods/species/neoavians/icons/tail.dmi' + tail = "tail_raptor" + tail_hair = "over" + tail_hair_blend = ICON_MULTIPLY /decl/bodytype/avian/additive - name = "avian, additive" - icon_base = 'mods/species/neoavians/icons/body_add.dmi' + name = "avian, additive" + icon_base = 'mods/species/neoavians/icons/body_add.dmi' health_hud_intensity = 3 - limb_blend = ICON_ADD - tail_blend = ICON_ADD - tail = "tail_avian_add" + limb_blend = ICON_ADD + tail_blend = ICON_ADD + tail = "tail_avian_add" /decl/bodytype/avian/additive/raptor - name = "raptor, additive" - icon_base = 'mods/species/neoavians/icons/body_raptor_add.dmi' - tail = "tail_raptor_add" - tail_hair = "over" - tail_hair_blend = ICON_ADD + name = "raptor, additive" + icon_base = 'mods/species/neoavians/icons/body_raptor_add.dmi' + tail = "tail_raptor_add" + tail_hair = "over" + tail_hair_blend = ICON_ADD /decl/bodytype/avian/Initialize() equip_adjust = list( - slot_l_ear_str = list("[NORTH]" = list("x" = 1, "y" = -5), "[EAST]" = list("x" = -2, "y" = -5), "[SOUTH]" = list("x" = -1, "y" = -5), "[WEST]" = list("x" = 0, "y" = -5)), - slot_r_ear_str = list("[NORTH]" = list("x" = 1, "y" = -5), "[EAST]" = list("x" = 0, "y" = -5), "[SOUTH]" = list("x" = -1, "y" = -5), "[WEST]" = list("x" = 2, "y" = -5)), - BP_L_HAND = list("[NORTH]" = list("x" = 3, "y" = -3), "[EAST]" = list("x" = 1, "y" = -3), "[SOUTH]" = list("x" = -3, "y" = -3), "[WEST]" = list("x" = -5, "y" = -3)), - BP_R_HAND = list("[NORTH]" = list("x" = -3, "y" = -3), "[EAST]" = list("x" = 5, "y" = -3), "[SOUTH]" = list("x" = 3, "y" = -3), "[WEST]" = list("x" = -1, "y" = -3)), - slot_head_str = list("[NORTH]" = list("x" = 0, "y" = -5), "[EAST]" = list("x" = 1, "y" = -5), "[SOUTH]" = list("x" = 0, "y" = -5), "[WEST]" = list("x" = -1, "y" = -5)), - slot_wear_mask_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = 2, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = -2, "y" = -6)), - slot_glasses_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = 1, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = -1, "y" = -6)), - slot_back_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = 3, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = -3, "y" = -6)), - slot_w_uniform_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = -1, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = 1, "y" = -6)), - slot_tie_str = list("[NORTH]" = list("x" = 0, "y" = -5), "[EAST]" = list("x" = 0, "y" = -5), "[SOUTH]" = list("x" = 0, "y" = -5), "[WEST]" = list("x" = 0, "y" = -5)), - slot_wear_id_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = -1, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = 1, "y" = -6)), - slot_wear_suit_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = -1, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = 1, "y" = -6)), - slot_belt_str = list("[NORTH]" = list("x" = 0, "y" = -6), "[EAST]" = list("x" = -1, "y" = -6), "[SOUTH]" = list("x" = 0, "y" = -6), "[WEST]" = list("x" = 1, "y" = -6)) + slot_l_ear_str = list("[NORTH]" = list( 1, -5), "[EAST]" = list(-2, -5), "[SOUTH]" = list(-1, -5), "[WEST]" = list( 0, -5)), + slot_r_ear_str = list("[NORTH]" = list( 1, -5), "[EAST]" = list( 0, -5), "[SOUTH]" = list(-1, -5), "[WEST]" = list( 2, -5)), + BP_L_HAND = list("[NORTH]" = list( 3, -3), "[EAST]" = list( 1, -3), "[SOUTH]" = list(-3, -3), "[WEST]" = list(-5, -3)), + BP_R_HAND = list("[NORTH]" = list(-3, -3), "[EAST]" = list( 5, -3), "[SOUTH]" = list( 3, -3), "[WEST]" = list(-1, -3)), + slot_head_str = list("[NORTH]" = list( 0, -5), "[EAST]" = list( 1, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-1, -5)), + slot_wear_mask_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list( 2, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-2, -6)), + slot_glasses_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6)), + slot_back_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list( 3, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-3, -6)), + slot_w_uniform_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)), + slot_tie_str = list("[NORTH]" = list( 0, -5), "[EAST]" = list( 0, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list( 0, -5)), + slot_wear_id_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)), + slot_wear_suit_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)), + slot_belt_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)) ) . = ..() @@ -77,11 +81,6 @@ var/decl/bodytype/avian/bird_bod = bodytype return bird_bod.tail -/obj/item/organ/external/tail/avian/get_tail_animation() - if(istype(bodytype, /decl/bodytype/avian)) - var/decl/bodytype/avian/bird_bod = bodytype - return bird_bod.tail_animation - /obj/item/organ/external/tail/avian/get_tail_icon() if(istype(bodytype, /decl/bodytype/avian)) var/decl/bodytype/avian/bird_bod = bodytype diff --git a/mods/species/neoavians/icons/body.dmi b/mods/species/neoavians/icons/body.dmi index 5e9915ed184..08aaac908d8 100644 Binary files a/mods/species/neoavians/icons/body.dmi and b/mods/species/neoavians/icons/body.dmi differ diff --git a/mods/species/neoavians/icons/body_raptor.dmi b/mods/species/neoavians/icons/body_raptor.dmi index fd339fb8f3b..84035d0b3e3 100644 Binary files a/mods/species/neoavians/icons/body_raptor.dmi and b/mods/species/neoavians/icons/body_raptor.dmi differ diff --git a/mods/species/neoavians/icons/hair.dmi b/mods/species/neoavians/icons/hair.dmi index 0e9d333d6c8..df5a5f7010a 100644 Binary files a/mods/species/neoavians/icons/hair.dmi and b/mods/species/neoavians/icons/hair.dmi differ diff --git a/mods/species/neoavians/icons/markings.dmi b/mods/species/neoavians/icons/markings.dmi index 68489bb750f..1615c45bf74 100644 Binary files a/mods/species/neoavians/icons/markings.dmi and b/mods/species/neoavians/icons/markings.dmi differ diff --git a/mods/species/neoavians/icons/tail.dmi b/mods/species/neoavians/icons/tail.dmi index ffe826ed6b5..1edfc99e00a 100644 Binary files a/mods/species/neoavians/icons/tail.dmi and b/mods/species/neoavians/icons/tail.dmi differ diff --git a/mods/species/neoavians/machinery/suit_cycler.dm b/mods/species/neoavians/machinery/suit_cycler.dm index a213885dc5f..64d3e9951ba 100644 --- a/mods/species/neoavians/machinery/suit_cycler.dm +++ b/mods/species/neoavians/machinery/suit_cycler.dm @@ -1,6 +1,6 @@ /obj/machinery/suit_cycler/Initialize() + LAZYDISTINCTADD(available_bodytypes, BODYTYPE_AVIAN) . = ..() - available_bodytypes += BODYTYPE_AVIAN //mining diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index d92dd8d2e47..75f206b6f3f 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -23,7 +23,7 @@ hidden_from_codex = TRUE silent_steps = TRUE age_descriptor = /datum/appearance_descriptor/age/serpentid - skin_material = /decl/material/solid/skin/insect + skin_material = /decl/material/solid/organic/skin/insect bone_material = null speech_sounds = list('sound/voice/bug.ogg') speech_chance = 2 @@ -55,9 +55,6 @@ strength = STR_HIGH breath_pressure = 25 blood_volume = 840 - heat_level_1 = 410 //Default 360 - Higher is better - heat_level_2 = 440 //Default 400 - heat_level_3 = 800 //Default 1000 species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_BLOCK | SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NEED_DIRECT_ABSORB spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED bump_flag = HEAVY diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm index b40a1fdd08e..749fcf18bd5 100644 --- a/mods/species/serpentid/datum/species_bodytypes.dm +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -48,17 +48,20 @@ BP_R_HAND = list(BP_R_HAND, BP_R_HAND_UPPER) ) breathing_organ = BP_TRACH + heat_level_1 = 410 //Default 360 - Higher is better + heat_level_2 = 440 //Default 400 + heat_level_3 = 800 //Default 1000 /decl/bodytype/serpentid/Initialize() equip_adjust = list( - BP_L_HAND_UPPER = list("[NORTH]" = list("x" = 0, "y" = 8), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = -0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - BP_R_HAND_UPPER = list("[NORTH]" = list("x" = 0, "y" = 8), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - BP_L_HAND = list("[NORTH]" = list("x" = 4, "y" = 0), "[EAST]" = list("x" = 0, "y" = 0), "[SOUTH]" = list("x" = -4, "y" = 0), "[WEST]" = list("x" = 0, "y" = 0)), - BP_R_HAND = list("[NORTH]" = list("x" = -4, "y" = 0), "[EAST]" = list("x" = 0, "y" = 0), "[SOUTH]" = list("x" = 4, "y" = 0), "[WEST]" = list("x" = 0, "y" = 0)), - slot_head_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - slot_back_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - slot_belt_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = 8, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = -8, "y" = 0)), - slot_glasses_str = list("[NORTH]" = list("x" = 0, "y" = 10), "[EAST]" = list("x" = 0, "y" = 11), "[SOUTH]" = list("x" = 0, "y" = 11), "[WEST]" = list("x" = 0, "y" = 11)) + BP_L_HAND_UPPER = list("[NORTH]" = list( 0, 8), "[EAST]" = list(0, 8), "[SOUTH]" = list(-0, 8), "[WEST]" = list( 0, 8)), + BP_R_HAND_UPPER = list("[NORTH]" = list( 0, 8), "[EAST]" = list(0, 8), "[SOUTH]" = list( 0, 8), "[WEST]" = list( 0, 8)), + BP_L_HAND = list("[NORTH]" = list( 4, 0), "[EAST]" = list(0, 0), "[SOUTH]" = list(-4, 0), "[WEST]" = list( 0, 0)), + BP_R_HAND = list("[NORTH]" = list(-4, 0), "[EAST]" = list(0, 0), "[SOUTH]" = list( 4, 0), "[WEST]" = list( 0, 0)), + slot_head_str = list("[NORTH]" = list( 0, 7), "[EAST]" = list(0, 8), "[SOUTH]" = list( 0, 8), "[WEST]" = list( 0, 8)), + slot_back_str = list("[NORTH]" = list( 0, 7), "[EAST]" = list(0, 8), "[SOUTH]" = list( 0, 8), "[WEST]" = list( 0, 8)), + slot_belt_str = list("[NORTH]" = list( 0, 0), "[EAST]" = list(8, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-8, 0)), + slot_glasses_str = list("[NORTH]" = list( 0, 10), "[EAST]" = list(0, 11), "[SOUTH]" = list( 0, 11), "[WEST]" = list( 0, 11)) ) . = ..() diff --git a/mods/species/serpentid/mobs/bodyparts_serpentid.dm b/mods/species/serpentid/mobs/bodyparts_serpentid.dm index f75c02d8631..26b976e41ab 100644 --- a/mods/species/serpentid/mobs/bodyparts_serpentid.dm +++ b/mods/species/serpentid/mobs/bodyparts_serpentid.dm @@ -7,16 +7,6 @@ /obj/item/organ/internal/eyes/insectoid/serpentid/get_innate_flash_protection() return override_flash_protection -/obj/item/organ/internal/eyes/insectoid/serpentid/get_special_overlay() - var/icon/I = get_onhead_icon() - if(I) - var/image/eye_overlay = image(I) - if(owner && owner.is_cloaked()) - eye_overlay.alpha = 100 - if(eyes_shielded) - eye_overlay.color = "#aaaaaa" - return eye_overlay - /obj/item/organ/internal/eyes/insectoid/serpentid/additional_flash_effects(var/intensity) if(!eyes_shielded) take_internal_damage(max(0, 4 * (intensity))) @@ -28,7 +18,7 @@ . = ..() if(.) action.button_icon_state = "serpentid-shield-[eyes_shielded ? 1 : 0]" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/internal/eyes/insectoid/serpentid/attack_self(var/mob/user) . = ..() @@ -42,7 +32,7 @@ else to_chat(owner, "Your protective lenses retract out of the way.") override_flash_protection = FLASH_PROTECTION_VULNERABLE - addtimer(CALLBACK(src, .proc/remove_shield), 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(remove_shield)), 1 SECONDS) owner.update_icon() refresh_action_button() @@ -136,7 +126,7 @@ . = ..() if(.) action.button_icon_state = "serpentid-threat" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/external/chest/insectoid/serpentid/attack_self(var/mob/user) . = ..() @@ -158,18 +148,26 @@ playsound(owner.loc, 'sound/effects/angrybug.ogg', 60, 0) owner.skin_state = SKIN_THREAT owner.update_skin() - addtimer(CALLBACK(owner, /mob/living/carbon/human/proc/reset_skin), 10 SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon/human, reset_skin)), 10 SECONDS, TIMER_UNIQUE) else if(owner.skin_state == SKIN_THREAT) owner.reset_skin() /obj/item/organ/external/head/insectoid/serpentid name = "head" -/obj/item/organ/external/head/insectoid/serpentid/get_eye_overlay() - // todo: maybe this should use its own bodytype instead of mob root bodytype? - var/obj/item/organ/internal/eyes/eyes = owner.get_organ((owner.get_bodytype().vision_organ || BP_EYES), /obj/item/organ/internal/eyes) - if(eyes) - return eyes.get_special_overlay() +/obj/item/organ/external/head/insectoid/serpentid/get_organ_eyes_overlay() + var/obj/item/organ/internal/eyes/eyes = get_eyes_organ() + var/icon/eyes_icon = eyes?.get_onhead_icon() + if(!eyes_icon) + return + var/image/eye_overlay = image(eyes_icon) + if(owner && owner.is_cloaked()) + eye_overlay.alpha = 100 + if(istype(eyes, /obj/item/organ/internal/eyes/insectoid/serpentid)) + var/obj/item/organ/internal/eyes/insectoid/serpentid/snake_eyes = eyes + if(snake_eyes.eyes_shielded) + eye_overlay.color = "#aaaaaa" + return eye_overlay /obj/item/organ/external/groin/insectoid/serpentid name = "abdomen" @@ -182,7 +180,7 @@ . = ..() if(.) action.button_icon_state = "serpentid-cloak-[owner && owner.is_cloaked_by(species) ? 1 : 0]" - if(action.button) action.button.UpdateIcon() + action.button?.update_icon() /obj/item/organ/external/groin/insectoid/serpentid/attack_self(var/mob/user) . = ..() diff --git a/mods/species/utility_frames/_utility_frames.dme b/mods/species/utility_frames/_utility_frames.dme index 776d098bb5d..728a6e05d86 100644 --- a/mods/species/utility_frames/_utility_frames.dme +++ b/mods/species/utility_frames/_utility_frames.dme @@ -1,5 +1,6 @@ #ifndef MODPACK_UTILITY_FRAMES #define MODPACK_UTILITY_FRAMES +#include "../../content/shackles/_shackles.dme" #include "_utility_frames.dm" #include "species.dm" #include "species_bodytypes.dm" diff --git a/mods/species/utility_frames/markings.dm b/mods/species/utility_frames/markings.dm index 24b8a68b72d..ade0c186443 100644 --- a/mods/species/utility_frames/markings.dm +++ b/mods/species/utility_frames/markings.dm @@ -4,7 +4,7 @@ body_parts = list(BP_CHEST) species_allowed = list(SPECIES_FRAME) icon = 'mods/species/utility_frames/icons/markings.dmi' - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_marking_frame_stripe" /decl/sprite_accessory/marking/frame/head_stripe diff --git a/mods/species/utility_frames/species.dm b/mods/species/utility_frames/species.dm index 2d988a94fc4..5e3f44eacf4 100644 --- a/mods/species/utility_frames/species.dm +++ b/mods/species/utility_frames/species.dm @@ -15,7 +15,6 @@ description = "Simple AI-driven robots are used for many menial or repetitive tasks in human space." cyborg_noun = null base_prosthetics_model = null - blood_types = list(/decl/blood_type/coolant) available_bodytypes = list(/decl/bodytype/prosthetic/utility_frame) @@ -27,22 +26,12 @@ warning_low_pressure = 50 hazard_low_pressure = -1 flesh_color = COLOR_GUNMETAL - cold_level_1 = SYNTH_COLD_LEVEL_1 - cold_level_2 = SYNTH_COLD_LEVEL_2 - cold_level_3 = SYNTH_COLD_LEVEL_3 - heat_level_1 = SYNTH_HEAT_LEVEL_1 - heat_level_2 = SYNTH_HEAT_LEVEL_2 - heat_level_3 = SYNTH_HEAT_LEVEL_3 body_temperature = null passive_temp_gain = 5 // stabilize at ~80 C in a 20 C environment. - heat_discomfort_level = 373.15 blood_volume = 0 preview_outfit = null - heat_discomfort_strings = list( - "You are dangerously close to overheating!" - ) unarmed_attacks = list( /decl/natural_attack/stomp, /decl/natural_attack/kick, diff --git a/mods/species/utility_frames/species_bodytypes.dm b/mods/species/utility_frames/species_bodytypes.dm index 64c14b4ef75..c5dc14b5025 100644 --- a/mods/species/utility_frames/species_bodytypes.dm +++ b/mods/species/utility_frames/species_bodytypes.dm @@ -12,14 +12,14 @@ base_eye_color = "#00ccff" material = /decl/material/solid/metal/steel vital_organs = list( - BP_POSIBRAIN, + BP_BRAIN, BP_CELL ) override_limb_types = list(BP_HEAD = /obj/item/organ/external/head/utility_frame) has_organ = list( - BP_POSIBRAIN = /obj/item/organ/internal/posibrain, - BP_EYES = /obj/item/organ/internal/eyes, - BP_CELL = /obj/item/organ/internal/cell + BP_BRAIN = /obj/item/organ/internal/brain/robotic, + BP_EYES = /obj/item/organ/internal/eyes, + BP_CELL = /obj/item/organ/internal/cell ) base_markings = list( /decl/sprite_accessory/marking/frame/plating = "#8888cc", @@ -30,16 +30,16 @@ /decl/bodytype/prosthetic/utility_frame/Initialize() equip_adjust = list( "[slot_l_ear_str]" = list( - "[NORTH]" = list("x" = 2, "y" = 0), - "[EAST]" = list("x" = 0, "y" = 0), - "[SOUTH]" = list("x" = -2, "y" = 0), - "[WEST]" = list("x" = 0, "y" = 0) + "[NORTH]" = list( 2, 0), + "[EAST]" = list( 0, 0), + "[SOUTH]" = list(-2, 0), + "[WEST]" = list( 0, 0) ), "[slot_r_ear_str]" = list( - "[NORTH]" = list("x" = -2, "y" = 0), - "[EAST]" = list("x" = 0, "y" = 0), - "[SOUTH]" = list("x" = 2, "y" = 0), - "[WEST]" = list("x" = 0, "y" = 0) + "[NORTH]" = list(-2, 0), + "[EAST]" = list( 0, 0), + "[SOUTH]" = list( 2, 0), + "[WEST]" = list( 0, 0) ) ) . = ..() diff --git a/mods/species/vox/_vox.dm b/mods/species/vox/_vox.dm index 00a0d93c378..9562251d79d 100644 --- a/mods/species/vox/_vox.dm +++ b/mods/species/vox/_vox.dm @@ -10,10 +10,11 @@ credits_crew_names = list("THE VOX") credits_topics = list("VOX RITUAL DUELS", "NECK MARKINGS", "ANCIENT SUPERCOMPUTERS") -/mob/living/carbon/human/vox/Initialize(mapload, new_species) - h_style = /decl/sprite_accessory/hair/vox/short - hair_colour = COLOR_BEASTY_BROWN - . = ..(mapload, SPECIES_VOX) +/mob/living/carbon/human/vox/Initialize(mapload, species_name, datum/dna/new_dna, decl/bodytype/new_bodytype) + set_hairstyle(/decl/sprite_accessory/hair/vox/short, skip_update = TRUE) + set_hair_colour(COLOR_BEASTY_BROWN, skip_update = TRUE) + species_name = SPECIES_VOX + . = ..() /datum/follow_holder/voxstack sort_order = 14 diff --git a/mods/species/vox/datum/accessories.dm b/mods/species/vox/datum/accessories.dm index b8fb567bbf6..5213b4d8612 100644 --- a/mods/species/vox/datum/accessories.dm +++ b/mods/species/vox/datum/accessories.dm @@ -70,7 +70,7 @@ body_flags_allowed = BODY_FLAG_VOX bodytype_categories_allowed = list(BODYTYPE_VOX) icon = 'mods/species/vox/icons/body/soldier/markings.dmi' - blend = ICON_MULTIPLY + color_blend = ICON_MULTIPLY uid = "acc_markings_vox_neck" /decl/sprite_accessory/marking/vox/claws diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm index 72ac21f2723..cc21ad6ea57 100644 --- a/mods/species/vox/datum/antagonism.dm +++ b/mods/species/vox/datum/antagonism.dm @@ -17,7 +17,7 @@ hands = list(/obj/item/gun/launcher/alien/spikethrower) id_type = /obj/item/card/id/syndicate -/decl/hierarchy/outfit/vox_raider/equip(mob/living/carbon/human/H, rank, assignment, equip_adjustments) +/decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) uniform = pick(/obj/item/clothing/under/vox/vox_robes, /obj/item/clothing/under/vox/vox_casual) glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) holster = pick(/obj/item/clothing/accessory/storage/holster/armpit, /obj/item/clothing/accessory/storage/holster/waist, /obj/item/clothing/accessory/storage/holster/hip) @@ -39,17 +39,17 @@ if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || user.species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) return ..() - var/choice = input("Do you wish to become a Vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") + var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") if(choice != "Yes") return ..() var/decl/hierarchy/outfit/outfit = GET_DECL(/decl/hierarchy/outfit/vox_raider) var/mob/living/carbon/human/vox/vox = new(get_turf(src), SPECIES_VOX) - outfit.equip(vox) + outfit.equip_outfit(vox) if(user.mind) user.mind.transfer_to(vox) qdel(user) - addtimer(CALLBACK(src, .proc/do_post_voxifying, vox), 1) + addtimer(CALLBACK(src, PROC_REF(do_post_voxifying), vox), 1) /obj/structure/mirror/raider/proc/do_post_voxifying(var/mob/living/carbon/human/vox) var/newname = sanitize_safe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) diff --git a/mods/species/vox/datum/species.dm b/mods/species/vox/datum/species.dm index ffc0cac1066..b8bd96cd14e 100644 --- a/mods/species/vox/datum/species.dm +++ b/mods/species/vox/datum/species.dm @@ -62,10 +62,6 @@ warning_low_pressure = 50 hazard_low_pressure = 0 - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = -1 - age_descriptor = /datum/appearance_descriptor/age/vox preview_outfit = /decl/hierarchy/outfit/vox_raider diff --git a/mods/species/vox/datum/species_bodytypes.dm b/mods/species/vox/datum/species_bodytypes.dm index 8852245711b..ae83e547319 100644 --- a/mods/species/vox/datum/species_bodytypes.dm +++ b/mods/species/vox/datum/species_bodytypes.dm @@ -1,123 +1,120 @@ /decl/bodytype/vox - name = "soldier voxform" + name = "soldier voxform" bodytype_category = BODYTYPE_VOX - icon_base = 'mods/species/vox/icons/body/soldier/body.dmi' - icon_deformed = 'mods/species/vox/icons/body/deformed_body.dmi' - husk_icon = 'mods/species/vox/icons/body/husk.dmi' - blood_overlays = 'mods/species/vox/icons/body/blood_overlays.dmi' - eye_icon = 'mods/species/vox/icons/body/soldier/eyes.dmi' - bodytype_flag = BODY_FLAG_VOX - limb_blend = ICON_MULTIPLY - eye_blend = ICON_MULTIPLY - appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR - base_hair_color = "#160900" - base_eye_color = "#d60093" - base_color = "#526d29" - body_flags = BODY_FLAG_NO_DNA - default_h_style = /decl/sprite_accessory/hair/vox/short + icon_base = 'mods/species/vox/icons/body/soldier/body.dmi' + icon_deformed = 'mods/species/vox/icons/body/deformed_body.dmi' + husk_icon = 'mods/species/vox/icons/body/husk.dmi' + blood_overlays = 'mods/species/vox/icons/body/blood_overlays.dmi' + eye_icon = 'mods/species/vox/icons/body/soldier/eyes.dmi' + bodytype_flag = BODY_FLAG_VOX + limb_blend = ICON_MULTIPLY + eye_blend = ICON_MULTIPLY + appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR + base_hair_color = "#160900" + base_eye_color = "#d60093" + base_color = "#526d29" + body_flags = BODY_FLAG_NO_DNA + default_h_style = /decl/sprite_accessory/hair/vox/short + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = -1 vital_organs = list( BP_STACK, BP_BRAIN ) - override_limb_types = list( BP_GROIN = /obj/item/organ/external/groin/vox, BP_TAIL = /obj/item/organ/external/tail/vox ) - has_organ = list( - BP_STOMACH = /obj/item/organ/internal/stomach/vox, - BP_HEART = /obj/item/organ/internal/heart/vox, - BP_LUNGS = /obj/item/organ/internal/lungs/vox, - BP_LIVER = /obj/item/organ/internal/liver/vox, - BP_KIDNEYS = /obj/item/organ/internal/kidneys/vox, - BP_BRAIN = /obj/item/organ/internal/brain, - BP_EYES = /obj/item/organ/internal/eyes/vox, - BP_STACK = /obj/item/organ/internal/voxstack, + BP_STOMACH = /obj/item/organ/internal/stomach/vox, + BP_HEART = /obj/item/organ/internal/heart/vox, + BP_LUNGS = /obj/item/organ/internal/lungs/vox, + BP_LIVER = /obj/item/organ/internal/liver/vox, + BP_KIDNEYS = /obj/item/organ/internal/kidneys/vox, + BP_BRAIN = /obj/item/organ/internal/brain, + BP_EYES = /obj/item/organ/internal/eyes/vox, + BP_STACK = /obj/item/organ/internal/voxstack, BP_HINDTONGUE = /obj/item/organ/internal/hindtongue ) - base_markings = list( - /decl/sprite_accessory/marking/vox/beak = "#bc7d3e", + /decl/sprite_accessory/marking/vox/beak = "#bc7d3e", /decl/sprite_accessory/marking/vox/scutes = "#bc7d3e", - /decl/sprite_accessory/marking/vox/crest = "#bc7d3e", - /decl/sprite_accessory/marking/vox/claws = "#a0a654" + /decl/sprite_accessory/marking/vox/crest = "#bc7d3e", + /decl/sprite_accessory/marking/vox/claws = "#a0a654" ) /decl/bodytype/vox/Initialize() - if(!equip_adjust) + if(!length(equip_adjust)) equip_adjust = list( - BP_L_HAND = list("[NORTH]" = list("x" = 0, "y" = -2), "[EAST]" = list("x" = 0, "y" = -2), "[SOUTH]" = list("x" = 0, "y" = -2), "[WEST]" = list("x" = 0, "y" = -2)), - BP_R_HAND = list("[NORTH]" = list("x" = 0, "y" = -2), "[EAST]" = list("x" = 0, "y" = -2), "[SOUTH]" = list("x" = 0, "y" = -2), "[WEST]" = list("x" = 0, "y" = -2)), - slot_head_str = list("[NORTH]" = list("x" = 0, "y" = -2), "[EAST]" = list("x" = 3, "y" = -2), "[SOUTH]" = list("x" = 0, "y" = -2), "[WEST]" = list("x" = -3, "y" = -2)), - slot_wear_mask_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = 4, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = -4, "y" = 0)), - slot_wear_suit_str = list("[NORTH]" = list("x" = 0, "y" = -1), "[EAST]" = list("x" = 0, "y" = -1), "[SOUTH]" = list("x" = 0, "y" = -1), "[WEST]" = list("x" = 0, "y" = -1)), - slot_w_uniform_str = list("[NORTH]" = list("x" = 0, "y" = -1), "[EAST]" = list("x" = 0, "y" = -1), "[SOUTH]" = list("x" = 0, "y" = -1), "[WEST]" = list("x" = 0, "y" = -1)), - slot_underpants_str = list("[NORTH]" = list("x" = 0, "y" = -1), "[EAST]" = list("x" = 0, "y" = -1), "[SOUTH]" = list("x" = 0, "y" = -1), "[WEST]" = list("x" = 0, "y" = -1)), - slot_undershirt_str = list("[NORTH]" = list("x" = 0, "y" = -1), "[EAST]" = list("x" = 0, "y" = -1), "[SOUTH]" = list("x" = 0, "y" = -1), "[WEST]" = list("x" = 0, "y" = -1)), - slot_back_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = 3, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = -3, "y" = 0)) + BP_L_HAND = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), + BP_R_HAND = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), + slot_head_str = list("[NORTH]" = list(0, -2), "[EAST]" = list(3, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list(-3, -2)), + slot_wear_mask_str = list("[NORTH]" = list(0, 0), "[EAST]" = list(4, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-4, 0)), + slot_wear_suit_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + slot_w_uniform_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + slot_underpants_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + slot_undershirt_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + slot_back_str = list("[NORTH]" = list(0, 0), "[EAST]" = list(3, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-3, 0)) ) return ..() /decl/bodytype/vox/servitor - name = "servitor voxform" - bodytype_category = BODYTYPE_HUMANOID - icon_base = 'mods/species/vox/icons/body/servitor/body.dmi' - icon_deformed = 'mods/species/vox/icons/body/deformed_body.dmi' - husk_icon = 'mods/species/vox/icons/body/husk.dmi' - blood_overlays = 'mods/species/vox/icons/body/blood_overlays.dmi' - eye_icon = 'mods/species/vox/icons/body/servitor/eyes.dmi' - base_markings = list( + name = "servitor voxform" + bodytype_category = BODYTYPE_HUMANOID + icon_base = 'mods/species/vox/icons/body/servitor/body.dmi' + icon_deformed = 'mods/species/vox/icons/body/deformed_body.dmi' + husk_icon = 'mods/species/vox/icons/body/husk.dmi' + blood_overlays = 'mods/species/vox/icons/body/blood_overlays.dmi' + eye_icon = 'mods/species/vox/icons/body/servitor/eyes.dmi' + base_markings = list( /decl/sprite_accessory/marking/vox/beak/servitor = "#bc7d3e", /decl/sprite_accessory/marking/vox/scutes/servitor = "#bc7d3e", /decl/sprite_accessory/marking/vox/crest/servitor = "#bc7d3e", /decl/sprite_accessory/marking/vox/claws/servitor = "#a0a654" ) - default_h_style = /decl/sprite_accessory/hair/vox/short/servitor + default_h_style = /decl/sprite_accessory/hair/vox/short/servitor override_limb_types = list( BP_GROIN = /obj/item/organ/external/groin/vox, BP_TAIL = /obj/item/organ/external/tail/vox/servitor ) /decl/bodytype/vox/stanchion - name = "stanchion voxform" - blood_overlays = 'mods/species/vox/icons/body/stanchion/blood_overlays.dmi' - damage_overlays = 'mods/species/vox/icons/body/stanchion/damage_overlays.dmi' - icon_base = 'mods/species/vox/icons/body/stanchion/body.dmi' - eye_icon = 'mods/species/vox/icons/body/stanchion/eyes.dmi' - icon_template = 'mods/species/vox/icons/body/stanchion/template.dmi' - base_markings = list( + name = "stanchion voxform" + bodytype_category = BODYTYPE_VOX_LARGE + blood_overlays = 'mods/species/vox/icons/body/stanchion/blood_overlays.dmi' + damage_overlays = 'mods/species/vox/icons/body/stanchion/damage_overlays.dmi' + icon_base = 'mods/species/vox/icons/body/stanchion/body.dmi' + eye_icon = 'mods/species/vox/icons/body/stanchion/eyes.dmi' + icon_template = 'mods/species/vox/icons/body/stanchion/template.dmi' + base_markings = list( /decl/sprite_accessory/marking/vox/beak/stanchion = "#bc7d3e", /decl/sprite_accessory/marking/vox/scutes/stanchion = "#bc7d3e", /decl/sprite_accessory/marking/vox/crest/stanchion = "#bc7d3e", /decl/sprite_accessory/marking/vox/claws/stanchion = "#a0a654" ) - default_h_style = /decl/sprite_accessory/hair/vox/short/stanchion + default_h_style = /decl/sprite_accessory/hair/vox/short/stanchion override_limb_types = list( BP_GROIN = /obj/item/organ/external/groin/vox, - BP_TAIL = /obj/item/organ/external/tail/vox/stanchion + // Commenting this out so that tail validation doesn't try to find a species using this bodytype. + //BP_TAIL = /obj/item/organ/external/tail/vox/stanchion ) - bodytype_category = BODYTYPE_VOX_LARGE /decl/bodytype/vox/servitor/alchemist - name = "alchemist voxform" - icon_base = 'mods/species/vox/icons/body/servitor/body_alchemist.dmi' - eye_icon = 'mods/species/vox/icons/body/servitor/eyes_alchemist.dmi' - -/decl/bodytype/vox/servitor/Initialize() - if(!equip_adjust) - equip_adjust = list() - return ..() + name = "alchemist voxform" + icon_base = 'mods/species/vox/icons/body/servitor/body_alchemist.dmi' + eye_icon = 'mods/species/vox/icons/body/servitor/eyes_alchemist.dmi' /obj/item/organ/external/tail/vox - tail = "voxtail" - tail_icon = 'mods/species/vox/icons/body/soldier/tail.dmi' + tail = "voxtail" + tail_icon = 'mods/species/vox/icons/body/soldier/tail.dmi' tail_blend = ICON_MULTIPLY /obj/item/organ/external/tail/vox/servitor - tail_icon = 'mods/species/vox/icons/body/servitor/tail.dmi' + tail_icon = 'mods/species/vox/icons/body/servitor/tail.dmi' /obj/item/organ/external/tail/vox/stanchion - tail_icon = 'mods/species/vox/icons/body/stanchion/tail.dmi' + tail_icon = 'mods/species/vox/icons/body/stanchion/tail.dmi' diff --git a/mods/species/vox/datum/trader.dm b/mods/species/vox/datum/trader.dm index ac8f83a8405..62ceb08a87e 100644 --- a/mods/species/vox/datum/trader.dm +++ b/mods/species/vox/datum/trader.dm @@ -3,42 +3,42 @@ origin = "UNREGISTERED VESSEL" name_language = /decl/language/vox compliment_increase = 0 - trade_flags = TRADER_GOODS - var/hailed_vox = FALSE //Whether we have been hailed by a vox. negatives mean pariah, positives mean regular. + trade_flags = TRADER_GOODS | TRADER_BRIBABLE blacklisted_trade_items = null - speech = list(TRADER_HAIL_GENERIC = "SKREEE! We will trade good stuff, yes?", - TRADER_HAIL_DENY = "Trade closed, GO AWAY!", - - TRADER_TRADE_COMPLETE = "Yes, kikikikikiki! You will not regret this trade!", - TRADER_NO_MONEY = "Money? Vox no need money. GOODS! Give it GOODS!", - TRADER_NOT_ENOUGH = "It wants MORE for that. Give it more.", - - TRADER_HOW_MUCH = "You give it something worth VALUE, yes?", - TRADER_WHAT_WANT = "Vox wants", - - TRADER_COMPLEMENT_FAILURE = "No.", - TRADER_COMPLEMENT_SUCCESS = "Kikikikiki! Trade is better than talk, yes?", - TRADER_INSULT_GOOD = "Bah! Why does it have to deal with you?", - TRADER_INSULT_BAD = "All you meats are the same! Fuck off!", - ) + speech = list( + TRADER_HAIL_GENERIC = "SKREEE! We will trade good stuff, yes?", + TRADER_HAIL_DENY = "Trade closed, GO AWAY!", + TRADER_TRADE_COMPLETE = "Yes, kikikikikiki! You will not regret this trade!", + TRADER_NO_MONEY = "Money? It does not need money. GOODS! Give it GOODS!", + TRADER_NOT_ENOUGH = "It wants MORE for that. Give it more.", + TRADER_HOW_MUCH = "You give it something worth VALUE, yes?", + TRADER_WHAT_WANT = "It wants", + TRADER_COMPLIMENT_DENY = "No.", + TRADER_COMPLIMENT_ACCEPT = "Kikikikiki! Trade is better than talk, yes?", + TRADER_INSULT_GOOD = "Bah! Why does it have to deal with you?", + TRADER_INSULT_BAD = "All you meat is the same! Fuck the off!", + TRADER_BRIBE_ACCEPT = "Skhhhhhk... fine. " + TRADER_TOKEN_TIME + " minutes, no more!", + TRADER_BRIBE_REFUSAL = "No! It is getting impatient with this meat!" + ) + var/hailed_vox = FALSE //Whether we have been hailed by a vox. negatives mean pariah, positives mean regular. var/list/visited_vox_speech = list( - TRADER_HAIL_GENERIC = "SKREEEEE! You friend of Vox? You trade with, yes?", + TRADER_HAIL_GENERIC = "SKREEEEE! You friend of the Shoal? You trade with, yes?", + TRADER_HAIL_SILICON = "YOU KNOW THE SHOAL? Yes is good, yes yes, " + TRADER_TOKEN_MOB + ". Trade GOOD!", TRADER_HAIL_DENY = "Trade gone now. Goodbye.", - TRADER_TRADE_COMPLETE = "Yes... this is a good trade for the Shoal!", - TRADER_NO_MONEY = "You know as well as it that money is no good.", - TRADER_NOT_ENOUGH = "Ech, you insult it with such a trade? Respect it, make it equal.", - + TRADER_NO_MONEY = "You know as well as it that money is no good.", + TRADER_NOT_ENOUGH = "Ech, you insult it with such a trade? Respect it, make it equal.", TRADER_HOW_MUCH = "Hmm.... VALUE. Something like that.", TRADER_WHAT_WANT = "We need", - - TRADER_COMPLEMENT_FAILURE = "You know better than that!", - TRADER_COMPLEMENT_SUCCESS = "You butter it up? Should know better than that.", + TRADER_COMPLIMENT_DENY = "You know better than that!", + TRADER_COMPLIMENT_ACCEPT = "You butter it up? Should know better than that.", TRADER_INSULT_GOOD = "Where this come from? Is trade no good?", - TRADER_INSULT_BAD = "If you say all this at home, you be dead!" - ) + TRADER_INSULT_BAD = "If you say all this at home, you be dead!", + TRADER_BRIBE_ACCEPT = "It can stay for " + TRADER_TOKEN_TIME + " minutes, for most beloved kin as you.", + TRADER_BRIBE_REFUSAL = "Krrkkrhkkhh! You ask too much! It must be moving on." + ) possible_wanted_items = list( /obj/item/ = TRADER_SUBTYPES_ONLY, /obj/item/stack/material = TRADER_SUBTYPES_ONLY, @@ -55,17 +55,14 @@ /obj/item/robot_parts/robot_component = TRADER_BLACKLIST ) - mob_transfer_message = "You are transported to the ORIGIN. When the transportation dizziness wears off, you find you are surrounded by cackling Vox..." + mob_transfer_message = "You are transported to " + TRADER_TOKEN_ORIGIN + ". When the transportation dizziness wears off, you find you are surrounded by cackling vox..." -#define TRADER_HAIL_START "trade_hail_" /datum/trader/ship/vox/New() - speech[TRADER_HAIL_START + "silicon"] = "Hello metal thing! You trade metal for things?" - speech[TRADER_HAIL_START + SPECIES_HUMAN] = "Hello hueman! Kiikikikiki! MOB trade with us, yes? Good!" - - visited_vox_speech[TRADER_HAIL_START + "silicon"] = "YOU KNOW VOX? Yes is good, yes yes, MOB. Trade GOOD!" - visited_vox_speech[TRADER_HAIL_START + SPECIES_HUMAN] = "Friend of Vox is friend of all Vox! MOB you trade now!" - visited_vox_speech[TRADER_HAIL_START + SPECIES_VOX] = "SKREEEE! May the Shoal make this trade good, MOB!" -#undef TRADER_HAIL_START + speech[TRADER_HAIL_SILICON] = "Hello metal thing! You trade metal for things?" + speech[TRADER_HAIL_START + SPECIES_HUMAN] = "Hello hueman! Kiikikikiki! " + TRADER_TOKEN_MOB + " trade with us, yes? Good!" + visited_vox_speech[TRADER_HAIL_START + SPECIES_HUMAN] = "Friend of it is friend of all Shoal! " + TRADER_TOKEN_MOB + " you trade now!" + visited_vox_speech[TRADER_HAIL_START + SPECIES_VOX] = "SKREEEE! May the Shoal make this trade good, " + TRADER_TOKEN_MOB + "!" + ..() /datum/trader/ship/vox/hail(var/mob/user) if(ishuman(user)) @@ -87,3 +84,7 @@ . = ..() if(!hailed_vox) . *= 2 + +/datum/trader/ship/clothingshop/New() + speech[TRADER_HAIL_START + SPECIES_VOX] = "Well hello, sir! I don't believe we have any clothes that fit you... but you can still look!" + ..() diff --git a/mods/species/vox/gear/gear_head.dm b/mods/species/vox/gear/gear_head.dm index dfc721177ac..24d6676478f 100644 --- a/mods/species/vox/gear/gear_head.dm +++ b/mods/species/vox/gear/gear_head.dm @@ -7,7 +7,6 @@ name = "alien helmet" icon = 'mods/species/vox/icons/clothing/pressure_helmet.dmi' desc = "A huge, armoured, pressurized helmet. Looks like an ancient human diving suit." - light_overlay = "invis_light" armor = list( ARMOR_MELEE = ARMOR_MELEE_MAJOR, ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, @@ -29,7 +28,7 @@ color = "#486e6e" var/lights_color = "#00ffff" -/obj/item/clothing/head/helmet/space/vox/carapace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) +/obj/item/clothing/head/helmet/space/vox/carapace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && lights_color && check_state_in_icon("[overlay.icon_state]-lights", overlay.icon)) var/image/I = emissive_overlay(overlay.icon, "[overlay.icon_state]-lights") I.color = lights_color diff --git a/mods/species/vox/gear/gear_suit.dm b/mods/species/vox/gear/gear_suit.dm index c38932355dd..a02b8554285 100644 --- a/mods/species/vox/gear/gear_suit.dm +++ b/mods/species/vox/gear/gear_suit.dm @@ -43,7 +43,7 @@ desc = "An armoured, segmented carapace with glowing purple lights. It looks pretty run-down." var/lights_color = "#00ffff" -/obj/item/clothing/suit/space/vox/carapace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) +/obj/item/clothing/suit/space/vox/carapace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && lights_color && check_state_in_icon("[overlay.icon_state]-lights", overlay.icon)) var/image/I = emissive_overlay(overlay.icon, "[overlay.icon_state]-lights") I.color = lights_color diff --git a/mods/species/vox/gear/gear_under.dm b/mods/species/vox/gear/gear_under.dm index 9b8c01a7779..6e7dd0fbd02 100644 --- a/mods/species/vox/gear/gear_under.dm +++ b/mods/species/vox/gear/gear_under.dm @@ -1,5 +1,4 @@ /obj/item/clothing/under/vox - has_sensor = SUIT_NO_SENSORS bodytype_equip_flags = BODY_FLAG_VOX /obj/item/clothing/under/vox/vox_casual diff --git a/mods/species/vox/gear/gun_slugsling.dm b/mods/species/vox/gear/gun_slugsling.dm index ab78c43ec14..607e56f7b7d 100644 --- a/mods/species/vox/gear/gun_slugsling.dm +++ b/mods/species/vox/gear/gun_slugsling.dm @@ -5,7 +5,7 @@ throwforce = 6 icon = 'mods/species/vox/icons/gear/slugegg.dmi' icon_state = "slugegg" - material = /decl/material/solid/skin/insect + material = /decl/material/solid/organic/skin/insect var/break_on_impact = 1 //There are two modes to the eggs. //One breaks the egg on hit, @@ -22,11 +22,9 @@ /obj/item/slugegg/HasProximity(var/atom/movable/AM) . = ..() if(. && isliving(AM)) - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(H.get_bodytype().bodytype_flag & BODY_FLAG_VOX) - return FALSE var/mob/living/L = AM + if(L.get_bodytype()?.bodytype_flag & BODY_FLAG_VOX) + return FALSE if(L.faction == SPECIES_VOX) return FALSE squish() diff --git a/mods/species/vox/gear/gun_spikethrower.dm b/mods/species/vox/gear/gun_spikethrower.dm index ddaafe9d62a..f14e2dd18c1 100644 --- a/mods/species/vox/gear/gun_spikethrower.dm +++ b/mods/species/vox/gear/gun_spikethrower.dm @@ -59,4 +59,4 @@ icon_state = "quill" item_state = "quill" throwforce = 5 - material = /decl/material/solid/leather/chitin + material = /decl/material/solid/organic/leather/chitin diff --git a/mods/species/vox/icons/body/servitor/hair.dmi b/mods/species/vox/icons/body/servitor/hair.dmi index f4e1011e013..999649b10e1 100644 Binary files a/mods/species/vox/icons/body/servitor/hair.dmi and b/mods/species/vox/icons/body/servitor/hair.dmi differ diff --git a/mods/species/vox/icons/body/servitor/tail.dmi b/mods/species/vox/icons/body/servitor/tail.dmi index 98dc812cb50..150e93dcfde 100644 Binary files a/mods/species/vox/icons/body/servitor/tail.dmi and b/mods/species/vox/icons/body/servitor/tail.dmi differ diff --git a/mods/species/vox/icons/body/soldier/hair.dmi b/mods/species/vox/icons/body/soldier/hair.dmi index 4316e8e33fb..7149c366b5c 100644 Binary files a/mods/species/vox/icons/body/soldier/hair.dmi and b/mods/species/vox/icons/body/soldier/hair.dmi differ diff --git a/mods/species/vox/icons/body/soldier/tail.dmi b/mods/species/vox/icons/body/soldier/tail.dmi index 02899554394..50532450e26 100644 Binary files a/mods/species/vox/icons/body/soldier/tail.dmi and b/mods/species/vox/icons/body/soldier/tail.dmi differ diff --git a/mods/species/vox/icons/body/stanchion/hair.dmi b/mods/species/vox/icons/body/stanchion/hair.dmi index d0f4f126680..cdbf92bc78f 100644 Binary files a/mods/species/vox/icons/body/stanchion/hair.dmi and b/mods/species/vox/icons/body/stanchion/hair.dmi differ diff --git a/mods/species/vox/icons/body/stanchion/tail.dmi b/mods/species/vox/icons/body/stanchion/tail.dmi index 6484eefea81..59a48d3ed38 100644 Binary files a/mods/species/vox/icons/body/stanchion/tail.dmi and b/mods/species/vox/icons/body/stanchion/tail.dmi differ diff --git a/mods/species/vox/organs_vox.dm b/mods/species/vox/organs_vox.dm index 97b020f9985..f3e11f2135d 100644 --- a/mods/species/vox/organs_vox.dm +++ b/mods/species/vox/organs_vox.dm @@ -26,53 +26,55 @@ name = "gizzard" color = "#0033cc" var/static/list/gains_nutriment_from_inedible_reagents = list( - /decl/material/solid/wood = 3, - /decl/material/liquid/cleaner = 1, - /decl/material/liquid/foaming_agent = 1, - /decl/material/liquid/surfactant = 1, - /decl/material/liquid/paint = 1 + /decl/material/solid/organic/wood = 3, + /decl/material/liquid/cleaner = 1, + /decl/material/liquid/foaming_agent = 1, + /decl/material/liquid/surfactant = 1, + /decl/material/liquid/paint = 1 ) var/static/list/can_digest_matter = list( - /decl/material/solid/wood = TRUE, - /decl/material/solid/wood/mahogany = TRUE, - /decl/material/solid/wood/maple = TRUE, - /decl/material/solid/wood/ebony = TRUE, - /decl/material/solid/wood/walnut = TRUE, - /decl/material/solid/leather = TRUE, - /decl/material/solid/plastic = TRUE, - /decl/material/solid/cardboard = TRUE, - /decl/material/solid/cloth = TRUE, - /decl/material/solid/slag = TRUE, - /decl/material/solid/sodiumchloride = TRUE + /decl/material/solid/organic/wood = TRUE, + /decl/material/solid/organic/wood/mahogany = TRUE, + /decl/material/solid/organic/wood/maple = TRUE, + /decl/material/solid/organic/wood/ebony = TRUE, + /decl/material/solid/organic/wood/walnut = TRUE, + /decl/material/solid/organic/leather = TRUE, + /decl/material/solid/organic/plastic = TRUE, + /decl/material/solid/organic/cardboard = TRUE, + /decl/material/solid/organic/paper = TRUE, + /decl/material/solid/organic/cloth = TRUE, + /decl/material/solid/slag = TRUE, + /decl/material/solid/sodiumchloride = TRUE ) var/static/list/can_process_matter = list( - /decl/material/solid/glass = TRUE, - /decl/material/solid/gemstone/diamond = TRUE, - /decl/material/solid/stone/sandstone = TRUE, - /decl/material/solid/stone/marble = TRUE, - /decl/material/solid/metal/steel = TRUE, - /decl/material/solid/metal/gold = TRUE, - /decl/material/solid/metal/silver = TRUE, - /decl/material/solid/metal/uranium = TRUE, - /decl/material/solid/metal/iron = TRUE, - /decl/material/solid/metal/platinum = TRUE, - /decl/material/solid/metal/bronze = TRUE, - /decl/material/solid/metal/titanium = TRUE, - /decl/material/solid/metal/osmium = TRUE, - /decl/material/solid/metal/copper = TRUE, - /decl/material/solid/metal/aluminium = TRUE, - /decl/material/solid/sand = TRUE, - /decl/material/solid/graphite = TRUE, - /decl/material/solid/pitchblende = TRUE, - /decl/material/solid/hematite = TRUE, - /decl/material/solid/quartz = TRUE, - /decl/material/solid/pyrite = TRUE, - /decl/material/solid/spodumene = TRUE, - /decl/material/solid/cinnabar = TRUE, - /decl/material/solid/phosphorite = TRUE, - /decl/material/solid/potash = TRUE, - /decl/material/solid/bauxite = TRUE, - /decl/material/solid/rutile = TRUE + /decl/material/solid/glass = TRUE, + /decl/material/solid/gemstone/diamond = TRUE, + /decl/material/solid/stone/sandstone = TRUE, + /decl/material/solid/stone/marble = TRUE, + /decl/material/solid/metal/steel = TRUE, + /decl/material/solid/metal/gold = TRUE, + /decl/material/solid/metal/silver = TRUE, + /decl/material/solid/metal/uranium = TRUE, + /decl/material/solid/metal/iron = TRUE, + /decl/material/solid/metal/platinum = TRUE, + /decl/material/solid/metal/bronze = TRUE, + /decl/material/solid/metal/titanium = TRUE, + /decl/material/solid/metal/osmium = TRUE, + /decl/material/solid/metal/copper = TRUE, + /decl/material/solid/metal/aluminium = TRUE, + /decl/material/solid/sand = TRUE, + /decl/material/solid/clay = TRUE, + /decl/material/solid/graphite = TRUE, + /decl/material/solid/pitchblende = TRUE, + /decl/material/solid/hematite = TRUE, + /decl/material/solid/quartz = TRUE, + /decl/material/solid/pyrite = TRUE, + /decl/material/solid/spodumene = TRUE, + /decl/material/solid/cinnabar = TRUE, + /decl/material/solid/phosphorite = TRUE, + /decl/material/solid/potash = TRUE, + /decl/material/solid/bauxite = TRUE, + /decl/material/solid/rutile = TRUE ) var/list/stored_matter = list() @@ -153,10 +155,10 @@ icon_state = "cortical-stack" organ_tag = BP_STACK organ_properties = ORGAN_PROP_PROSTHETIC - origin_tech = @"{'biotech':4,'materials':4,'magnets':2,'programming':3}" + origin_tech = @'{"biotech":4,"materials":4,"magnets":2,"programming":3}' relative_size = 10 - var/ownerckey + var/stored_ckey var/default_language var/list/languages = list() var/datum/mind/backup @@ -172,7 +174,7 @@ var/user_vox = isspecies(user, SPECIES_VOX) if (istype(backup)) - var/owner_viable = find_dead_player(ownerckey, TRUE) + var/owner_viable = find_dead_player(stored_ckey, TRUE) if (user_vox) to_chat(user, SPAN_NOTICE("The integrity light on [src] blinks [owner_viable ? "rapidly. It can be implanted." : "slowly. It is dormant."]")) else @@ -192,7 +194,7 @@ backup = owner.mind default_language = owner.default_language if(owner.ckey) - ownerckey = owner.ckey + stored_ckey = owner.ckey /obj/item/organ/internal/voxstack/proc/backup_inviable() return (!istype(backup) || backup == owner.mind || (backup.current && backup.current.stat != DEAD)) @@ -210,7 +212,7 @@ set waitfor = FALSE if(C && !backup_inviable()) prompting = TRUE - var/response = alert(find_dead_player(ownerckey, 1), "Your neural backup has been placed into a new body. Do you wish to return to life as the mind of [backup.name]?", "Resleeving", "Yes", "No") + var/response = alert(find_dead_player(stored_ckey, 1), "Your neural backup has been placed into a new body. Do you wish to return to life as the mind of [backup.name]?", "Resleeving", "Yes", "No") prompting = FALSE if(src && response == "Yes" && owner == C) overwrite() diff --git a/mods/valsalia/icons/posters.dmi b/mods/valsalia/icons/posters.dmi new file mode 100644 index 00000000000..cff06cdbabe Binary files /dev/null and b/mods/valsalia/icons/posters.dmi differ diff --git a/nano/images/ministation/ministation-1.png b/nano/images/ministation/ministation-1.png index d6e7e854ae2..70fcdc99765 100644 Binary files a/nano/images/ministation/ministation-1.png and b/nano/images/ministation/ministation-1.png differ diff --git a/nano/images/ministation/ministation-2.png b/nano/images/ministation/ministation-2.png new file mode 100644 index 00000000000..9e33b0d8c85 Binary files /dev/null and b/nano/images/ministation/ministation-2.png differ diff --git a/nano/images/ministation/ministation-3.png b/nano/images/ministation/ministation-3.png new file mode 100644 index 00000000000..a2d90b864f0 Binary files /dev/null and b/nano/images/ministation/ministation-3.png differ diff --git a/nano/images/ministation/ministation-4.png b/nano/images/ministation/ministation-4.png new file mode 100644 index 00000000000..be5b779985e Binary files /dev/null and b/nano/images/ministation/ministation-4.png differ diff --git a/nano/templates/material_processing_extractor.tmpl b/nano/templates/material_processing_extractor.tmpl new file mode 100644 index 00000000000..1cec6807f7f --- /dev/null +++ b/nano/templates/material_processing_extractor.tmpl @@ -0,0 +1,99 @@ +
    +
    +
    + Power +
    +
    + {{if data.on}} + {{:helper.link("On", null, { 'toggle_power' : 1 }, null, 'selected')}} + {{else}} + {{:helper.link("Off", null, { 'toggle_power' : 1 }, null, null)}} + {{/if}} +
    +
    + Input +
    +
    + {{if data.can_configure == 1}} + {{:helper.link("Disable", null, { 'set_input' : 0 }, null, data.input_value == 0 ? 'selected' : null)}} + {{:helper.link("North", null, { 'set_input' : 1 }, null, data.input_value == 1 ? 'selected' : null)}} + {{:helper.link("South", null, { 'set_input' : 2 }, null, data.input_value == 2 ? 'selected' : null)}} + {{:helper.link("East", null, { 'set_input' : 4 }, null, data.input_value == 4 ? 'selected' : null)}} + {{:helper.link("West", null, { 'set_input' : 8 }, null, data.input_value == 8 ? 'selected' : null)}} + {{else}} + {{:data.input_label}} + {{/if}} +
    +
    + Output +
    +
    + {{if data.can_configure == 1}} + {{:helper.link("Disable", null, { 'set_output' : 0 }, null, data.output_value == 0 ? 'selected' : null)}} + {{:helper.link("North", null, { 'set_output' : 1 }, null, data.output_value == 1 ? 'selected' : null)}} + {{:helper.link("South", null, { 'set_output' : 2 }, null, data.output_value == 2 ? 'selected' : null)}} + {{:helper.link("East", null, { 'set_output' : 4 }, null, data.output_value == 4 ? 'selected' : null)}} + {{:helper.link("West", null, { 'set_output' : 8 }, null, data.output_value == 8 ? 'selected' : null)}} + {{else}} + {{:data.output_label}} + {{/if}} +
    +
    + {{if data.can_configure == 1}} + {{:helper.link("Hide", null, { 'toggle_configuration' : 1 }, null, null)}} + {{else}} + {{:helper.link("Configure", null, { 'toggle_configuration' : 1 }, null, null)}} + {{/if}} +
    + +
    + {{if data.full}} + Internal liquid tank is full, please empty to resume processing + {{/if}} + + {{for data.reagents}} +
    +
    + {{:value.label}} +
    +
    + {{if value.liquid}} + {{:helper.link("Dispense", null, { 'dispense' : value.index}, null, null)}} + {{else}} + {{:helper.link("Process", null, { 'dispense' : value.index}, null, null)}} + {{/if}} +
    +
    + {{empty}} + No materials loaded + {{/for}} +
    +
    +
    + Dispensing: +
    +
    + {{:helper.link(data.dispense_amount + "U", null, { 'change_amount' : 1}, null, null)}} +
    +
    +
    +
    + Output Container: +
    +
    + {{if data.container}} + {{:helper.link(data.container, null, { 'eject' : 1}, null, null)}} + {{else}} + No container loaded + {{/if}} +
    +
    +
    +
    + Gas pressure: +
    +
    + {{:data.gas_pressure}} kPa +
    +
    +
    diff --git a/nebula.dme b/nebula.dme index 52df73b1fcd..06839eed2c3 100644 --- a/nebula.dme +++ b/nebula.dme @@ -17,6 +17,7 @@ #include "code\world.dm" #include "code\__datastructures\priority_queue.dm" #include "code\__datastructures\stack.dm" +#include "code\__defines\_byond_version_compat.dm" #include "code\__defines\_compile_helpers.dm" #include "code\__defines\_compile_options.dm" #include "code\__defines\_planes+layers.dm" @@ -35,7 +36,9 @@ #include "code\__defines\client.dm" #include "code\__defines\colors.dm" #include "code\__defines\computers.dm" +#include "code\__defines\credits.dm" #include "code\__defines\culture.dm" +#include "code\__defines\damage.dm" #include "code\__defines\damage_organs.dm" #include "code\__defines\definition_helpers.dm" #include "code\__defines\deity.dm" @@ -43,6 +46,7 @@ #include "code\__defines\dna.dm" #include "code\__defines\dview.dm" #include "code\__defines\feedback.dm" +#include "code\__defines\fires.dm" #include "code\__defines\flags.dm" #include "code\__defines\fluids.dm" #include "code\__defines\gamemode.dm" @@ -64,6 +68,7 @@ #include "code\__defines\math_physics.dm" #include "code\__defines\maths.dm" #include "code\__defines\MC.dm" +#include "code\__defines\mech.dm" #include "code\__defines\misc.dm" #include "code\__defines\mob_status.dm" #include "code\__defines\mobs.dm" @@ -76,6 +81,7 @@ #include "code\__defines\proc_presets.dm" #include "code\__defines\qdel.dm" #include "code\__defines\radio.dm" +#include "code\__defines\reactions.dm" #include "code\__defines\research.dm" #include "code\__defines\ruin_tags.dm" #include "code\__defines\shields.dm" @@ -83,9 +89,11 @@ #include "code\__defines\skills.dm" #include "code\__defines\sound.dm" #include "code\__defines\spaceman_dmm.dm" +#include "code\__defines\spawn.dm" #include "code\__defines\species.dm" #include "code\__defines\status.dm" #include "code\__defines\stress.dm" +#include "code\__defines\structures.dm" #include "code\__defines\subsystem-priority.dm" #include "code\__defines\subsystems.dm" #include "code\__defines\targeting.dm" @@ -163,16 +171,13 @@ #include "code\_onclick\other_mobs.dm" #include "code\_onclick\rig.dm" #include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\ability_screen_objects.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\ai_hud.dm" -#include "code\_onclick\hud\ai_screen_objects.dm" #include "code\_onclick\hud\animal.dm" #include "code\_onclick\hud\deity.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\global_hud.dm" -#include "code\_onclick\hud\gun_mode.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" #include "code\_onclick\hud\other_mobs.dm" @@ -180,12 +185,55 @@ #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" #include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\skybox.dm" +#include "code\_onclick\hud\screen\_screen.dm" +#include "code\_onclick\hud\screen\screen_abilities.dm" +#include "code\_onclick\hud\screen\screen_action_button.dm" +#include "code\_onclick\hud\screen\screen_ai_button.dm" +#include "code\_onclick\hud\screen\screen_attack_selector.dm" +#include "code\_onclick\hud\screen\screen_cataloguer.dm" +#include "code\_onclick\hud\screen\screen_cinematic.dm" +#include "code\_onclick\hud\screen\screen_click_catcher.dm" +#include "code\_onclick\hud\screen\screen_constructs.dm" +#include "code\_onclick\hud\screen\screen_credits.dm" +#include "code\_onclick\hud\screen\screen_drop.dm" +#include "code\_onclick\hud\screen\screen_equip.dm" +#include "code\_onclick\hud\screen\screen_exosuit.dm" +#include "code\_onclick\hud\screen\screen_fullscreen.dm" +#include "code\_onclick\hud\screen\screen_global_hud.dm" +#include "code\_onclick\hud\screen\screen_gun.dm" +#include "code\_onclick\hud\screen\screen_holomap.dm" +#include "code\_onclick\hud\screen\screen_intent.dm" +#include "code\_onclick\hud\screen\screen_internal.dm" +#include "code\_onclick\hud\screen\screen_inventory.dm" +#include "code\_onclick\hud\screen\screen_lighting.dm" +#include "code\_onclick\hud\screen\screen_maneuver.dm" +#include "code\_onclick\hud\screen\screen_module.dm" +#include "code\_onclick\hud\screen\screen_movement.dm" +#include "code\_onclick\hud\screen\screen_needs.dm" +#include "code\_onclick\hud\screen\screen_pai.dm" +#include "code\_onclick\hud\screen\screen_radial.dm" +#include "code\_onclick\hud\screen\screen_resist.dm" +#include "code\_onclick\hud\screen\screen_robot_drop_grab.dm" +#include "code\_onclick\hud\screen\screen_robot_intent.dm" +#include "code\_onclick\hud\screen\screen_robot_inventory.dm" +#include "code\_onclick\hud\screen\screen_robot_modules.dm" +#include "code\_onclick\hud\screen\screen_robot_panel.dm" +#include "code\_onclick\hud\screen\screen_robot_radio.dm" +#include "code\_onclick\hud\screen\screen_robot_store.dm" +#include "code\_onclick\hud\screen\screen_robot_warnings.dm" +#include "code\_onclick\hud\screen\screen_setup.dm" +#include "code\_onclick\hud\screen\screen_stamina.dm" +#include "code\_onclick\hud\screen\screen_storage.dm" +#include "code\_onclick\hud\screen\screen_swaphands.dm" +#include "code\_onclick\hud\screen\screen_throw.dm" +#include "code\_onclick\hud\screen\screen_toggle.dm" +#include "code\_onclick\hud\screen\screen_up_hint.dm" +#include "code\_onclick\hud\screen\screen_warnings.dm" +#include "code\_onclick\hud\screen\screen_zone_selector.dm" #include "code\controllers\admin.dm" #include "code\controllers\autotransfer.dm" #include "code\controllers\communications.dm" -#include "code\controllers\configuration.dm" #include "code\controllers\controller.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\hooks-defs.dm" @@ -208,6 +256,7 @@ #include "code\controllers\subsystems\ao.dm" #include "code\controllers\subsystems\atoms.dm" #include "code\controllers\subsystems\circuit_component.dm" +#include "code\controllers\subsystems\configuration.dm" #include "code\controllers\subsystems\daycycle.dm" #include "code\controllers\subsystems\disposals.dm" #include "code\controllers\subsystems\evac.dm" @@ -317,13 +366,34 @@ #include "code\datums\communication\~defines.dm" #include "code\datums\composite_sounds\_composite_sound.dm" #include "code\datums\composite_sounds\machinery_sounds.dm" +#include "code\datums\config\_config.dm" +#include "code\datums\config\_config_categories.dm" +#include "code\datums\config\config_enum.dm" +#include "code\datums\config\config_list.dm" +#include "code\datums\config\config_num.dm" +#include "code\datums\config\config_num_client.dm" +#include "code\datums\config\config_text.dm" +#include "code\datums\config\config_toggle.dm" +#include "code\datums\config\config_toggle_on.dm" +#include "code\datums\config\config_types\config_admin.dm" +#include "code\datums\config\config_types\config_client.dm" +#include "code\datums\config\config_types\config_debug.dm" +#include "code\datums\config\config_types\config_events.dm" +#include "code\datums\config\config_types\config_game_option.dm" +#include "code\datums\config\config_types\config_game_world.dm" +#include "code\datums\config\config_types\config_health.dm" +#include "code\datums\config\config_types\config_logging.dm" +#include "code\datums\config\config_types\config_mode.dm" +#include "code\datums\config\config_types\config_protected.dm" +#include "code\datums\config\config_types\config_resources.dm" +#include "code\datums\config\config_types\config_server.dm" +#include "code\datums\config\config_types\config_voting.dm" #include "code\datums\extensions\_defines.dm" #include "code\datums\extensions\access_provider.dm" #include "code\datums\extensions\deity_be_near.dm" #include "code\datums\extensions\event_registration.dm" #include "code\datums\extensions\extensions.dm" #include "code\datums\extensions\fake_data.dm" -#include "code\datums\extensions\hattable.dm" #include "code\datums\extensions\interactive.dm" #include "code\datums\extensions\label.dm" #include "code\datums\extensions\local_network.dm" @@ -343,6 +413,10 @@ #include "code\datums\extensions\assembly\assembly_damage.dm" #include "code\datums\extensions\assembly\assembly_interaction.dm" #include "code\datums\extensions\assembly\assembly_power.dm" +#include "code\datums\extensions\cell\cell.dm" +#include "code\datums\extensions\cell\cell_panel.dm" +#include "code\datums\extensions\cell\cell_secured.dm" +#include "code\datums\extensions\cell\cell_unremovable.dm" #include "code\datums\extensions\eye\_eye.dm" #include "code\datums\extensions\eye\blueprints.dm" #include "code\datums\extensions\eye\freelook.dm" @@ -815,7 +889,6 @@ #include "code\game\machinery\_machines_base\stock_parts\radio\stock_parts_radio.dm" #include "code\game\machinery\_machines_base\stock_parts\radio\transmitter.dm" #include "code\game\machinery\atmoalter\_atmos_connection.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" #include "code\game\machinery\atmoalter\canister.dm" #include "code\game\machinery\atmoalter\meter.dm" #include "code\game\machinery\atmoalter\portable_atmospherics.dm" @@ -829,9 +902,10 @@ #include "code\game\machinery\computer\ai_core.dm" #include "code\game\machinery\computer\arcade.dm" #include "code\game\machinery\computer\arcade_orion.dm" +#include "code\game\machinery\computer\area_atmos.dm" #include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" #include "code\game\machinery\computer\buildandrepair.dm" +#include "code\game\machinery\computer\central_atmos.dm" #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\guestpass.dm" #include "code\game\machinery\computer\law.dm" @@ -903,7 +977,10 @@ #include "code\game\objects\item_materials.dm" #include "code\game\objects\item_mob_overlay.dm" #include "code\game\objects\munition.dm" +#include "code\game\objects\obj_edibility.dm" #include "code\game\objects\objs.dm" +#include "code\game\objects\objs_damage.dm" +#include "code\game\objects\objs_interactions.dm" #include "code\game\objects\topic.dm" #include "code\game\objects\auras\aura.dm" #include "code\game\objects\auras\blueforge_aura.dm" @@ -916,6 +993,7 @@ #include "code\game\objects\compass\compass_holder.dm" #include "code\game\objects\compass\compass_overmap.dm" #include "code\game\objects\compass\compass_waypoint.dm" +#include "code\game\objects\effects\_effect.dm" #include "code\game\objects\effects\bump_teleporter.dm" #include "code\game\objects\effects\cig_smoke.dm" #include "code\game\objects\effects\effect_system.dm" @@ -942,7 +1020,6 @@ #include "code\game\objects\effects\chem\foam.dm" #include "code\game\objects\effects\chem\water.dm" #include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\contraband.dm" #include "code\game\objects\effects\decals\crayon.dm" #include "code\game\objects\effects\decals\decal.dm" #include "code\game\objects\effects\decals\misc.dm" @@ -974,6 +1051,7 @@ #include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\holosign_creator.dm" #include "code\game\objects\items\instruments.dm" +#include "code\game\objects\items\item_edibility.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\paintkit.dm" #include "code\game\objects\items\paper_fortune_teller.dm" @@ -989,12 +1067,22 @@ #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\umbrella.dm" #include "code\game\objects\items\books\_book.dm" -#include "code\game\objects\items\books\skill_book.dm" +#include "code\game\objects\items\books\fluff\_fluff.dm" +#include "code\game\objects\items\books\fluff\science.dm" #include "code\game\objects\items\books\manuals\_manual.dm" #include "code\game\objects\items\books\manuals\engineering.dm" #include "code\game\objects\items\books\manuals\manuals.dm" #include "code\game\objects\items\books\manuals\medical.dm" #include "code\game\objects\items\books\manuals\science.dm" +#include "code\game\objects\items\books\skill\_skill.dm" +#include "code\game\objects\items\books\skill\_skill_custom.dm" +#include "code\game\objects\items\books\skill\engineering.dm" +#include "code\game\objects\items\books\skill\general.dm" +#include "code\game\objects\items\books\skill\medical.dm" +#include "code\game\objects\items\books\skill\organizational.dm" +#include "code\game\objects\items\books\skill\research.dm" +#include "code\game\objects\items\books\skill\security.dm" +#include "code\game\objects\items\books\skill\service.dm" #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\auto_cpr.dm" #include "code\game\objects\items\devices\binoculars.dm" @@ -1003,7 +1091,6 @@ #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\dociler.dm" #include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\geiger.dm" #include "code\game\objects\items\devices\gps.dm" #include "code\game\objects\items\devices\hacktool.dm" @@ -1052,6 +1139,16 @@ #include "code\game\objects\items\devices\scanners\price.dm" #include "code\game\objects\items\devices\scanners\reagents.dm" #include "code\game\objects\items\devices\scanners\xenobio.dm" +#include "code\game\objects\items\flashlights\_flashlight.dm" +#include "code\game\objects\items\flashlights\flare.dm" +#include "code\game\objects\items\flashlights\floodlamp.dm" +#include "code\game\objects\items\flashlights\glowstick.dm" +#include "code\game\objects\items\flashlights\lamp.dm" +#include "code\game\objects\items\flashlights\lavalamp.dm" +#include "code\game\objects\items\flashlights\misc.dm" +#include "code\game\objects\items\flashlights\party.dm" +#include "code\game\objects\items\flashlights\penlight.dm" +#include "code\game\objects\items\flashlights\slime.dm" #include "code\game\objects\items\robot\robot_frame.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" @@ -1066,7 +1163,7 @@ #include "code\game\objects\items\tools\power_tools.dm" #include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\autopsy.dm" -#include "code\game\objects\items\weapons\beachball.dm" +#include "code\game\objects\items\weapons\balls.dm" #include "code\game\objects\items\weapons\cane.dm" #include "code\game\objects\items\weapons\cards_ids.dm" #include "code\game\objects\items\weapons\cards_ids_syndicate.dm" @@ -1369,6 +1466,7 @@ #include "code\game\objects\structures\signs\warning_signs.dm" #include "code\game\objects\structures\stool_bed_chair_nest_sofa\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest_sofa\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest_sofa\pew.dm" #include "code\game\objects\structures\stool_bed_chair_nest_sofa\sofa.dm" #include "code\game\objects\structures\stool_bed_chair_nest_sofa\stools.dm" #include "code\game\objects\structures\stool_bed_chair_nest_sofa\wheelchair.dm" @@ -1390,12 +1488,12 @@ #include "code\game\turfs\exterior\exterior_lava.dm" #include "code\game\turfs\exterior\exterior_mud.dm" #include "code\game\turfs\exterior\exterior_ocean.dm" +#include "code\game\turfs\exterior\exterior_rock.dm" #include "code\game\turfs\exterior\exterior_sand.dm" #include "code\game\turfs\exterior\exterior_seafloor.dm" #include "code\game\turfs\exterior\exterior_shrouded.dm" #include "code\game\turfs\exterior\exterior_sky.dm" #include "code\game\turfs\exterior\exterior_tar.dm" -#include "code\game\turfs\exterior\exterior_volcanic.dm" #include "code\game\turfs\exterior\exterior_wall.dm" #include "code\game\turfs\exterior\exterior_wall_subtypes.dm" #include "code\game\turfs\exterior\exterior_wall_xenoarch.dm" @@ -1594,6 +1692,7 @@ #include "code\modules\atmospherics\components\unary\vent_scrubber.dm" #include "code\modules\augment\active.dm" #include "code\modules\augment\augment.dm" +#include "code\modules\augment\helping_hands.dm" #include "code\modules\augment\simple.dm" #include "code\modules\augment\active\armblades.dm" #include "code\modules\augment\active\circuit.dm" @@ -1615,6 +1714,8 @@ #include "code\modules\awaymissions\pamphlet.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\blob\blob.dm" +#include "code\modules\brain_interface\_brain_interface.dm" +#include "code\modules\brain_interface\interface_radio.dm" #include "code\modules\butchery\butchery.dm" #include "code\modules\butchery\remains.dm" #include "code\modules\chat_filter\_chat_filter.dm" @@ -1806,6 +1907,7 @@ #include "code\modules\clothing\under\accessories\stethoscope.dm" #include "code\modules\clothing\under\accessories\storage.dm" #include "code\modules\clothing\under\accessories\ties.dm" +#include "code\modules\clothing\under\accessories\vitals_sensor.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" @@ -1818,6 +1920,7 @@ #include "code\modules\codex\codex_mob.dm" #include "code\modules\codex\codex_scannable.dm" #include "code\modules\codex\categories\_category.dm" +#include "code\modules\codex\categories\_materials.dm" #include "code\modules\codex\categories\category_categories.dm" #include "code\modules\codex\categories\category_cocktails.dm" #include "code\modules\codex\categories\category_cultures.dm" @@ -1840,6 +1943,7 @@ #include "code\modules\codex\entries\clothing.dm" #include "code\modules\codex\entries\codex.dm" #include "code\modules\codex\entries\engineering.dm" +#include "code\modules\codex\entries\guides.dm" #include "code\modules\codex\entries\guns.dm" #include "code\modules\codex\entries\jukebox.dm" #include "code\modules\codex\entries\machinery.dm" @@ -2047,7 +2151,6 @@ #include "code\modules\fabrication\designs\textile\protective.dm" #include "code\modules\fabrication\designs\textile\space.dm" #include "code\modules\fabrication\designs\textile\storage.dm" -#include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food\recipes_microwave.dm" #include "code\modules\games\boardgame.dm" @@ -2070,6 +2173,15 @@ #include "code\modules\goals\definitions\personal_achievement.dm" #include "code\modules\goals\definitions\personal_achievement_movement.dm" #include "code\modules\goals\definitions\personal_achievement_specific_object.dm" +#include "code\modules\hallucinations\_hallucination.dm" +#include "code\modules\hallucinations\hallucination_fakeattack.dm" +#include "code\modules\hallucinations\hallucination_gunfire.dm" +#include "code\modules\hallucinations\hallucination_mirage.dm" +#include "code\modules\hallucinations\hallucination_skitters.dm" +#include "code\modules\hallucinations\hallucination_sound.dm" +#include "code\modules\hallucinations\hallucination_spiderbabies.dm" +#include "code\modules\hallucinations\hallucination_talking.dm" +#include "code\modules\hallucinations\hallucination_telepathy.dm" #include "code\modules\holidays\_holiday.dm" #include "code\modules\holidays\holiday_hook.dm" #include "code\modules\holidays\holiday_name.dm" @@ -2272,7 +2384,6 @@ #include "code\modules\mechs\equipment\medical.dm" #include "code\modules\mechs\equipment\utility.dm" #include "code\modules\mechs\interface\_interface.dm" -#include "code\modules\mechs\interface\screen_objects.dm" #include "code\modules\mechs\premade\_premade.dm" #include "code\modules\mechs\premade\combat.dm" #include "code\modules\mechs\premade\exploration.dm" @@ -2307,6 +2418,7 @@ #include "code\modules\mob\logout.dm" #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_eating.dm" #include "code\modules\mob\mob_grabs.dm" #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_layering.dm" @@ -2344,12 +2456,15 @@ #include "code\modules\mob\living\inventory.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_appearance.dm" #include "code\modules\mob\living\living_attackhand.dm" #include "code\modules\mob\living\living_bodytemp.dm" #include "code\modules\mob\living\living_breath.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_dreams.dm" #include "code\modules\mob\living\living_grabs.dm" +#include "code\modules\mob\living\living_hallucinations.dm" #include "code\modules\mob\living\living_maneuvers.dm" #include "code\modules\mob\living\living_organs.dm" #include "code\modules\mob\living\living_powers.dm" @@ -2369,18 +2484,20 @@ #include "code\modules\mob\living\bot\mulebot.dm" #include "code\modules\mob\living\bot\remotebot.dm" #include "code\modules\mob\living\bot\secbot.dm" +#include "code\modules\mob\living\brain\brain.dm" +#include "code\modules\mob\living\brain\death.dm" +#include "code\modules\mob\living\brain\say.dm" #include "code\modules\mob\living\carbon\breathe.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_eating.dm" #include "code\modules\mob\living\carbon\carbon_grabs.dm" #include "code\modules\mob\living\carbon\carbon_organs.dm" #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\damage_procs.dm" #include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\hallucinations.dm" #include "code\modules\mob\living\carbon\internals.dm" -#include "code\modules\mob\living\carbon\life.dm" #include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\taste.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" @@ -2389,17 +2506,10 @@ #include "code\modules\mob\living\carbon\alien\death.dm" #include "code\modules\mob\living\carbon\alien\life.dm" #include "code\modules\mob\living\carbon\alien\say.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\robot.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_appearance.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" #include "code\modules\mob\living\carbon\human\human_damage.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" @@ -2837,13 +2947,14 @@ #include "code\modules\organs\internal\_internal.dm" #include "code\modules\organs\internal\appendix.dm" #include "code\modules\organs\internal\brain.dm" +#include "code\modules\organs\internal\brain_computer.dm" +#include "code\modules\organs\internal\cell.dm" #include "code\modules\organs\internal\eyes.dm" #include "code\modules\organs\internal\heart.dm" #include "code\modules\organs\internal\insectoid.dm" #include "code\modules\organs\internal\kidneys.dm" #include "code\modules\organs\internal\liver.dm" #include "code\modules\organs\internal\lungs.dm" -#include "code\modules\organs\internal\posibrain.dm" #include "code\modules\organs\internal\stomach.dm" #include "code\modules\organs\internal\voice.dm" #include "code\modules\organs\internal\species\golem.dm" @@ -2916,6 +3027,7 @@ #include "code\modules\paperwork\toner_cartridge.dm" #include "code\modules\paperwork\pen\chameleon_pen.dm" #include "code\modules\paperwork\pen\crayon.dm" +#include "code\modules\paperwork\pen\crayon_edibility.dm" #include "code\modules\paperwork\pen\fancy.dm" #include "code\modules\paperwork\pen\multi_pen.dm" #include "code\modules\paperwork\pen\pen.dm" @@ -3092,6 +3204,7 @@ #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm" #include "code\modules\reagents\cocktails.dm" +#include "code\modules\reagents\reagent_container_edibility.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\chems\chems_blood.dm" @@ -3120,6 +3233,7 @@ #include "code\modules\reagents\reactions\reaction_alcohol.dm" #include "code\modules\reagents\reactions\reaction_alloys.dm" #include "code\modules\reagents\reactions\reaction_cafe.dm" +#include "code\modules\reagents\reactions\reaction_compounds.dm" #include "code\modules\reagents\reactions\reaction_drinks.dm" #include "code\modules\reagents\reactions\reaction_drinks_hidden.dm" #include "code\modules\reagents\reactions\reaction_drugs.dm" @@ -3132,13 +3246,18 @@ #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\condiment.dm" +#include "code\modules\reagents\reagent_containers\condiment_edibility.dm" #include "code\modules\reagents\reagent_containers\drinks.dm" +#include "code\modules\reagents\reagent_containers\drinks_edibility.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\food.dm" +#include "code\modules\reagents\reagent_containers\food_edibility.dm" #include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\glass_edibility.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" #include "code\modules\reagents\reagent_containers\inhaler.dm" #include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\pill_edibility.dm" #include "code\modules\reagents\reagent_containers\spray.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" #include "code\modules\reagents\reagent_containers\drinkingglass\drinkingglass.dm" @@ -3155,6 +3274,7 @@ #include "code\modules\reagents\reagent_containers\food\baked_goods.dm" #include "code\modules\reagents\reagent_containers\food\bread.dm" #include "code\modules\reagents\reagent_containers\food\burgers.dm" +#include "code\modules\reagents\reagent_containers\food\can_edibility.dm" #include "code\modules\reagents\reagent_containers\food\canned.dm" #include "code\modules\reagents\reagent_containers\food\dough.dm" #include "code\modules\reagents\reagent_containers\food\eggs.dm" @@ -3561,6 +3681,7 @@ #include "code\unit_tests\subsystem_tests.dm" #include "code\unit_tests\test_obj.dm" #include "code\unit_tests\time_tests.dm" +#include "code\unit_tests\traders.dm" #include "code\unit_tests\unique_tests.dm" #include "code\unit_tests\unit_test.dm" #include "code\unit_tests\uplink_tests.dm" diff --git a/test/check-paths.sh b/test/check-paths.sh index ed0186b5467..a775484c4da 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -32,12 +32,12 @@ exactly 2 "/mob text paths" '"/mob' exactly 6 "/obj text paths" '"/obj' exactly 8 "/turf text paths" '"/turf' exactly 1 "world<< uses" 'world<<|world[[:space:]]<<' -exactly 92 "'in world' uses" 'in world' +exactly 94 "'in world' uses" 'in world' exactly 1 "world.log<< uses" 'world.log<<|world.log[[:space:]]<<' exactly 18 "<< uses" '(?> uses" '>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P -exactly 23 "text2path uses" 'text2path' +exactly 24 "text2path uses" 'text2path' exactly 4 "update_icon() override" '/update_icon\((.*)\)' -P exactly 0 "goto uses" 'goto ' exactly 6 "atom/New uses" '^/(obj|atom|area|mob|turf).*/New\(' @@ -49,7 +49,7 @@ exactly 0 "static-marked globally scoped variables" -P '^(/|)var.*/static/.+' exactly 1 "direct usage of decls_repository.get_decl()" 'decls_repository\.get_decl\(' exactly 21 "direct loc set" -P '(\t|;|\.)loc\s*=(?!=)' exactly 0 "magic number mouse opacity set" -P 'mouse_opacity\s*=\s*[0-2]' -exactly 1 "magic number density set" -P 'density\s*=\s*[01]' +exactly 1 "magic number density set" -P '\bdensity\s*=\s*[01]' exactly 0 "magic number anchored set" -P 'anchored\s*=\s*[01]' exactly 7 "magic number opacity set" -P 'opacity\s*=\s*[01]' diff --git a/tools/changelog/generate_cl.py b/tools/changelog/generate_cl.py index e080f37b2ae..b76f9a50913 100644 --- a/tools/changelog/generate_cl.py +++ b/tools/changelog/generate_cl.py @@ -74,8 +74,9 @@ write_cl['delete-after'] = True +yaml = yaml.YAML(typ='safe', pure=True) with open(Path.cwd().joinpath("tools/changelog/tags.yml")) as file: - tags = yaml.safe_load(file) + tags = yaml.load(file) write_cl['changes'] = [] @@ -87,7 +88,6 @@ if write_cl['changes']: with io.StringIO() as cl_contents: - yaml = yaml.YAML() yaml.indent(sequence=4, offset=2) yaml.dump(write_cl, cl_contents) cl_contents.seek(0) diff --git a/tools/map_migrations/3558_lowercase_closets.txt b/tools/map_migrations/3558_lowercase_closets.txt new file mode 100644 index 00000000000..85ffc1aabd0 --- /dev/null +++ b/tools/map_migrations/3558_lowercase_closets.txt @@ -0,0 +1,2 @@ +/obj/structure/closet/secure_closet/CMO : /obj/structure/closet/secure_closet/cmo{@OLD} +/obj/structure/closet/secure_closet/RD : /obj/structure/closet/secure_closet/research_director{@OLD} \ No newline at end of file diff --git a/tools/map_migrations/3560_central_atmos_computer.txt b/tools/map_migrations/3560_central_atmos_computer.txt new file mode 100644 index 00000000000..71179dbe712 --- /dev/null +++ b/tools/map_migrations/3560_central_atmos_computer.txt @@ -0,0 +1,2 @@ +/obj/machinery/computer/atmoscontrol/@SUBTYPES : /obj/machinery/computer/central_atmos/@SUBTYPES{@OLD} +/obj/item/stock_parts/circuitboard/atmoscontrol : /obj/item/stock_parts/circuitboard/central_atmos{@OLD} diff --git a/tools/map_migrations/3576_wallobj_migration.txt b/tools/map_migrations/3576_wallobj_migration.txt new file mode 100644 index 00000000000..1f381b8483f --- /dev/null +++ b/tools/map_migrations/3576_wallobj_migration.txt @@ -0,0 +1,33 @@ +# FIX WALLOBJ FACING DIRS +/obj/item/radio/intercom/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD {@OLD;pixel_x=-22;dir=4} +/obj/item/radio/intercom/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD {@OLD;pixel_x=22;dir=8} +/obj/item/radio/intercom/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD {@OLD;pixel_y=-30;dir=1} +/obj/item/radio/intercom/@SUBTYPES {pixel_x=@UNSET;pixel_y=@POSITIVE} : @OLD {@OLD;pixel_y=20;dir=@SKIP} +/obj/structure/extinguisher_cabinet {pixel_x=@POSITIVE;pixel_y=@UNSET} : @OLD {@OLD;pixel_x=29;dir=8} +/obj/structure/extinguisher_cabinet {pixel_x=@NEGATIVE;pixel_y=@UNSET} : @OLD {@OLD;pixel_x=-29;dir=4} +/obj/structure/extinguisher_cabinet {pixel_y=@POSITIVE;pixel_x=@UNSET} : @OLD {@OLD;pixel_y=29;dir=@SKIP} +/obj/structure/extinguisher_cabinet {pixel_y=@NEGATIVE;pixel_x=@UNSET} : @OLD {@OLD;pixel_y=-29;dir=1} +/obj/machinery/button/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=8} +/obj/machinery/button/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=4} +/obj/machinery/button/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} +/obj/machinery/status_display/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=8} +/obj/machinery/status_display/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=4} +/obj/machinery/status_display/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} +/obj/machinery/newscaster/@SUBTYPES {pixel_x=@NEGATIVE;pixel_y=@UNSET} : @OLD{@OLD;dir=8} +/obj/machinery/newscaster/@SUBTYPES {pixel_x=@POSITIVE;pixel_y=@UNSET} : @OLD{@OLD;dir=4} +/obj/machinery/newscaster/@SUBTYPES {pixel_y=@NEGATIVE;pixel_x=@UNSET} : @OLD{@OLD;dir=1} +/obj/structure/closet/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=8} +/obj/structure/closet/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=4} +/obj/structure/closet/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} +/obj/machinery/recharger/wallcharger/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=8} +/obj/machinery/recharger/wallcharger/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=4} +/obj/machinery/recharger/wallcharger/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} +/obj/machinery/embedded_controller/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=8} +/obj/machinery/embedded_controller/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=4} +/obj/machinery/embedded_controller/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} +/obj/machinery/airlock_sensor/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=8} +/obj/machinery/airlock_sensor/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=4} +/obj/machinery/airlock_sensor/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} +/obj/machinery/light_switch/@SUBTYPES {pixel_y=@UNSET;pixel_x=@POSITIVE} : @OLD{@OLD;dir=8} +/obj/machinery/light_switch/@SUBTYPES {pixel_y=@UNSET;pixel_x=@NEGATIVE} : @OLD{@OLD;dir=4} +/obj/machinery/light_switch/@SUBTYPES {pixel_x=@UNSET;pixel_y=@NEGATIVE} : @OLD{@OLD;dir=1} \ No newline at end of file diff --git a/tools/mapmerge2/update_paths.py b/tools/mapmerge2/update_paths.py index 8c3039d8798..0e34bbd7765 100644 --- a/tools/mapmerge2/update_paths.py +++ b/tools/mapmerge2/update_paths.py @@ -91,6 +91,22 @@ def replace_def(match): else: return [match.group(0)] else: + if old_path_props[filter_prop] == "@SET": + continue + if old_path_props[filter_prop] == "@NEGATIVE": + try: + if float(old_props[filter_prop]) < 0: + continue + return [match.group(0)] + except ValueError: + return [match.group(0)] + if old_path_props[filter_prop] == "@POSITIVE": + try: + if float(old_props[filter_prop]) > 0: + continue + return [match.group(0)] + except ValueError: + return [match.group(0)] if old_props[filter_prop] != old_path_props[filter_prop] or old_path_props[filter_prop] == "@UNSET": return [match.group(0)] #does not match current filter, skip the change. if verbose: diff --git a/~code/global_init.dm b/~code/global_init.dm index 3dee544e61a..00301af2ca2 100644 --- a/~code/global_init.dm +++ b/~code/global_init.dm @@ -14,7 +14,7 @@ var/global_init = new /datum/global_init() /datum/global_init/New() - load_configuration() + SSconfiguration.load_all_configuration() callHook("global_init") qdel(src) //we're done